原生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 相关文章推荐
用于节点操作的API,颠覆原生操作HTML DOM节点的API
Dec 11 Javascript
ExtJS4如何自动生成控制grid的列显示、隐藏的checkbox
May 02 Javascript
js删除局部变量的实现方法
Jun 25 Javascript
jquery插件treegrid树状表格的使用方法详解(.Net平台)
Jan 03 Javascript
使用vue.js2.0 + ElementUI开发后台管理系统详细教程(二)
Jan 21 Javascript
Node.js调试技术总结分享
Mar 12 Javascript
vue+vuex+axio从后台获取数据存入vuex实现组件之间共享数据
Apr 22 Javascript
javascript实现二叉树的代码
Jun 08 Javascript
Js利用prototype自定义数组方法示例
Oct 20 Javascript
javascript+HTML5 canvas绘制时钟功能示例
May 15 Javascript
vue 实现setInterval 创建和销毁实例
Jul 21 Javascript
Vue3如何理解ref toRef和toRefs的区别
Feb 18 Vue.js
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代码技巧的小结
2013/06/02 PHP
PHP 文件编程综合案例-文件上传的实现
2013/07/03 PHP
php实现水仙花数示例分享
2014/04/03 PHP
php生成短网址示例
2014/05/05 PHP
php根据用户名和手机号查询是否存在手机号码
2017/02/16 PHP
javascript中window.event事件用法详解
2012/12/11 Javascript
js动态调用css属性的小规律及实例说明
2013/12/28 Javascript
倒记时60刷新网页的js代码
2014/02/18 Javascript
Javascript正则控制文本框只能输入整数或浮点数
2014/09/02 Javascript
jQuery中prop()方法用法实例
2015/01/05 Javascript
jQuery实现的支持IE的html滑动条
2015/03/16 Javascript
JavaScript中的getTime()方法使用详解
2015/06/10 Javascript
javascript实现无缝上下滚动特效
2015/12/16 Javascript
JS实现简单抖动效果
2017/06/01 Javascript
jQuery实现上传图片前预览效果功能
2017/08/03 jQuery
vue2中使用sass并配置全局的sass样式变量的方法
2018/09/04 Javascript
[00:35]DOTA2上海特级锦标赛 VP战队宣传片
2016/03/04 DOTA
使用python实现接口的方法
2017/07/07 Python
Python将多份excel表格整理成一份表格
2018/01/03 Python
在Python 2.7即将停止支持时,我们为你带来了一份python 3.x迁移指南
2018/01/30 Python
Flask核心机制之上下文源码剖析
2018/12/25 Python
windows10下安装TensorFlow Object Detection API的步骤
2019/06/13 Python
Python使用import导入本地脚本及导入模块的技巧总结
2019/08/07 Python
Python中的相关分析correlation analysis的实现
2019/08/29 Python
Python 转换RGB颜色值的示例代码
2019/10/13 Python
简单了解Python3 bytes和str类型的区别和联系
2019/12/19 Python
给Python学习者的文件读写指南(含基础与进阶)
2020/01/29 Python
Tensorflow设置显存自适应,显存比例的操作
2020/02/03 Python
python的Jenkins接口调用方式
2020/05/12 Python
新手学python应该下哪个版本
2020/06/11 Python
HTML5 canvas基本绘图之图形组合
2016/06/27 HTML / CSS
德国排名第一的主题公园门票网站:Attraction Tickets Direct
2019/09/09 全球购物
温泉秘密:Onsen Secret
2020/07/06 全球购物
竞选班长的演讲稿
2014/04/24 职场文书
工伤私了协议书范本
2014/11/24 职场文书
Python+DeOldify实现老照片上色功能
2022/06/21 Python