原生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 相关文章推荐
Ext第一周 史上最强学习笔记---GridPanel(基础篇)
Dec 29 Javascript
JS 遮照层实现代码
Mar 31 Javascript
Javascript 面向对象 对象(Object)
May 13 Javascript
JavaScript实现的石头剪刀布游戏源码分享
Aug 22 Javascript
JS、jQuery中select的用法详解
Apr 21 Javascript
AngularJS基础 ng-switch 指令简单示例
Aug 03 Javascript
JavaScript中运算符规则和隐式类型转换示例详解
Sep 06 Javascript
基于element-ui的rules中正则表达式
Sep 04 Javascript
Vue指令指令大全
Feb 09 Javascript
解决Layui当中的导航条动态添加后渲染失败的问题
Sep 25 Javascript
vue router-link 默认a标签去除下划线的实现
Nov 06 Javascript
JS不要再到处使用绝对等于运算符了
Apr 30 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
php mysql获取表字段名称和字段信息的三种方法
2016/11/13 PHP
php获取数据库结果集方法(推荐)
2017/06/01 PHP
强悍无比的WEB开发好助手FireBug(Firefox Plugin)
2007/01/16 Javascript
ie 处理 gif动画 的onload 事件的一个 bug
2007/04/12 Javascript
HTML 自动伸缩的表格Table js实现
2009/04/01 Javascript
JQuery 动画卷页 返回顶部 动画特效(兼容Chrome)
2010/02/15 Javascript
JavaScript淡入淡出渐变简单实例
2015/08/06 Javascript
封装属于自己的JS组件
2016/01/27 Javascript
浅析Nodejs npm常用命令
2016/06/14 NodeJs
jQuery实现查找最近父节点的方法
2016/06/23 Javascript
javascript特殊文本输入框网页特效
2016/09/13 Javascript
JQuery扩展对象方法操作示例
2018/08/21 jQuery
vue根据进入的路由进行原路返回的方法
2018/09/26 Javascript
vue地址栏直接输入路由无效问题的解决
2018/11/15 Javascript
layui动态表头的实现代码
2019/08/22 Javascript
让IDE识别webpack的别名alias的实现方法
2020/05/06 Javascript
微信小程序swiper组件实现抖音翻页切换视频功能的实例代码
2020/06/24 Javascript
[01:19]2014DOTA2国际邀请赛 采访TITAN战队ohaiyo 能赢DK很幸运
2014/07/12 DOTA
python不带重复的全排列代码
2013/08/13 Python
python pickle存储、读取大数据量列表、字典数据的方法
2019/07/07 Python
Python循环实现n的全排列功能
2019/09/16 Python
python 采用paramiko 远程执行命令及报错解决
2019/10/21 Python
TensorFlow2.1.0安装过程中setuptools、wrapt等相关错误指南
2020/04/08 Python
python语言中有算法吗
2020/06/16 Python
用Python开发app后端有优势吗
2020/06/29 Python
详解html5 shiv.js和respond.min.js
2018/01/24 HTML / CSS
匡威比利时官网:Converse Belgium
2017/04/13 全球购物
NARS化妆品官方商店:美国彩妆品牌
2017/08/26 全球购物
澳大利亚100%丝绸多彩度假装商店:TheSwankStore
2019/09/04 全球购物
测绘专业大学生职业生涯规划书
2014/02/10 职场文书
创建省级文明单位实施方案
2014/02/27 职场文书
小学生优秀评语大全
2014/04/22 职场文书
小学生学雷锋演讲稿
2014/04/25 职场文书
土木工程专业本科生求职信
2014/10/01 职场文书
群众路线查摆问题整改措施思想汇报
2014/10/10 职场文书
Golang 正则匹配效率详解
2021/04/25 Golang