diff --git a/src/assets/stylesheets/project.scss b/src/assets/stylesheets/project.scss index b33d0fa..920ceeb 100644 --- a/src/assets/stylesheets/project.scss +++ b/src/assets/stylesheets/project.scss @@ -32,7 +32,7 @@ justify-content: start; } .projects__title { - margin: 20px 0 0 20px; + margin: 20px 0 20px 20px; font-family: itrFontMedium; color: #fff; } @@ -47,8 +47,10 @@ width: 100vw; height: auto; display: flex; + flex-direction: column; justify-content: center; align-items: center; + padding-top: 24px; } .project__content__main__container { diff --git a/src/assets/stylesheets/waterfall.scss b/src/assets/stylesheets/waterfall.scss index e214aad..ec50dd3 100644 --- a/src/assets/stylesheets/waterfall.scss +++ b/src/assets/stylesheets/waterfall.scss @@ -1,8 +1,7 @@ -.waterfall_outer { +.waterfallContainer { display: flex; - flex-direction: row; flex-wrap: wrap; - .waterfall_column { - width: 40%; + .waterfallItem { + margin: 3px; } } \ No newline at end of file diff --git a/src/components/Projects.js b/src/components/Projects.js index 9682c89..848522e 100644 --- a/src/components/Projects.js +++ b/src/components/Projects.js @@ -1,11 +1,10 @@ -import React, { useEffect, useMemo } from "react"; -import { AnimationOnScroll } from "react-animation-on-scroll"; +import React, { forwardRef, useEffect, useMemo } from "react"; import "../assets/stylesheets/project.scss"; import { useContainer } from "unstated-next"; import GlobalStore from "../store/global"; import { Image } from "antd"; import projects from "../assets/data/projects"; -import WaterfallPositionDemo from "./Waterfall"; +import WaterfallPosition from "./Waterfall"; const Project = () => { useEffect(() => { @@ -26,67 +25,14 @@ const Project = () => {
- {/* { - return { - itemRender: ( -
-

- {item.title} -

-
- - {item.content} -
-
- ), - }; - })} - /> */} - +

Active Projects

-
- {projects.active.map((item) => ( -
-

- {item.title} -

-
- - {item.content} -
-
- ))} -
+ +
+

Retired/Inactive Projects

-
- {projects.inactive.map((item) => ( -
-

- {item.title} -

-
- - {item.content} -
-
- ))} -
- + +
{/* */}
diff --git a/src/components/Waterfall.js b/src/components/Waterfall.js index 9a38fa0..28d3a95 100644 --- a/src/components/Waterfall.js +++ b/src/components/Waterfall.js @@ -1,121 +1,92 @@ -import { - useDebounce, - useDebounceFn, - useSetState, - useSize, - useThrottle, - useThrottleFn, -} from "ahooks"; -import React, { useRef, useEffect } from "react"; +import { useSize } from "ahooks"; +import React, { useRef, useEffect, useState } from "react"; import "../assets/stylesheets/waterfall.scss"; +import { Image } from "antd"; -const defimages = [ - "https://picsum.photos/640/200/?random", - "https://picsum.photos/360/640/?random", - "https://picsum.photos/480/720/?random", - "https://picsum.photos/480/640/?random", - "https://picsum.photos/360/?random", - "https://picsum.photos/360/520/?random", - "https://picsum.photos/520/360/?random", - "https://picsum.photos/520/360/?random", - "https://picsum.photos/520/360/?random", - "https://picsum.photos/720/640/?random", -]; - -const Item = ({ itemRender, onSize }) => { - const itemRef = useRef(); - const size = useSize(itemRef.current); +const WaterfallItem = ({ data, onLoad }) => { + const ref = useRef(); + const size = useSize(ref); + const sizeRef = useRef({}); useEffect(() => { - onSize(size); + sizeRef.current.size = size; }, [size]); - return
{itemRender}
; + return ( +
+
+

{data.title}

+
+ { + setTimeout(() => { + onLoad(sizeRef.current.size); + }, 500); + }} + alt="asd" + onError={setTimeout(() => { + onLoad(sizeRef.current.size); + }, 500)} + width={"100%"} + src={data.img} + /> + {data.content} +
+
+
+ ); }; -export default function WaterfallPositionDemo({ columnNumber, list }) { - const [columns, setColumns] = useSetState( - new Array(columnNumber).fill(0).map((item) => []) - ); - const listRef = useRef(list); - // useEffect(() => { - // listRef.current = list; - // }, [list]); - useEffect(() => { - // fill the columns - const initColumns = new Array(columnNumber).fill(0).map((item) => []); - list.forEach((item, index) => { - item.size = { - width: 0, - height: 0, - }; - item.index = index; - const i = index % columnNumber; - initColumns[i].push(item); - }); - listRef.current = list; - setColumns(initColumns); - }, []); - const onSizeRef = useRef(null); - const onSize = ({ item: itm, columnIndex: key, index, size }) => { - if (onSizeRef.current) { - return; +const WaterfallPosition = ({ columnNumber, list }) => { + const stateRef = useRef({ + heights: [], + loadNum: 0, + }); + const onload = (index, height) => { + stateRef.current.heights[index] = height; + stateRef.current.loadNum++; + if (stateRef.current.loadNum === list.length) { + onSize(); } - onSizeRef.current = true; - if (itm && size && listRef.current[itm.index]) { - listRef.current[itm.index].size = size; - } - const initColumns = new Array(columnNumber).fill(0).map((item) => []); - const heights = new Array(columnNumber).fill(0).map((item) => 0); - console.log("listRef.current", listRef.current.length); - listRef.current.forEach((item, index) => { - let i = 0; + }; + const [columns, setColumns] = useState([[], [], [], []]); + const onSize = () => { + let res = [[], [], [], []]; + let columnHeights = [0, 0, 0, 0]; + rendered.map((renderItem, index) => { let minHeight = Infinity; - for (let tmpI = 0; tmpI < heights.length; ++tmpI) { - if (heights[tmpI] < minHeight) { - minHeight = heights[tmpI]; - i = tmpI; + let minHeightIndex = 0; + for (let i = 0; i < columnNumber; ++i) { + if (minHeight > columnHeights[i]) { + minHeight = columnHeights[i]; + minHeightIndex = i; } } - console.log("minHeight", minHeight, i); - heights[i] += item?.size?.height || 0; - initColumns[i].push(item); + res[minHeightIndex].push(renderItem); + columnHeights[minHeightIndex] += stateRef.current.heights[minHeightIndex]; }); - setColumns(initColumns); - - console.log("minHeight", initColumns); - onSizeRef.current = false; + setColumns(res); }; - const columnsDebounce = useDebounce(columns, { - wait: 50, - }); + const waterfallDOM = useRef(); + const size = useSize(waterfallDOM); + useEffect(() => { + onSize(); + }, [size, columnNumber]); + const rendered = list.map((item, index) => ( + onload(index, size.height)} data={item} /> + )); return ( -
- {Object.keys(columnsDebounce).map((key) => { - const item = columnsDebounce[key]; +
+ {columns.map((column) => { return (
- {item.map((itm, index) => { - return ( - - onSize({ - item: itm, - columnIndex: key, - index, - size, - }) - } - /> - ); - })} + {column}
); })}
); -} +}; +export default WaterfallPosition;