iis服务器助手广告广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >js原生瀑布流插件制作
  • 266
分享到

js原生瀑布流插件制作

2024-04-02 19:04:59 266人浏览 薄情痞子
摘要

本文实例为大家分享了js原生瀑布流插件制作的具体代码,供大家参考,具体内容如下 先看效果 和普通的瀑布流是一样的,在调用时制需要传入容器,图片以及图片宽度即可直接生成瀑布流 话不多

本文实例为大家分享了js原生瀑布流插件制作的具体代码,供大家参考,具体内容如下

先看效果

和普通的瀑布流是一样的,在调用时制需要传入容器,图片以及图片宽度即可直接生成瀑布流

话不多说,看代码,后面说一下思路

1.html以及调用,其中HTML只需要一行


<body>
    <div class="main"></div>
 
    <script src="index.js"></script>
    <script>
        // 第一个参数,瀑布流容器
        var dom = document.getElementsByClassName("main")[0];
        // 第二个参数,图片链接,写入一个数组
        var imgArr = ["img/0.jpg","img/45.jpg","img/225.jpg","img/3.png","img/7729.png","img/a.jpg","img/ama.jpg","img/c.png","img/0.jpg","img/3.png","img/45.jpg","img/225.jpg","img/7729.png","img/a.jpg","img/ama.jpg","img/c.png",];
        // 调用插件,传入参数,第三个是图片宽度
        waterFallFlow(dom,imgArr,220);
    </script>
</body>

2.HTML对应的CSS

.main是传入的容器,其中position: relative;是必须要的

然后.main img{transition: all 0.5s;}是动画代码,给容器内所有图片添加


.main{
    border: 1px solid #ccc;
    width: 90%;
    margin: 0 auto;
    position: relative;
}
.main img{
    transition: all 0.5s;
}

然后是js



function waterFallFlow(dom, imgArr, wid) {
    var gap;//间隙
    var colNumber;//列数
    imgDom();
    setImgPos();
    //窗口发生改变的时候
    window.onresize = function(){
        setImgPos();
    }
    
    // 生成DOM元素
    function imgDom() {
        for (let i = 0; i < imgArr.length; i++) {
            const url = imgArr[i];
            let img = document.createElement("img");
            img.src = url;
            img.style.width = wid + "px";
            img.style.position = "absolute";
            // 所有图片使用绝对定位
            img.style.left = "";
            img.style.top = "";
            img.onload = function(){
                setImgPos();//图片的异步加载
            }
            dom.appendChild(img);
        }
    }
    // 设置每张图片的坐标
    function setImgPos() {
        cal();
        var colY = new Array(colNumber);//存放每一列下一个图片的Y坐标
        colY.fill(0);//填充数组为0
        for (let i = 0; i < dom.children.length; i++) {
            var imgM = dom.children[i];
            var y = Math.min(...colY);//求最小值
            var index = colY.indexOf(y);//第几列
            var x = (index + 1) * gap + index * wid;
            imgM.style.left = x + "px";
            imgM.style.top = y + "px";
            //更新数组
            colY[index] += parseInt(imgM.height)+gap;
        }
        //找到数组中最大的数字,来解决父级div塌陷问题
        var h = Math.max(...colY);
        console.log(h);
        dom.style.height = h + "px";
    }
    // 计算相关数据
    function cal() {
        var containerWidth = parseInt(dom.clientWidth);
        colNumber = Math.floor(containerWidth / wid);//列数
        var space = containerWidth - colNumber * wid;
        gap = space / (colNumber + 1);//计算间隙
 
    }
}

基本上我都写了注释,都可以看懂

来看思路

1.接受传入的参数,容器,图片数组,图片宽度

2.创建图片元素,添加到对应容器中

3.给每个图片设置宽度,高度自适应,求列数,间距

4.给图片利用绝对定位来排布图片,计算对应的left和top值,也就是对应的x,y坐标

前三步应该没有问题,来看第四步

想法是这样的

主要思路就是寻找最短的一列来排布下一张图片,现在最短出现在第二列

这个时候图片添加到了之前最短的第二列,现在继续寻找最短的一列,继续添加图片

这样此类推完成瀑布流的排布,来看看具体过程

首先计算出一共有几列图片,创建一个长度为列数的数组,全部填充为0,用来后面存放y坐标

遍历容器内子元素,在循环中求出当前数组中最小值以及最小值所在位置(列数)就是y坐标

这个时候就可以求x坐标了

x = (列数+1)* 间距 + 当前列 * 宽度(传入的实参)

这样就有了位置

要注意每次需要更新一下数组,就是修改添加图片位置的y坐标,以及图片的异步加载

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: js原生瀑布流插件制作

本文链接: https://www.lsjlt.com/news/137354.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • js原生瀑布流插件制作
    本文实例为大家分享了js原生瀑布流插件制作的具体代码,供大家参考,具体内容如下 先看效果 和普通的瀑布流是一样的,在调用时制需要传入容器,图片以及图片宽度即可直接生成瀑布流 话不多...
    99+
    2024-04-02
  • 原生js怎么实现瀑布流布局
    这篇文章主要介绍原生js怎么实现瀑布流布局,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!用js实现瀑布流布局以及通过模拟的数据加载图片,已标记注释效果如图:<!DOCTYPE&...
    99+
    2024-04-02
  • js如何自定义瀑布流布局插件
    这篇文章主要介绍js如何自定义瀑布流布局插件,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!瀑布流布局是网页中经常采用的一种布局方式,其布局有如下特点:瀑布流布局特点: (1)图文元素...
    99+
    2024-04-02
  • js原生轮播图插件制作
    本文实例为大家分享了js原生轮播图插件制作的具体代码,供大家参考,具体内容如下 调用时也只需要写一个DIV即可 调用的js部分配置内容: 传入轮播图需显示的位置(div) 传入图...
    99+
    2024-04-02
  • 瀑布流插件sortableJs是什么
    今天就跟大家聊聊有关瀑布流插件sortableJs是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。今天跟大家分享一款瀑布流插件sortableJs。它是一款带排序功能的js ma...
    99+
    2023-06-19
  • Flutter瀑布流仿写原生的复用机制详解
    目录废话开篇:先看复用效果复用状态打印问题一、实现思路是什么?问题二、UI布局代码分析。总结废话开篇: iOS与android在实现列表界面的时候是有重用机制的,目的就是减少内存开销...
    99+
    2024-04-02
  • 原生ajax瀑布流的示例分析
    这篇文章主要介绍了原生ajax瀑布流的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。其中img文件夹中放入图片 1.jpg;2.jp...
    99+
    2024-04-02
  • Flutter瀑布流仿写原生的复用机制有什么用
    这篇文章主要介绍了Flutter瀑布流仿写原生的复用机制有什么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。废话开篇:iOS与android在实现列表界面的时候是有重用机制...
    99+
    2023-06-20
  • 原生JS实现图片轮播 JS实现小广告插件
    最近想用原生JS多实现一些小功能,现在写到博客里,大家可以借鉴,有问题欢迎指出。 轮播图 需求: 图片循环轮播,可点击左右切换,切换状态与<li>绑定,鼠标移入图片悬停,...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作