基于JavaScript实现瀑布流布局


Posted in Javascript onAugust 15, 2018

本文实例为大家分享了js实现瀑布流布局的具体代码,供大家参考,具体内容如下

1、html+css+js代码:

<!DOCTYPE html>
<html>
<head>
  <meta http-equiv="Content-Type" content="text/html" charset="utf-8" />
  <title>hhh</title>
</head>
<body>
  <style type="text/css">
    *{
      padding: 0;
      margin: 0;
    }
    #main{
      position: relative;
    }
    .pin{
      float: left;
      padding: 15px 0 0 15px;
    }
    .box{
      border-radius: 5px;
      box-shadow: 0 0 6px #ccc;
      border:1px solid #ccc;
      padding: 10px;

    }
    .box img{
      width: 162px;
      height:auto;
    }
  </style>

<script type="text/javascript">
  window.onload = function(){

    waterfall("main","pin");

    var dataint = {'data':[{'src':'1.jpg'},{'src':'2.jpg'},{'src':'3.jpg'},{'src':'4.jpg'}]};

    window.onscroll = function(){
      if (checkscrollside()) {
        var oparent = document.getElementById('main');
        for (var i = 0; i < dataint.data.length; i++) {
          var opin = document.createElement('div');
          opin.className = 'pin';
          oparent.appendChild(opin);
          var obox = document.createElement('div');
          obox.className = 'box';
          opin.appendChild(obox);
          var oimg = document.createElement('img');
          oimg.src = './images/' +dataint.data[i].src;
          obox.appendChild(oimg);
        }
        waterfall('main','pin');
      };
    }


  }

  //parent为父元素的id,pin为子元素id
  function waterfall(parent,pin){
    var oparent = document.getElementById(parent);
    var apin = getclassobj(oparent,pin);//获取id为oparent的类名为pin的元素
    var ipinw = apin[0].offsetWidth;
    var num = Math.floor(document.documentElement.clientWidth/ipinw);
    oparent.style.cssText = 'width:' + ipinw*num + 'px;margin:0 auto;';

    var pinharr = [];
    for( var i = 0;i < apin.length; i++)
    {
      var pinh = apin[i].offsetHeight;
      if (i < num) {
        pinharr[i] = pinh;
      }
      else{
        var minh = Math.min.apply(null,pinharr);
        var minhindex = getminhindex(pinharr,minh);
        apin[i].style.position = 'absolute';
        apin[i].style.top = minh +'px';
        apin[i].style.left = apin[minhindex].offsetLeft + 'px';
        pinharr[minhindex] += apin[i].offsetHeight; 
      }

    }
  }

  //获取id为parent的类名为classname的元素
  function getclassobj(parent,classname){

    var obj = parent.getElementsByTagName('*');
    var pins = [];
    for (var i = 0; i < obj.length; i++) {
      if (obj[i].className == classname) {
        pins.push(obj[i]);
      }
    };
    return pins;
  }

  function getminhindex(arr,minh){
    for(var i in arr){
      if (arr[i] == minh) {
        return i;
      }
    }
  }

  function checkscrollside(){
    var oparent = document.getElementById('main');
    var apin = getclassobj(oparent,'pin');
    var lastpinh = apin[apin.length - 1].offsetTop + Math.floor(apin[apin.length - 1].offsetHeight/2);
    var scrollTop = document.documentElement.scrollTop||document.body.scrollTop;
    var documenth = document.documentElement.clientHeight;
    return(lastpinh<scrollTop + documenth)?true:false;
  }
</script>
</body>
  <div id="main">
    <div class="pin">
      <div class="box">
        <img src="images/0.jpg">
      </div>
    </div>
    <div class="pin">
      <div class="box">
        <img src="images/1.jpg">
      </div>
    </div>
    <div class="pin">
      <div class="box">
        <img src="images/2.jpg">
      </div>
    </div>
    <div class="pin">
      <div class="box">
        <img src="images/3.jpg">
      </div>
    </div>
    <div class="pin">
      <div class="box">
        <img src="images/4.jpg">
      </div>
    </div>
    <div class="pin">
      <div class="box">
        <img src="images/5.jpg">
      </div>
    </div>
    <div class="pin">
      <div class="box">
        <img src="images/6.jpg">
      </div>
    </div>
    <div class="pin">
      <div class="box">
        <img src="images/7.jpg">
      </div>
    </div>
    <div class="pin">
      <div class="box">
        <img src="images/8.jpg">
      </div>
    </div>
    <div class="pin">
      <div class="box">
        <img src="images/9.jpg">
      </div>
    </div>
    <div class="pin">
      <div class="box">
        <img src="images/10.jpg">
      </div>
    </div>
    <div class="pin">
      <div class="box">
        <img src="images/11.jpg">
      </div>
    </div>
    <div class="pin">
      <div class="box">
        <img src="images/12.jpg">
      </div>
    </div>
    <div class="pin">
      <div class="box">
        <img src="images/13.jpg">
      </div>
    </div>
    <div class="pin">
      <div class="box">
        <img src="images/14.jpg">
      </div>
    </div>
    <div class="pin">
      <div class="box">
        <img src="images/15.jpg">
      </div>
    </div>

    <div class="pin">
      <div class="box">
        <img src="images/16.jpg">
      </div>
    </div>
    <div class="pin">
      <div class="box">
        <img src="images/17.jpg">
      </div>
    </div>
    <div class="pin">
      <div class="box">
        <img src="images/18.jpg">
      </div>
    </div>
    <div class="pin">
      <div class="box">
        <img src="images/19.jpg">
      </div>
    </div>

    <div class="pin">
      <div class="box">
        <img src="images/20.jpg">
      </div>
    </div>
    <div class="pin">
      <div class="box">
        <img src="images/21.jpg">
      </div>
    </div>
  </div>
</html>

2、思路分析

首先做出静态布局来。先计算出一行放多少个元素,然后再让下一个元素放入第二行中,然后我们要计算出,放入第二行的第一个元素要放在哪个位置,故我们应该有一个数组用来存放每列的高度,当静态的这些元素都放进去之后,可以更加完善,比如当拖动滚动条的时候,页面刷新,更多元素填充,这里要用到json。

3、实现过程

1.初始的静态页面通过css来实现

2.静态的瀑布流布局,先要获取到父级对象main下面的所有类为pin的元素,然后计算一行中有几个块,此时用当前屏幕的宽度去除一个块的宽度,得到num。然后用一个数组,用来存储一行中每列的高度,通过循环,找出最小的高度,以及最小高度的下标值,然后用绝对定位设置高度。

3.当鼠标滚动的时候,通过一个函数来检查是否需要加载新的图片元素,这里用一个变量lastpinh计算出最后一个元素距离顶部的高度和自身高度的一半之和,当页面的高度与滚动出去的高度之和大于最后一个的高度时,触发事件,添加新的元素,以及调整布局。

4、需要掌握知识点:

json的数据存储

window.onscroll();
document.createElement();
obj.className;
obj.appendChild(obj1);
obj.offsetWidth/offsetHeight/offsetLeft/offsetTop;
document.documentElement.clientWidth/clientHeight;
obj.style.cssText
Math.min.apply();
Math.floor();
obj.push();
document.documentElement.scrollTop
document.body.scrollTop;

注:这些都是我所不熟练的知识点。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
用javascript实现分割提取页面所需内容
May 09 Javascript
得到jQuery detach()后节点中的某个值实现代码
Feb 05 Javascript
jquery实现点击查看更多内容控制段落文字展开折叠效果
Aug 06 Javascript
深入理解bootstrap框架之第二章整体架构
Oct 09 Javascript
探讨AngularJs中ui.route的简单应用
Nov 16 Javascript
jQuery EasyUI 获取tabs的实例解析
Dec 06 Javascript
JavaScript评论点赞功能的实现方法
Mar 13 Javascript
AngularJS使用ng-class动态增减class样式的方法示例
May 18 Javascript
关于JavaScript中的this指向问题总结篇
Jul 23 Javascript
bootstrap paginator分页插件的两种使用方式实例详解
Nov 14 Javascript
VSCode配置react开发环境的步骤
Dec 27 Javascript
微信小程序 网络通信实现详解
Jul 23 Javascript
解决Layui 表单提交数据为空的问题
Aug 15 #Javascript
jQuery轮播图实例详解
Aug 15 #jQuery
JS实现获取毫秒值及转换成年月日时分秒的方法
Aug 15 #Javascript
对layui中表单元素的使用详解
Aug 15 #Javascript
layui中使用jquery控制radio选中事件的示例代码
Aug 15 #jQuery
vue生命周期实例小结
Aug 15 #Javascript
layui获取多选框中的值方法
Aug 15 #Javascript
You might like
YII框架实现自定义第三方扩展操作示例
2019/04/26 PHP
js下用层来实现select的title提示属性
2010/02/23 Javascript
jQuery 第二课 操作包装集元素代码
2010/03/14 Javascript
TreeView 用法(有代码)(asp.net)
2011/07/15 Javascript
JQUERY1.6 使用方法四 检测浏览器
2011/11/23 Javascript
js异常捕获方法介绍
2013/04/10 Javascript
对于Form表单reset方法的新认识
2014/03/05 Javascript
js调试系列 初识控制台
2014/06/18 Javascript
jQuery中next()方法用法实例
2015/01/07 Javascript
原生js与jQuery实现简单的tab切换特效对比
2015/07/30 Javascript
Bootstrap自定义文件上传下载样式
2016/05/26 Javascript
JQuery EasyUI学习教程之datagrid 添加、修改、删除操作
2016/07/09 Javascript
基于SpringMVC+Bootstrap+DataTables实现表格服务端分页、模糊查询
2016/10/30 Javascript
JavaScript满天星导航栏实现方法
2018/03/08 Javascript
js中的 || 与 &amp;&amp; 运算符详解
2018/05/24 Javascript
微信小程序自定义prompt组件步骤详解
2018/06/12 Javascript
js异步上传多张图片插件的使用方法
2018/10/22 Javascript
vue实现form表单与table表格的数据关联功能示例
2019/01/29 Javascript
Vue使用自定义指令实现拖拽行为实例分析
2020/06/06 Javascript
详解Vue2的diff算法
2021/01/06 Vue.js
[05:02]2014DOTA2 TI中国区预选赛精彩TOPPLAY第三弹
2014/06/25 DOTA
python进阶教程之函数参数的多种传递方法
2014/08/30 Python
Python基于pygame实现的弹力球效果(附源码)
2015/11/11 Python
python条件变量之生产者与消费者操作实例分析
2017/03/22 Python
Python3批量生成带logo的二维码方法
2019/06/24 Python
python可视化篇之流式数据监控的实现
2019/08/07 Python
Python selenium爬取微博数据代码实例
2020/05/22 Python
Python 实现自动登录+点击+滑动验证功能
2020/06/10 Python
HTML文本属性&amp;颜色控制属性的实现
2019/12/17 HTML / CSS
自考毕业自我鉴定范文
2013/10/27 职场文书
大学新生欢迎词
2014/01/10 职场文书
三好学生先进事迹材料
2014/08/28 职场文书
Python实现DBSCAN聚类算法并样例测试
2021/06/22 Python
浅谈Python数学建模之数据导入
2021/06/23 Python
一些让Python代码简洁的实用技巧总结
2021/08/23 Python
Typescript类型系统FLOW静态检查基本规范
2022/05/25 Javascript