js实现无限瀑布流

瀑布流

是一种常见的网页布局方式,在许多网站中我们都能看到“瀑布流”的效果,其特征是有网页视窗有多个高度不同宽度相同的“块”组成。因其样式酷似飞流直下的瀑布,

故将这种布局方式称为瀑布流。

生活中瀑布流实例:

花瓣网

在css中我们学习过使用Multi-columns来实现瀑布流的效果

通过 Multi-columns 相关的属性 column-countcolumn-gap 配合 break-inside 来实现瀑布流布局。

现在,我来介绍一下如何通过js方式来实现瀑布流

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .cont{
            margin: 0 auto;
            position: relative;
        }
        .box{
            float: left;
            padding: 6px;
        }
        .imgbox{
            border: 1px black solid;
            border-radius: 6px;
            padding: 6px;
        }
        .imgbox img{
            width: 200px;
            display: block;
        }
    </style>
    <script>
         onload = function () {
             new Waterfall();
         };
         function Waterfall() {
             this.ocont = document.querySelector(".cont");
             this.abox = document.querySelectorAll(".box");
             this.heightArr = [];
             this.init();

             //w1准备数据
             this.data = this.load();
             this.addScroll();
         }
         Waterfall.prototype.load = function(){
             return [{img:"images/1.jpg"},{img:"images/2.jpg"},{img:"images/3.jpg"},{img:"images/4.jpg"},{img:"images/5.jpg"},{img:"images/6.jpg"},{img:"images/7.jpg"},{img:"images/8.jpg"},{img:"images/9.jpg"},{img:"images/10.jpg"},]
         };
         Waterfall.prototype.addScroll = function(){
             var that = this;
             onscroll = function () {
                 if (that.isBottom()){
                     that.data.forEach(val=>{
                         var img = document.createElement("img");
                         img.src = val.img;
                         var imgbox = document.createElement("div");
                         imgbox.className = "imgbox";
                         var box = document.createElement("div");
                         box.className = "box";
                         imgbox.appendChild(img);
                         box.appendChild(imgbox);
                         that.ocont.appendChild(box);
                     });
                     that.abox = document.querySelectorAll(".box");
                     that.heightArr = [];
                     that.firstLine();
                     that.otherLine();
                 }
             }
         };
         Waterfall.prototype.isBottom = function(){
             var clientH = document.documentElement.clientHeight;
             var scrollT = document.documentElement.scrollTop;
             var scrollH = document.documentElement.scrollHeight;
             if (clientH + scrollT >= scrollH-200){
                 return true;
             }else{
                 return false;
             }
         };
         Waterfall.prototype.init = function () {
             this.num = Math.floor(document.documentElement.clientWidth/this.abox[0].offsetWidth);
             this.ocont.style.width = this.num*this.abox[0].offsetWidth+"px";
             //区分第一行
             this.firstLine();
             //区分最后一行
             this.otherLine();
         };
         Waterfall.prototype.firstLine = function () {
             for (var i=0;i<this.num;i++){
                 this.heightArr.push(this.abox[i].offsetHeight);
             }
         };
         Waterfall.prototype.otherLine = function () {
             for (var i=this.num;i<this.abox.length;i++){
                 var min = getMin(this.heightArr);
                 var minIndex = this.heightArr.indexOf(min);
                 //设置定位,left,top
                 this.abox[i].style.position = "absolute";
                 this.abox[i].style.top = min + "px";
                 this.abox[i].style.left = minIndex*this.abox[0].offsetWidth+"px";
                 this.heightArr[minIndex] += this.abox[i].offsetHeight;
             }
         };
         function getMin(arr) {
             var myarr = [];
             arr.forEach(val =>{
                 myarr.push(val);
             });
             return myarr.sort((a,b)=>a-b)[0];
         }
    </script>
</head>
<body>
<div class="cont">
    <div class="box">
    <div class="imgbox">
        <img src="images/4.jpg" >
    </div>
</div>
    <div class="box">
        <div class="imgbox">
            <img src="images/3.jpg" >
        </div>
    </div>
    <div class="box">
        <div class="imgbox">
            <img src="images/2.jpg" >
        </div>
    </div>
    <div class="box">
        <div class="imgbox">
            <img src="images/1.jpg" >
        </div>
    </div>
    <div class="box">
        <div class="imgbox">
            <img src="images/5.jpg" >
        </div>
    </div>
    <div class="box">
        <div class="imgbox">
            <img src="images/6.jpg" >
        </div>
    </div>
    <div class="box">
        <div class="imgbox">
            <img src="images/7.jpg" >
        </div>
    </div>
    <div class="box">
        <div class="imgbox">
            <img src="images/8.jpg" >
        </div>
    </div>
    <div class="box">
        <div class="imgbox">
            <img src="images/9.jpg" >
        </div>
    </div>
    <div class="box">
        <div class="imgbox">
            <img src="images/10.jpg" >
        </div>
    </div>
    <div class="box">
        <div class="imgbox">
            <img src="images/4.jpg" >
        </div>
    </div>
    <div class="box">
        <div class="imgbox">
            <img src="images/3.jpg" >
        </div>
    </div>
    <div class="box">
        <div class="imgbox">
            <img src="images/2.jpg" >
        </div>
    </div>
    <div class="box">
        <div class="imgbox">
            <img src="images/1.jpg" >
        </div>
    </div>
    <div class="box">
        <div class="imgbox">
            <img src="images/5.jpg" >
        </div>
    </div>
    <div class="box">
        <div class="imgbox">
            <img src="images/6.jpg" >
        </div>
    </div>
    <div class="box">
        <div class="imgbox">
            <img src="images/7.jpg" >
        </div>
    </div>
    <div class="box">
        <div class="imgbox">
            <img src="images/8.jpg" >
        </div>
    </div>
    <div class="box">
        <div class="imgbox">
            <img src="images/9.jpg" >
        </div>
    </div>
    <div class="box">
        <div class="imgbox">
            <img src="images/10.jpg" >
        </div>
    </div>
    <div class="box">
        <div class="imgbox">
            <img src="images/3.jpg" >
        </div>
    </div>
    <div class="box">
        <div class="imgbox">
            <img src="images/2.jpg" >
        </div>
    </div>
    <div class="box">
        <div class="imgbox">
            <img src="images/1.jpg" >
        </div>
    </div>
    <div class="box">
        <div class="imgbox">
            <img src="images/5.jpg" >
        </div>
    </div>
    <div class="box">
        <div class="imgbox">
            <img src="images/6.jpg" >
        </div>
    </div>
    <div class="box">
        <div class="imgbox">
            <img src="images/7.jpg" >
        </div>
    </div>
    <div class="box">
        <div class="imgbox">
            <img src="images/8.jpg" >
        </div>
    </div>
    <div class="box">
        <div class="imgbox">
            <img src="images/9.jpg" >
        </div>
    </div>
    <div class="box">
        <div class="imgbox">
            <img src="images/10.jpg" >
        </div>
    </div>
    <div class="box">
        <div class="imgbox">
            <img src="images/3.jpg" >
        </div>
    </div>
    <div class="box">
        <div class="imgbox">
            <img src="images/2.jpg" >
        </div>
    </div>
    <div class="box">
        <div class="imgbox">
            <img src="images/1.jpg" >
        </div>
    </div>
    <div class="box">
        <div class="imgbox">
            <img src="images/5.jpg" >
        </div>
    </div>
    <div class="box">
        <div class="imgbox">
            <img src="images/6.jpg" >
        </div>
    </div>
    <div class="box">
        <div class="imgbox">
            <img src="images/7.jpg" >
        </div>
    </div>
    <div class="box">
        <div class="imgbox">
            <img src="images/8.jpg" >
        </div>
    </div>
    <div class="box">
        <div class="imgbox">
            <img src="images/9.jpg" >
        </div>
    </div>
    <div class="box">
        <div class="imgbox">
            <img src="images/10.jpg" >
        </div>
    </div>
    <div class="box">
        <div class="imgbox">
            <img src="images/3.jpg" >
        </div>
    </div>
    <div class="box">
        <div class="imgbox">
            <img src="images/2.jpg" >
        </div>
    </div>
    <div class="box">
        <div class="imgbox">
            <img src="images/1.jpg" >
        </div>
    </div>
    <div class="box">
        <div class="imgbox">
            <img src="images/5.jpg" >
        </div>
    </div>
    <div class="box">
        <div class="imgbox">
            <img src="images/6.jpg" >
        </div>
    </div>
    <div class="box">
        <div class="imgbox">
            <img src="images/7.jpg" >
        </div>
    </div>
    <div class="box">
        <div class="imgbox">
            <img src="images/8.jpg" >
        </div>
    </div>
    <div class="box">
        <div class="imgbox">
            <img src="images/9.jpg" >
        </div>
    </div>
    <div class="box">
        <div class="imgbox">
            <img src="images/10.jpg" >
        </div>
    </div>
</div>
</body>
</html>

原文地址:https://www.cnblogs.com/bsys/p/11524901.html

时间: 2024-11-10 15:59:07

js实现无限瀑布流的相关文章

JS实现动态瀑布流及放大切换图片效果(js案例)

整理了一下当时学js写的一些案例,再次体验了一把用原生JS实现动态瀑布流效果的乐趣,现在把它整理出来,需要的小伙伴可以参考一下. 该案例主要是用HTML+CSS控制样式,通过JS实现全局瀑布流以及点击图片放大.上下切换效果.HTML布局写的很简单,图片加载主要是在JS中通过访问自定义的JSON字符串来实现.动态瀑布流的原理简单理解就是把新需要加载的图片放在上一排总高度最小的图片或模块下面,实现参差不齐的多栏布局效果.具体效果如下: 做这个案例我用了之前自己封装的框架,所以小伙伴需要到我的另一篇文

js随机图片瀑布流

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>瀑布流</title> <style type="text/css"> * { margin: 0; padding: 0; list-style-type: none; } a, img { border: 0; } body { font: 12px/180%

小程序实现无限瀑布流

实现瀑布流 实现效果 有好几种方案 1.用column-count属性把页面元素分为俩列或多列来实现 2.用display flex 分列来展示页面 3.比如说用js实现 我今天介绍的就是第三种,因为前两种都会有局限,实现的效果我们希望是左右左右,而不是分成两列去显示,因为如果功能需要列表按照热度显示,从我们视觉来看就是 左右比较好,而不是一整列 1,2,3,4,5- 当然如果你们希望用column-count 实现的话,也可以 请点击,我随便找了一个网址网上有很多,我自己也试过实现起来确实很简

原生 JS 实现一个瀑布流插件

瀑布流布局中的图片有一个核心特点 -- 等宽不定等高,瀑布流布局在国内网网站都有一定规模的使用,比如pinterest.花瓣网等等.那么接下来就基于这个特点开始瀑布流探索之旅. 基础功能实现 首先我们定义好一个有 20 张图片的容器, <body> <style> #waterfall { position: relative; } .waterfall-box { float: left; width: 200px; } </style> </body>

基于jquery和knockout.js 写个瀑布流异步加载分页

<div class="list-view"> <ul> <li data-bind="foreach:datalst"> <div class="item border clearfix"> <div class="face fl"> <a target="_blank" data-bind="attr:{'title':user

JS图片瀑布流制作

这里为大家带来了两种通过js制作图片瀑布流的方法. 一.绝对定位法 计算每个元素的绝对位置进行设置. <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0">

web前端入门到实战:纯CSS瀑布流与JS瀑布流

瀑布流 又称瀑布流式布局,是比较流行的一种网站页面布局方式.即多行等宽元素排列,后面的元素依次添加到其后,等宽不等高,根据图片原比例缩放直至宽度达到我们的要求,依次按照规则放入指定位置. 为什么使用瀑布流 瀑布流布局在我们现在的前端页面中经常会用的到,它可以有效的降低页面的复杂度,节省很多的空间,对于整个页面不需要太多的操作,只需要下拉就可以浏览用户需要看到的数据:并且,在当前这个APP至上的时代,瀑布流可以提供很好的用户体验,通过结合下拉刷新,上拉加载进行数据的懒加载等操作,对于用户的体验感来

74.js---移动端文章的瀑布流的实现。

移动端文章的瀑布流的实现.   1.首先在前端html页面已经通过PHP代码循环完全数据.  2.然后在js先全部隐藏,通过判断滑动到底部,每次加载一部分数据,直到数据全部显示完全. js代码: // 瀑布流 //获取文章的总长度 var liLength=$(".trim-content-active li").length; //规定每次加载的数据条数 var page=10 //一共加载多少次---本案无用 var liH= Math.ceil(liLength/page); /

js实现瀑布流以及加载效果

一.瀑布流是个啥? 瀑布流,是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部. 最早采用瀑布流布局的网站是Pinterest,逐渐在国内流行开来,比如我们熟知的百度图片的布局,在"很久"以前,百度图片还是需要一页一页的点击进行查看更多图片,而现在的瀑布流布局使用户查找图片更加方便. 二.瀑布流的优缺点 优点: 1.节省了页面的空间,不再需要导航和页码按钮. 2.增强了用户的体验,使用户的体验更多的是在于浏览图