- vừa được xem lúc

Scroll Infinite Nextjs 14 with SCSS, Loadmore

0 0 14

Người đăng: huyi

Theo Viblo Asia

demo code: https://abi.sshop.live/masonry

Dùng thư viện bạn sẽ bị hạn chế về chiều cao của phần tử. ví dụ như masonry hình ảnh, .... Tui đã thử với số lượng lớn items : 9999 thì thư viện cũng không load nỗi image.png dùng SCSS để giải quyết: nhiêu code đây là đủ

.isScrolling { position: absolute; top: 0; bottom: 0; left: 0; right: 0; overflow: auto;
}

Cách dùng:

'use client';
import { filter, map, slice } from 'lodash';
import { CSSProperties, Fragment, Suspense, memo, useEffect, useMemo, useState,
} from 'react';
import styles from './styles.module.scss'; export default memo(function Test() { const [limit, setLimit] = useState(50); const column = 5; const list = map(Array.from({ length: 9999 }).fill(0), (_, idx) => { return { label: idx, image: 'https://source.unsplash.com/random?t=' + idx, }; }); const columnItems = Array.from({ length: column }, (_, colIndex) => filter(slice(list, 0, limit), (_, index) => index % column === colIndex) ); const handleScroll = () => { const boxList = document.getElementById('cover'); const listItem = document.getElementById('list'); if (boxList && listItem) { if ( boxList.scrollTop + boxList.clientHeight >= listItem.offsetHeight ) { setLimit((prev) => prev + 150); } } }; useEffect(() => { window.addEventListener('wheel', handleScroll); return () => { window.removeEventListener('wheel', handleScroll); }; }, [handleScroll]); return ( <div className={styles.Container}> <div className={styles.block}> <div className={styles.isScrolling} id="cover"> <ul id="list" className={styles.list} style={{ '--column': column } as CSSProperties} > {map(columnItems, (column, columnID) => { return ( <Fragment key={columnID}> <Suspense fallback={<p>Loading...</p>}> <RenderColumn column={column} /> </Suspense> </Fragment> ); })} </ul> </div> </div> </div> );
}); const RenderColumn = memo(({ column }: { column: any[] }) => { return ( <li className={styles.column}> {map(column, (row, rowID) => { return ( <Fragment key={rowID}> <Suspense fallback={<p>Loading...</p>}> <RenderRow row={row} /> </Suspense> </Fragment> ); })} </li> );
}); const RenderRow = memo(({ row }: any) => { return ( <div className={styles.row}> <Suspense fallback={<p>Loading...</p>}> {useMemo( () => ( <RenderItem item={row} /> ), [row] )} </Suspense> </div> );
}); const RenderItem = memo(({ item }: any) => { return ( <div className={styles.card}> <picture> <img src={item.image} alt="" /> </picture> <p>label: {item.label}</p> </div> );
}); 

SCSS cho nó:

.Container { padding: 1rem; display: flex; flex: 1; .block { position: relative; display: flex; flex: 1; margin: -1rem; $gap: 1rem; .list { $column: var(--column); padding: 1rem; width: 100%; list-style: none; display: flex; gap: $gap; .column { width: calc(100% / $column - $gap * (($column - 1) / $column)); display: flex; flex-direction: column; gap: $gap; .row { .card { padding: 1rem; box-shadow: 0px 2px 8px 0px rgba(0, 0, 0, 0.1); border-radius: 0.5rem; picture { img { width: 100%; border-radius: 0.5rem; object-fit: cover; object-position: center; } } } } } } }
}

Bình luận

Bài viết tương tự

- vừa được xem lúc

[Front-end Developer] Một vài mẹo để viết code CSS chuyên nghiệp hơn

Để tiếp tục với phần 1 của bài viết [Front-end Developer] Viết CSS sao cho chuẩn không cần chỉnh thì ở bài viết này mình xin chia sẻ một vài bí kíp nữa để chúng ta có thể nâng cao trình độ CSS của bản thân lên một tầm mới =)). 1.

0 0 37

- vừa được xem lúc

[Front-end Developer] Viết CSS sao cho chuẩn không cần chỉnh

Đôi nhời phát biểu. Trong quá trình phát triển các sản phẩm phần mềm, mình thấy việc chú ý đến code conventions(các nguyên tắc chung khi lập trình làm cho code dễ hiểu, dễ đọc và dễ bảo trì) khá là quan trọng.

0 0 29

- vừa được xem lúc

Những lý do khiến mình thích CSS custom properties hơn SASS variables?

Halo các bạn,. Lại là mình với một bài post liên quan tới chủ đề Front-end đây Mình còn nhớ hồi mình bắt đầu tìm hiểu và bị SASS lôi cuốn, mình đã nghĩ rằng mình sẽ chẳng bao giờ cần dùng đụng tới CSS

0 0 86

- vừa được xem lúc

Build Blog Post Card with Animation Using HTML SCSS JavaScript

Build Blog Post Card with Animation Using HTML SCSS JavaScript. . In this video, we will make blog post card with animation using HTML, SCSS and JavaScript. .

0 0 31

- vừa được xem lúc

Giỏi nhanh CSS Flexbox

Giới thiệu. Chào toàn thể Anh Chị Em của cộng đồng Viblo .

0 0 49

- vừa được xem lúc

Cấu trúc thư mục với SASS

Khi một project phát triển và mở rộng, việc mô-đun hoá và cấu trúc là thiết yếu. Vì vậy việc tổ chức tệp tin và folder là việc cần thiết mặc dù không có cấu trúc nào "hoàn toàn chính xác" mà nó phụ th

0 0 72