css+js瀑布流布局实现

这篇具有很好参考价值的文章主要介绍了css+js瀑布流布局实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

记录一个瀑布流布局问题的解决过程

最开始使用js实现,将子元素进行绝对定位,根据宽高及顺序判断定位的top与left

问题:存在新增子元素页面加载不及时的问题,会出现子元素初始状态叠加在一起,计算完成后才能正常显示。

点击查看代码
window.onload = () => {
  /* 传入waterfall与pic节点,调用函数waterFall */
  waterFall('.waterfall', '.cases-item')
}
// column每行个数
// lineSpace列间距
// rowSpace行间距

function waterFall(waterfall, pic, marginTop=20,lineSpace = 0, rowSpace = 40) {
  let column=3
  let win_w=$(window).width();
  if(win_w>1200){
    column=3
  } else  if(win_w<=1200&&win_w>600){
    column=2
  }
  /*waterfallWidth可视窗口waterfall的宽度  */
  var waterfallWidth = document.querySelector(waterfall).offsetWidth
  /* 计算每个pic的宽度 */
  var line = (column - 1) * lineSpace
  var picWidth = parseInt((waterfallWidth - line) / column)
  /* 获取所有pic节点 */
  var picNode = document.querySelectorAll(pic)
  /* 通过for循环完成瀑布流的设置 */
  var picArr = []
  for (var i = 0; i < picNode.length; i++) {
    /* 设置每一个pic的宽度 */
    picNode[i].style.width = picWidth + 'px'
    /* 获取每一个pic的高 */
    // console.log('picNode[i]',picNode[i],picNode[i].clientHeight)
    var picHeight = picNode[i].clientHeight
    /* 通过判断,区分第一行和非第一行 */
    if (i < column) {
      /* 给第一行的进行定位 */
      picNode[i].style.top = marginTop
      picNode[i].style.left = (picWidth + lineSpace) * i+ 'px'
      /* 将获取的pic的高push到一个数组记录下来 */
      picArr.push(picHeight)
      // console.log('picHeight',picHeight)
    }else{
      /* 在非第一行中,找到数组的最小值 */
      var picArrMin=Math.min(...picArr)
      // console.log(picArrMin);
      /* 获取最小值的索引 */
      var mixIndex=picArr.indexOf(picArrMin)
      // console.log(mixIndex);
      /* 对非第一行的pic进行定位,top为最小值的高,left为pic宽加行间距乘以最小值的索引 */
      picNode[i].style.top=(picArrMin+rowSpace+marginTop+marginTop)+'px'
      picNode[i].style.left=(picWidth+lineSpace)*mixIndex+'px'
      /* 对数组中的最小值进行修改 */
      picArr[mixIndex]+=picHeight+rowSpace
    }
  }
  const boxH=Math.max(...picArr)
  $(waterfall).css({height:boxH+'px'})
}


再次尝试使用css中的column(多列布局)实现简单的瀑布流排版。
问题:元素默认为竖向排版,新增子元素不是在最下方更新,用户体验不好。

<div class="waterfall">
    <div class="item">内容</div>
    <div class="item">内容</div>
    <div class="item">内容</div>
    <div class="item">内容</div>
    <div class="item">内容</div>
    <div class="item">内容</div>
    <div class="item">内容</div>
</div>

css

.waterfall{
  column-count: 3;//几列
  column-gap: 10px;//间距
  .item{
    display: inline-block;
    width: 100%;
  }
}

再次更换为另一种方法,使用flex布局实现,结合css中的:nth-child() 和 order属性,将子元素横向排列。
需要为父元素固定高度,才能达到效果,最终使用flex布局,结合js为父元素的高度赋值,解决了问题。
当添加子元素时,再次调用获取高度方法,更新父元素高度即可。

布局同上
css

.waterfall{
  display: flex;
  /* 让内容按列纵向展示 */
  // flex-flow: column wrap;
  flex-direction:column;
  flex-wrap: wrap;
  height: 5000px;//初始高度,防止在脚本未加载时布局错乱
  /* 强制使内容块分列的隐藏列 */
  &::before,
  &::after {
    content: "";
    flex-basis: 100%;
    width: 0;
    order: 2;
  }
  /* 重新定义内容块排序优先级,让其横向排序 */
  &.three{//三列
    &:nth-child(3n+1) { order: 1; }
    &:nth-child(3n+2) { order: 2; }
    &:nth-child(3n)   { order: 3; }
  }
  &.two{//两列
    &:nth-child(2n+1) { order: 1; }
    &:nth-child(2n) { order: 2; }
  }
}

js

function getListHeight(){
  //获取当前子项list
  let list=document.getElementsByClassName("item")
  if(list&&list.length>0){
    const heightArr=[0,0,0]
    //按顺序获取每列的高度
    for(let i=0;i<list.length;i++){
      if(i%3===0)heightArr[0]+=list[i].offsetHeight
      if(i%3===1)heightArr[1]+=list[i].offsetHeight
      if(i%3===2)heightArr[2]+=list[i].offsetHeight
    }
    //取最大值为父元素设置高度
    const maxHeight=Math.max(...heightArr)+50
    $(".waterfall").css({height:maxHeight+'px'});
  }else{
    //没有子项则重置高度
    $(".waterfall").css({height:'auto'});
  }
}

以上就是全部解决过程,文中flex布局方式参考了如下文章,感谢分享
https://www.cnblogs.com/xiaoxiaomini/p/17240258.html文章来源地址https://www.toymoban.com/news/detail-760438.html

到了这里,关于css+js瀑布流布局实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • css3瀑布流布局遇见截断下一列展示后半截现象

    注:css3实现瀑布流布局简直不要太香~~~~~ 包括分割线的颜色、样式、宽度。其语法格式为: column-rule: column-rule-width || column-rule-style || column-rule-color 简单的例子: 这里就不给实例了,感兴趣的可以自己去尝试一下

    2024年02月13日
    浏览(39)
  • css3 瀑布流布局遇见截断下一列展示后半截现象

    注:css3实现瀑布流布局简直不要太香~~~~~ 当瀑布流布局column-grap:10px 相邻两列之间的间隙为10px,column-count:2,2列展示时,就出现了截断问题,如下图: 代码如下: 修改后的代码如下: 包括分割线的颜色、样式、宽度。其语法格式为: column-rule: column-rule-width || column-

    2024年02月13日
    浏览(31)
  • 【CSS】CSS 布局——常规流布局

    三栏布局:左右定宽,中间自适应。 左右浮动,中间自适应 绝对定位 flexbox布局

    2024年02月12日
    浏览(42)
  • 实现瀑布流布局的四种方法

    页面上是一种 参差不齐 的多栏布局,类似上图所示随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部,大部分为图片,图片 固定 宽度,高度 不一 ,根据原比例缩放到宽度达到固定的要求,每行排满后,新的图片添加到后面 固定宽度,高度不一 岑

    2023年04月15日
    浏览(59)
  • vue3实现瀑布流布局组件

    先看效果图 直接上代码 utils.js data.js 模拟后台返回的数据 瀑布流布局组件 waterfall.vue 使用该组件(这里 columns 写死了3列) 若要响应式调整列数,可参考以下代码 瀑布流布局组件监听 columns 变化

    2024年02月21日
    浏览(51)
  • 微信小程序实现吸顶、网格、瀑布流布局

    微信小程序开发通常是在webview模式下编写,但是对小程序的渲染性能有一定的追求,就需要使用Skyline模式进行渲染,同时在这种模式下有也有一些特殊的组件,可以轻松的实现想要的效果,本文将介绍在Skyline模式下如何实现吸顶、网格、瀑布流布局。 以下是具体的实现:

    2024年02月22日
    浏览(59)
  • 微信小程序实现瀑布流布局(方式一)

    根据奇数列和偶数列区分左边和右边数据 设置width固定,mode=“widthFix” 适用于:左右两列的高度相差不是很大

    2024年02月12日
    浏览(37)
  • HTML5+CSS3学习笔记(九)前端页面六大布局(文档流布局、浮动布局、定位布局、表格布局、弹性布局、网格布局)

    本系列更多文章,可以查看专栏 HTML+CSS学习笔记 块级元素自上至下垂直排列,行内元素自左至右水平排列 块级元素独占一行,行内元素不会另起一行 默认情况下,height和width决定内容区的大小;内容区、内边距和边框构成可见区域的大小;外边距决定元素的位置 更多内容可

    2024年02月02日
    浏览(61)
  • 微信小程序瀑布流布局

    2024年02月07日
    浏览(51)
  • 如何使用CSS实现一个自适应等高布局?

    前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将为你提供一

    2024年02月10日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包