当前位置: 首页 > Web前端 > HTML

5种瀑布流场景的实现原理分析

时间:2023-03-28 12:36:35 HTML

一、背景本文介绍了5种瀑布流场景的实现,大家可以根据自己的需要进行选择。五种场景分别是:瀑布特性垂直+高度排序纯CSS多列实现,这是最简单的瀑布写法垂直+高度排序+根据宽度自适应列通过JS根据屏幕宽度计算列数,这在web端更方便灵活展示瀑布流水平纯CSS弹性布局实现,是最简单的水平瀑布流写法水平+高度排序水平+高度排序瀑布流,需要通过JS计算每一列的高度,loss的性能,但可以避免列太长的情况,体验更好。横向+高度排序+根据宽度自适应列号需要通过JS计算每列的高度,根据屏幕宽度计算列数,损失性能,但可以避免某些情况column特别长,可以在web端展示,在终端展示瀑布流更灵活,体验更好。是五种瀑布流中用户体验最好的。我将这五个场景的实现打包成npm包。npm包地址:https://www.npmjs.com/package...,可直接在React项目中安装使用。2.引入瀑布流,这是一种流行的网站页面布局。视觉表现是不均匀的多栏布局。随着页面滚动条的向下滚动,这个布局会不断加载数据块,并追加到当前的尾部。下图是一个瀑布流布局的示意图:3.垂直+高度排序垂直+高度排序是指每列垂直排列,内容添加到高度最小的列,如下图。实现垂直+高度排序瀑布流的方式是CSS多栏布局。一、多栏布局介绍多栏布局是指CSS3可以像报纸一样设计文本内容的多栏布局,如下例所示:CSS3多栏属性:column-count:指定个数要划分的列;column-gap:指定列之间的间隙;column-rule-style:指定列之间的边框样式;column-rule-width:指定两列的边框粗细;column-rule-color:指定两列的边框颜色;column-rule:column-rule-*所有属性的简写;column-span:指定元素跨越多少列;column-width:列宽。2、实现思路瀑布流的实现思路是:利用CSScolumn-count将内容划分到指定的列;使用CSSbreak-inside确保每个子元素在包装之前呈现;3.实现code.css-column{column-count:4;//分成4列}.css-columndiv{break-inside:avoid;//确保每个子元素在包装前都被渲染}4.直接使用npm包npm-react-masonry-component2:import{Masonry}from'react-masonry-component2'exportconstMyComponent=(args)=>{return(

)}在线预览4.垂直+高度排序+自适应列号根据宽度在垂直+高度排序的基础上,列数根据宽度自适应。1.实现idea监控的resize方法,根据屏幕宽度获取屏幕宽度下应该显示的列数2.实现代码import{useCallback,useEffect,useMemo,useState}from'react'import{DEFAULT_COLUMNS_COUNT}from'../const'exportconstuseHasMounted=()=>{const[hasMounted,setHasMounted]=useState(false)useEffect(()=>{setHasMounted(true)},[])returnhasMounted}exportconstuseWindowWidth=()=>{consthasMounted=useHasMounted()const[width,setWidth]=useState(0)consthandleResize=useCallback(()=>{if(!hasMounted)returnsetWidth(window.innerWidth)},[hasMounted])useEffect(()=>{if(hasMounted){window.addEventListener('resize',handleResize)handleResize()return()=>window.removeEventListener('resize',handleResize)}},[hasMounted,handleResize])returnwidth}exportconstuseColumnCount=(columnsCountBreakPoints:{[props:number]:number})=>{constwindowWidth=useWindowWidth()constcolumnCount=useMemo(()=>{constbreakPoints=(Object.keys(columnsCountBreakPointsasany)asunknownasnumber[]).sort((a:number,b:number)=>a-b)让count=breakPoints。长度>0?columnsCountBreakPoints![breakPoints[0]]:DEFAULT_COLUMNS_COUNTbreakPoints.forEach((breakPoint)=>{if(breakPoint{children}
)3.直接使用npm包npm-react-masonry-component2:import{Masonry}from'react-masonry-component2'exportconstMyComponent=(args)=>{return(<砌体方向='柱'columnsCountBreakPoints={{1400:5,1000:4,700:3,}}>
)}在线预览5.Horizo??ntal水平瀑布流是指每一列水平排列,如下图,实现水平瀑布流的方法是CSS弹性布局。1.FlexibleLayout简介FlexibleLayout是一种在页面需要适应不同的屏幕尺寸和设备类型时,保证元素正确行为的布局方式。引入flexbox布局模型的目的是提供一种更有效的方式来为容器中的子元素排列、对齐和分配空白。CSS3的弹性布局属性:flex-dicreation:指定弹性子元素的排列方式;justify-content:指定弹性布局的主轴对齐方式;align-items:指定弹性布局的侧轴对齐方式;flex-wrap:指定柔性子元素的包裹方式;align-content:指定灵活布局每一行的对齐方式;order:指定灵活子元素的排列顺序;align-self:指定灵活子元素的垂直对齐方式;flex属性用于指定灵活地为子元素分配空间的方式;auto:计算值为11autoinitial:计算值为01autonone:计算值为00autoinherit:从父元素继承[flex-grow]:定义弹性盒子元素的扩展比例。[flex-shrink]:定义flexbox元素的收缩比例。[flex-basis]:定义弹性框元素的默认基值。2.实现思路瀑布流的实现思路是:CSS灵活布局,水平排列4列,垂直排列每列。3.实现代码瀑布实现代码如下:
.masonry-flex-wrap{显示:flex;弹性方向:行;证明内容:居中;对齐内容:拉伸;&-column{显示:'flex';弹性方向:“列”;证明内容:'flex-start';对齐内容:“拉伸”;弹性:1;}}4。直接使用npmpackagenpm-react-masonry-component2:import{Masonry}from'react-masonry-component2'exportconstMyComponent=(args)=>{return(
)}在线预览6.水平+高度排序水平+高度排序是指每一列水平排列,高度为smallest在列中添加内容,如下图,高度排序需要用JS逻辑来完成。1、实现思路JS将瀑布列表按照高度划分为指定列数。例如,如果瀑布有4个列,则将瀑布列表分成4个列表。2.执行代码,()=>({height:0,children:[],}))React.Children.forEach(children,(child:React.ReactNode,index)=>{if(child&&React.isValidElement(child)){如果(indexa.height)as{height:numberchildren:React.ReactNode[]}minHeightColumn.children.push(child)minHeightColumn.height+=child.props.height}})返回列}3.直接使用npm包npm-react-masonry-component2:import{Masonry,Masonry即可em}from'react-masonry-component2'exportconstMyComponent=(args)=>{return(
)}在线预览7.水平+高度排序+根据宽度自适应列数根据宽度自适应列数的方式和垂直场景是一致的。它们都是监控调整大小的方法。根据屏幕宽度,应该显示宽度列数,这里不再赘述1.直接使用npm包npm-react-masonry-component2:import{Masonry}from'react-masonry-component2'exportconstMyComponent=(args)=>{return(
)}在线预览摘要本文介绍5种瀑布流场景的实现:垂直+高度排序垂直+高度排序+根据宽度自适应列数水平+高度排序水平+高度排序+根据宽度自适应列数有兴趣的同学可以去项目源代码查看完整的实现代码。也可以直接下载使用。多思考当瀑布数据较多时,dom节点过多,会影响页面性能。那么需要在瀑布流中加入滚动预加载和节点回收功能进行优化。下个版本会更新滚动预加载和节点回收功能。节点恢复功能的实现原理。