原生js实现瀑布流布局


Posted in Javascript onMarch 08, 2017

用js实现瀑布流布局以及通过模拟的数据加载图片,已标记注释

效果如图:

原生js实现瀑布流布局

<!DOCTYPE html>
<html>
<head lang="en">
  <meta charset="UTF-8">
  <title>瀑布流布局-JS实现</title>
</head>
<style type="text/css">
  *{
    margin: 0;
    padding: 0;
  }
  #main{
    position: relative;/*整体相对定位,因为每个小图片盒子的位置是通过计算再由绝对定位放置,是需要相对于main盒子*/
  }
  .box{
    padding: 15px 0 0 15px;/*padding为内边距,后面js获取的高度包括padding的距离*/
    float: left;
  }
  .pic{
    padding: 10px;
    border: 1px solid #ccc;
    border-radius: 5px;
    box-shadow: 0 0 5px #ccc;
  }
  .pic img{
    width: 165px;
    height: auto;
  }
</style>
<script type="text/javascript">
  window.onload=function(){
    var oParent=document.getElementById("main");
    var oBoxs=oParent.getElementsByClassName("box");
    waterfall('main','box');//调用瀑布布局的函数
    var dataInt={"data":[{"src":'23.jpg'},{"src":'24.jpg'},{"src":'25.jpg'}]}//模拟出要加载的图片
    window.onscroll=function(){
      if(checkscrollSlide()){//如果调用函数的返回结果为true
        //将数据块渲染到当前页面底部
        for(var i=0;i<dataInt.data.length;i++){//dataInt对象的data属性的长度
          var oBox=document.createElement('div');
          oBox.className='box';
          oParent.appendChild(oBox);//添加到父元素的最后
          var oPic=document.createElement('div');
          oPic.className='pic';
          oBox.appendChild(oPic);
          var oImg=document.createElement('img');
          oImg.src="img/"+dataInt.data[i].src;
          oPic.appendChild(oImg);
        }
        waterfall('main','box');
      };
    }
    function waterfall(parent,box){
      var oParent=document.getElementById(parent);
      var oBoxs=oParent.getElementsByClassName(box);
      var oBoxW=oBoxs[0].offsetWidth;//计算每个box的宽度
      //计算整个页面显示的列数(页面宽/box的宽)
      var cols=Math.floor(document.documentElement.clientWidth/oBoxW);
      //设置main的宽,居中
      oParent.style.cssText='width:'+oBoxW*cols+'px;margin:0 auto;';
      var hArr=[];//存放每一列高度的数组
      for(var i=0;i<oBoxs.length;i++){
        if(i<cols){
          hArr.push(oBoxs[i].offsetHeight);//将第一行的各个高度加到数组中
        }else{
          var minH=Math.min.apply(null,hArr);//apply方法可以改变数组的指向,因为Math.min方法不支持数组
          var index=getMinhIndex(hArr,minH);
          oBoxs[i].style.position='absolute';
          oBoxs[i].style.top=minH+'px';
          oBoxs[i].style.left=oBoxs[index].offsetLeft+'px';
          hArr[index]+=oBoxs[i].offsetHeight;
        }
      }
    }
    function getMinhIndex(arr,val){
      for(var i in arr){
        if(arr[i]==val){
          return i;
        }

      }
    }
    //检测是否具备了滚动条加载数据块的条件
    function checkscrollSlide(){
      //最后一个盒子的距顶部的高度加上自身高度的一半
      var lastBoxH=oBoxs[oBoxs.length-1].offsetTop+ Math.floor(oBoxs[oBoxs.length-1].offsetHeight/2);
      //页面滚走的距离
      var scrollTop=document.body.scrollTop||document.documentElement.scrollTop;
      //当前浏览器窗口可视区域高度
      var height=document.body.clientHeight||document.documentElement.clientHeight;
      return (lastBoxH<scrollTop+height) ? true : false;
    }
}


</script>
<body>
<div id="main">
  <div class="box">
  <div class="pic">
    <img src="img/0.jpg" />
  </div>
</div>
  <div class="box">
    <div class="pic">
      <img src="img/1.jpg" />
    </div>
  </div>
  <div class="box">
    <div class="pic">
      <img src="img/2.jpg" />
    </div>
  </div>
  <div class="box">
    <div class="pic">
      <img src="img/3.jpg" />
    </div>
  </div>
  <div class="box">
    <div class="pic">
      <img src="img/4.jpg" />
    </div>
  </div>
  <div class="box">
    <div class="pic">
      <img src="img/5.jpg" />
    </div>
  </div>
  <div class="box">
    <div class="pic">
      <img src="img/6.jpg" />
    </div>
  </div>
  <div class="box">
    <div class="pic">
      <img src="img/7.jpg" />
    </div>
  </div>
  <div class="box">
    <div class="pic">
      <img src="img/8.jpg" />
    </div>
  </div>
  <div class="box">
    <div class="pic">
      <img src="img/9.jpg" />
    </div>
  </div>
  <div class="box">
    <div class="pic">
      <img src="img/10.jpg" />
    </div>
  </div>
  <div class="box">
    <div class="pic">
      <img src="img/11.jpg" />
    </div>
  </div>
  <div class="box">
    <div class="pic">
      <img src="img/12.jpg" />
    </div>
  </div>
  <div class="box">
    <div class="pic">
      <img src="img/13.jpg" />
    </div>
  </div>
  <div class="box">
    <div class="pic">
      <img src="img/14.jpg" />
    </div>
  </div>
  <div class="box">
    <div class="pic">
      <img src="img/15.jpg" />
    </div>
  </div>
  <div class="box">
    <div class="pic">
      <img src="img/16.jpg" />
    </div>
  </div>
  <div class="box">
    <div class="pic">
      <img src="img/17.jpg" />
    </div>
  </div>
  <div class="box">
    <div class="pic">
      <img src="img/18.jpg" />
    </div>
  </div>
  <div class="box">
    <div class="pic">
      <img src="img/19.jpg" />
    </div>
  </div>
  <div class="box">
    <div class="pic">
      <img src="img/20.jpg" />
    </div>
  </div>
  <div class="box">
    <div class="pic">
      <img src="img/21.jpg" />
    </div>
  </div>
  <div class="box">
    <div class="pic">
      <img src="img/22.jpg" />
    </div>
  </div>

</div>
</body>
</html>

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

Javascript 相关文章推荐
利用js跨页面保存变量做菜单的方法
Jan 17 Javascript
jquery.validate使用攻略 第二部
Jul 01 Javascript
return false;和e.preventDefault();的区别
Jul 11 Javascript
面向对象的Javascript之二(接口实现介绍)
Jan 27 Javascript
javascript的parseFloat()方法精度问题探讨
Nov 26 Javascript
Ext GridPanel加载完数据后进行操作示例代码
Jun 17 Javascript
基于jquery实现等比缩放图片
Dec 03 Javascript
javascript bom是什么及bom和dom的区别
Nov 26 Javascript
Mac中安装nvm的教程分享
Dec 11 Javascript
JS设置自定义快捷键并实现图片上下左右移动
Oct 17 Javascript
详解Vue 单文件组件的三种写法
Feb 19 Javascript
js实现限定范围拖拽的示例
Oct 26 Javascript
js仿拉勾网首页穿墙广告效果
Mar 08 #Javascript
JavaScript中的工厂函数(推荐)
Mar 08 #Javascript
老生常谈js中0到底是 true 还是 false
Mar 08 #Javascript
jQuery插件zTree实现更新根节点中第i个节点名称的方法示例
Mar 08 #Javascript
JS字符串false转boolean的方法(推荐)
Mar 08 #Javascript
原生js实现选项卡功能
Mar 08 #Javascript
js, jQuery实现全选、反选功能
Mar 08 #Javascript
You might like
用Php实现链结人气统计
2006/10/09 PHP
PHP 将图片按创建时间进行分类存储的实现代码
2010/01/05 PHP
看了就知道什么是JSON
2007/12/09 Javascript
JS删除数组元素的函数介绍
2013/03/27 Javascript
JavaScript 对任意元素,自定义右键菜单的实现方法
2013/05/08 Javascript
javascript中Array数组的迭代方法实例分析
2015/02/04 Javascript
深入理解JavaScript系列(50):Function模式(下篇)
2015/03/04 Javascript
常用的Javascript设计模式小结
2015/12/09 Javascript
jQuery新窗口打开外链接
2016/07/21 Javascript
vuejs通过filterBy、orderBy实现搜索筛选、降序排序数据
2020/10/26 Javascript
jquery点赞功能实现代码 点个赞吧!
2020/05/29 jQuery
详解react关于事件绑定this的四种方式
2018/03/09 Javascript
Vue验证码60秒倒计时功能简单实例代码
2018/06/22 Javascript
JS中封装axios来管控api的2种方式
2019/09/11 Javascript
Vue微信公众号网页分享的示例代码
2020/05/28 Javascript
vue实现导航菜单和编辑文本的示例代码
2020/07/04 Javascript
[52:52]DOTA2上海特级锦标赛C组资格赛#1 OG VS LGD第三局
2016/02/27 DOTA
Python实现子类调用父类的方法
2014/11/10 Python
Python 基础之字符串string详解及实例
2017/04/01 Python
用Python设计一个经典小游戏
2017/05/15 Python
Python基于列表模拟堆栈和队列功能示例
2018/01/05 Python
利用pandas将numpy数组导出生成excel的实例
2018/06/14 Python
Python实现线性插值和三次样条插值的示例代码
2019/11/13 Python
浅析python,PyCharm,Anaconda三者之间的关系
2019/11/27 Python
如何用Anaconda搭建虚拟环境并创建Django项目
2020/08/02 Python
为世界各地的女性设计和生产时尚服装:ROMWE
2016/09/17 全球购物
优质美利奴羊毛袜,不只是徒步旅行:Darn Tough Vermont
2018/11/05 全球购物
芬兰设计商店美国:Finnish Design Shop US
2019/03/25 全球购物
俄罗斯名牌服装网上商店:UNIQUE FABRIC
2019/07/25 全球购物
俄罗斯电子产品在线商店:UltraTrade
2020/01/30 全球购物
邮政员工辞职信
2014/01/16 职场文书
护士辞职信范文
2014/01/19 职场文书
法律专业自荐信
2014/06/03 职场文书
python实战之一步一步教你绘制小猪佩奇
2021/04/22 Python
解决Pytorch中关于model.eval的问题
2021/05/22 Python
游戏《铁拳》动画化!2022年年内播出
2022/03/21 日漫