js 实现瀑布流

文章探讨了使用CSS的column-count属性和JavaScript实现瀑布流布局的局限性,并提供了JavaScript实现瀑布流的具体代码示例,包括计算元素宽度、设置容器宽度以及动态定位元素等步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

由于css实现瀑布流的两种方法都有一定的局限性,不能满足需求。

css 方法 最简单的是  给父元素 添加 column-count: xx   属性   xx 代表需要展示的列数。缺点是从后端拿到的数据会 以先 竖向排列 再横向排列。

js方法   

        

.content_main {    //这个父元素
    position: relative;
}


.module {  //需要排列的元素
    height: auto;
    position: absolute;
}

   let container = document.getElementById("content_main_id")

根据id 拿到父元素   

let item = document.getElementsByClassName("module")

根据class 拿到子元素  也就是需要需要排列的元素

                waterFall:function(){
                    // 1. 设置container盒子的宽度
                    //   注意:浏览器的可视区域的宽度 / 一个item元素的宽度 = 一行的排列的元素的个数
                    let container = document.getElementById("content_main_id")
                    let item = document.getElementsByClassName("module")
                    //获取元素的宽度(含border,padding)
                    let width = item[0].offsetWidth 
                    //计算出浏览器窗口的宽度
                    let clientWidth = document.documentElement.clientWidth;
                    //计算出应该放几列(向下取整)
                    let columnCount = Math.floor(clientWidth / width)
                    //设置容器(父盒子)的宽度
                    // container.style.width = columnCount*width+"px"

                    // 2.设置每一个item元素的排列位置
                    //  第一行整体的top值都是0 后面的依次找上一行高度最小的容器,在它下面进行排列
                    let hrr = []
                    for(let i= 0 ;i<item.length;i++){
                            //定位第一行的图片
                        if(i<4){   //需要展示几列
                            item[i].style.top = "0px"
                            if(i == 0){  //处理item的间隔
                                item[i].style.left = i* width+"px" 
                            }else{
                                item[i].style.left = (i* width+i*20)+"px" 
                            }
                            
                            hrr.push(item[i].offsetHeight)
                        }else{
                            //第一行之后的
                            //选择总高度最小的列
                            let min = Math.min(...hrr)
                            let index = hrr.indexOf(min)
                            //将每个元素定位到当前总高度最小的列下
                            min = min + parseInt(i/4)*20   //处理top值
                            
                            item[i].style.top = min+"px"
                            item[i].style.left = (index * width+ index*20)+"px" 
                            //当前定位的元素加入该列
                            hrr[index] += item[i].offsetHeight
                        }
                    }
                },

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值