js实现瀑布流效果

        瀑布流是我们在网站中经常见到的效果,比如像花瓣网等一些素材网站最常见。今天就一起来实现瀑布流效果吧!效果如下:

1682240241000

        整体逻辑就是我们把图片宽度写死,然后计算以body的宽度可以放下n张图片,然后创建一个长度为n的数组,初始值为0,这个数组的作用简单来说,就是计算每列图片的高度,然后每次放置图片的时候,去找该数组中最小值,也就是哪列高度最小就把图片放在哪列,然后更新数组对应下标的值。

html代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        body {
            padding: 0;
            margin: 0;
        }
        .waterBox{
            width: 100%;
            position: relative;
        }
        .item{
            position: absolute;
            width: 200px;
            margin: 5px;
            transition: all 1s;
            border: 1px solid #ccc;
        }
    </style>
</head>
<body>
    <div class="waterBox">
        <img src="./imgs/2D8EBE2E5B7AC941C58F89F2FA885228.jpg" title="1" class="item"/>
        <img src="./imgs/0F85CFEDD84968400A3FF6391070A2EE.jpg" title="2" class="item"/>
        <img src="./imgs/409CA99724AAEEBA1E2BAF4C946BE951.jpg" title="3" class="item"/>
        <img src="./imgs/4550635111B1948D0EC1C256577C6B1E.jpg" title="4" class="item"/>
        <img src="./imgs/pic5.webp" title="5" class="item"/>
        <img src="./imgs/pic6.jpg" title="6" class="item"/>
        <img src="./imgs/pic7.webp" title="7" class="item"/>
        <img src="./imgs/7AF4AE19F191DC8A99742C42041A38DD.jpg" title="8" class="item"/>
        <img src="./imgs/pic8.webp" title="9" class="item"/>
        <img src="./imgs/CE1720BD3E42C5D3FFCF13C8BB8A1793.jpg" title="10" class="item"/>
        <img src="./imgs/pic1.webp" title="11" class="item">
        <img src="./imgs/pic2.webp" title="12" class="item">
        <img src="./imgs/pic3.webp" title="13" class="item">
        <img src="./imgs/pic4.jpeg" title="14" class="item">
    </div>
    <script src="./test.js"></script>
</body>
</html>

js代码如下:

function waterFall(){
    //获取所有的图片
    let items=document.querySelectorAll('.item');

    //创建记录每列高度的数组
    let lenArr=[];
    let bodyWidth=document.body.offsetWidth;
    let itemWidth=items[0].offsetWidth

    //计算一行可以放几张图片
    let num=parseInt(bodyWidth/itemWidth)
    //初始化数组为0,意思是刚开始时还没放图片,每列高度均为0
    for(let i=0;i<num;i++){
        lenArr.push(0)
    }

    //遍历所有图片,寻找高度中最小的列进行放置
    items.forEach(item=>{
        let minHeight=lenArr[0]
        let index=0

        //计算出高度最小的列
        for(let i=0;i<lenArr.length;i++){
            if(minHeight>lenArr[i]){
                minHeight=lenArr[i]
                index=i  
            }
        }

        //放置图片,top就等于该列的高度,left就等于图片的宽度*索引值,并更新数组对应下标的值(主要是加上新放置图片的高度)
        item.style.top=minHeight+'px'
        item.style.left=(itemWidth*index)+'px';
        lenArr[index]=(item.offsetHeight+lenArr[index])
    })
}

//图片加载较为缓慢,如果直接调用waterFall函数,不放在onload里面的话,可能导致有些图片的高度无法获取到,可以自己试一试
window.onload = () => {
    waterFall()
}

//让图片布局可根据窗口大小的变化而变化
window.onresize = () => {
    waterFall()
}

        主要需要注意的是把waterFall函数的调用放在onload里面,我写的时候直接调用导致后面的图片获取到的高度一直是1,这里是个值得注意的点!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
jQuery实现瀑布流效果需要先引入jQuery库,然后通过计算每个元素的位置和高度,来实现元素的动态排列。 以下是一个简单的示例代码HTML部分: ```html <div id="waterfall"> <div class="item">item1</div> <div class="item">item2</div> <div class="item">item3</div> <div class="item">item4</div> <div class="item">item5</div> <div class="item">item6</div> </div> ``` CSS部分: ```css #waterfall { width: 800px; /* 瀑布流容器宽度 */ margin: 0 auto; } .item { width: 380px; /* 每个元素宽度 */ margin: 10px; float: left; background-color: #eee; } ``` jQuery部分: ```javascript $(function() { // 获取瀑布流容器的宽度 var containerWidth = $('#waterfall').width(); // 获取每个元素的宽度和间距 var itemWidth = $('.item').outerWidth(true); // 计算列数 var cols = Math.floor(containerWidth / itemWidth); // 创建一个数组用于存放每一列的高度 var heightArr = []; for (var i = 0; i < cols; i++) { heightArr.push(0); } // 遍历每个元素 $('.item').each(function() { // 获取元素的高度 var itemHeight = $(this).outerHeight(true); // 找到高度最小的那一列 var minHeight = Math.min.apply(null, heightArr); var minIndex = $.inArray(minHeight, heightArr); // 设置元素的位置 $(this).css({ 'left': minIndex * itemWidth, 'top': minHeight }); // 更新该列的高度 heightArr[minIndex] += itemHeight; }); }); ``` 上述代码实现了一个简单的瀑布流效果,可以根据实际需求进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值