原生JavaScript实现瀑布流布局


Posted in Javascript onJune 28, 2020

本文实例讲解了原生JavaScript实现瀑布流布局详细代码,分享给大家供大家参考,具体内容如下

效果图:

原生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';     //添加 类名 name属性
    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');
  };
 }
}


/*
 parend 父级id
 pin 元素class
*/
function waterfall(parent,pin){
 var oParent=document.getElementById(parent);// 父级对象
 var aPin=getClassObj(oParent,pin);// 获取存储块框pin的数组aPin
 var iPinW=aPin[0].offsetWidth;// 一个块框pin的宽
 var num=Math.floor(document.documentElement.clientWidth/iPinW);//每行中能容纳的pin个数【窗口宽度除以一个块框宽度】
 oParent.style.cssText='width:'+iPinW*num+'px;margin:0 auto;';//设置父级居中样式:定宽+自动水平外边距

 var pinHArr=[];//用于存储 每列中的所有块框相加的高度。
 for(var i=0;i<aPin.length;i++){//遍历数组aPin的每个块框元素
  var pinH=aPin[i].offsetHeight;
  if(i<num){
   pinHArr[i]=pinH; //第一行中的num个块框pin 先添加进数组pinHArr
  }else{
   var minH=Math.min.apply(null,pinHArr);//数组pinHArr中的最小值minH
   var minHIndex=getminHIndex(pinHArr,minH);
   aPin[i].style.position='absolute';//设置绝对位移
   aPin[i].style.top=minH+'px';
   aPin[i].style.left=aPin[minHIndex].offsetLeft+'px';
   //数组 最小高元素的高 + 添加上的aPin[i]块框高
   pinHArr[minHIndex]+=aPin[i].offsetHeight;//更新添加了块框后的列高
  }
 }
}

/*
 通过父级和子元素的class类 获取该同类子元素的数组
*/
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;
}

/*
 获取 pin高度 最小值的索引index
*/
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);//创建【触发添加块框函数waterfall()】的高度:最后一个块框的距离网页顶部+自身高的一半(实现未滚到底就开始加载)
 var scrollTop=document.documentElement.scrollTop||document.body.scrollTop;//注意解决兼容性
 var documentH=document.documentElement.clientHeight;//页面高度
 return (lastPinH<scrollTop+documentH)?true:false;//到达指定高度后 返回true,触发waterfall()函数
}

以上就是本文的全部内容,希望对大家实现瀑布流布局有所帮助。

Javascript 相关文章推荐
jQuery学习7 操作JavaScript对象和集合的函数
Feb 07 Javascript
引用外部js乱码问题分析及解决方案
Apr 12 Javascript
JavaScript中的类数组对象介绍
Dec 30 Javascript
thinkphp 表名 大小写 窍门
Feb 01 Javascript
jQuery mobile 移动web(4)
Dec 20 Javascript
js闭包引起的事件注册问题介绍
Mar 29 Javascript
微信小程序 开发之滑块视图容器(swiper)详解及实例代码
Feb 22 Javascript
基于React实现表单数据的添加和删除详解
Mar 14 Javascript
Bootstrap Table 删除和批量删除
Sep 22 Javascript
Node.js 在本地生成日志文件的方法
Feb 07 Javascript
vue elementui tree 任意级别拖拽功能代码
Aug 31 Javascript
详解Js模块化的作用原理和方案
Apr 29 Javascript
js实现瀑布流的三种方式比较
Jun 28 #Javascript
详解AngularJS中自定义过滤器
Dec 28 #Javascript
js运动应用实例解析
Dec 28 #Javascript
基于JavaScript将表单序列化类型的数据转化成对象的处理(允许对象中包含对象)
Dec 28 #Javascript
浅析JS运动
Dec 28 #Javascript
基于JavaScript实现网页倒计时自动跳转代码
Dec 28 #Javascript
js时间戳转为日期格式的方法
Dec 28 #Javascript
You might like
一拳超人中怪人协会钦定! S级别最强四人!
2020/03/02 日漫
php中使用explode查找某个字符是否存在的方法
2011/07/12 PHP
php查询相似度最高的字符串的方法
2015/03/12 PHP
php给图片加文字水印
2015/07/31 PHP
PHP实现的简单路由和类自动加载功能
2018/03/13 PHP
laravel 事件/监听器实例代码
2019/04/12 PHP
JQuery 绑定事件时传递参数的实现方法
2009/10/13 Javascript
jquery获取css中的选择器(实例讲解)
2013/12/02 Javascript
javascript设置金额样式转换保留两位小数示例代码
2013/12/04 Javascript
javascript闭包传参和事件的循环绑定示例探讨
2014/04/17 Javascript
原生js和jquery实现图片轮播淡入淡出效果
2015/04/23 Javascript
基于js里调用函数时,函数名带括号和不带括号的区别
2016/07/28 Javascript
JS中LocalStorage与SessionStorage五种循序渐进的使用方法
2017/07/12 Javascript
Vue2.0 组件传值通讯的示例代码
2017/08/01 Javascript
帝国cms首页列表页实现点赞功能
2017/10/30 Javascript
jQuery实现浏览器之间跳转并传递参数功能【支持中文字符】
2018/03/28 jQuery
JavaScript使用享元模式实现文件上传优化操作示例
2018/08/07 Javascript
使用bootstrap实现下拉框搜索功能的实例讲解
2018/08/10 Javascript
在Vuex使用dispatch和commit来调用mutations的区别详解
2018/09/18 Javascript
微信小程序 函数防抖 解决重复点击消耗性能问题实现代码
2019/09/12 Javascript
微信小程序聊天功能的示例代码
2020/01/13 Javascript
解决echarts 一条柱状图显示两个值,类似进度条的问题
2020/07/20 Javascript
工作中常用js功能汇总
2020/11/07 Javascript
python实现哈希表
2014/02/07 Python
[原创]Python入门教程4. 元组基本操作
2018/10/31 Python
对Python _取log的几种方式小结
2019/07/25 Python
jupyter实现重新加载模块
2020/04/16 Python
Python爬虫获取页面所有URL链接过程详解
2020/06/04 Python
Pycharm连接gitlab实现过程图解
2020/09/01 Python
编写python代码实现简单抽奖器
2020/10/20 Python
来自南加州灵感的工作和娱乐服装:TravisMathew
2019/05/01 全球购物
美国床垫连锁店:Mattress Firm
2021/02/13 全球购物
Discard Protocol抛弃协议的作用是什么
2015/10/10 面试题
表彰会主持词
2014/03/26 职场文书
营销部内勤岗位职责
2014/04/30 职场文书
只需要12页,掌握撰写一流商业计划书的技巧
2019/05/07 职场文书