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.实现代码瀑布实现代码如下: