原生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 相关文章推荐
Javascript-Mozilla和IE中的一个函数直接量的问题
Jan 09 Javascript
js函数参数设置默认值的一种变通实现方法
May 26 Javascript
js实现同一页面可多次调用的图片幻灯切换效果
Feb 28 Javascript
通过Jquery.cookie.js实现展示浏览网页的历史记录超管用
Oct 23 Javascript
Javascript实现跑马灯效果的简单实例
May 31 Javascript
Javascript基于jQuery UI实现选中区域拖拽效果
Nov 25 Javascript
vue-loader教程介绍
Jun 14 Javascript
Bootstrap-table自定义可编辑每页显示记录数
Sep 07 Javascript
element el-input directive数字进行控制
Oct 11 Javascript
vue-cli3.0 脚手架搭建项目的过程详解
Oct 19 Javascript
JavaScript一元正号运算符示例代码
Jun 30 Javascript
在js中修改html body的样式
Nov 11 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
Terran热键控制
2020/03/14 星际争霸
php回调函数处理数组操作示例
2020/04/13 PHP
左右悬浮可分组的网站QQ在线客服代码(可谓经典)
2012/12/21 Javascript
js判断样式className同时增加class或删除class
2013/01/30 Javascript
jQuery中queue()方法用法实例
2014/12/29 Javascript
jquery使整个div区域可以点击的方法
2015/06/24 Javascript
关于JavaScript中的this指向问题总结篇
2017/07/23 Javascript
Angular4自制一个市县二级联动组件示例
2017/11/21 Javascript
vue中监听返回键问题
2019/08/28 Javascript
vue-cli和v-charts实现可视化图表过程解析
2019/10/08 Javascript
在vue中利用全局路由钩子给url统一添加公共参数的例子
2019/11/01 Javascript
vue随机验证码组件的封装实现
2020/02/19 Javascript
vue 实现动态路由的方法
2020/07/06 Javascript
[03:03]DOTA2校园争霸赛 济南城市决赛欢乐发奖活动
2013/10/21 DOTA
[14:36]2014 DOTA2国际邀请赛中国区预选赛5.21 Orenda VS NE
2014/05/22 DOTA
[02:54]辉夜杯主赛事第二日败者组 iG.V赛后采访
2015/12/26 DOTA
详解Python爬虫的基本写法
2016/01/08 Python
举例讲解Python的lambda语句声明匿名函数的用法
2016/07/01 Python
pip命令无法使用的解决方法
2018/06/12 Python
python用pandas数据加载、存储与文件格式的实例
2018/12/07 Python
Python面向对象总结及类与正则表达式详解
2019/04/18 Python
python数据类型可变不可变知识点总结
2020/03/06 Python
python 追踪except信息方式
2020/04/25 Python
分享CSS3中必须要知道的10个顶级命令
2012/04/26 HTML / CSS
css3实现背景动态渐变效果
2019/12/10 HTML / CSS
使用HTML5 Canvas API中的clip()方法裁剪区域图像
2016/03/25 HTML / CSS
HTML5等待加载动画效果
2017/07/27 HTML / CSS
Carolina工作鞋官网:Carolina Footwear
2019/03/14 全球购物
新法人代表任命书
2014/06/06 职场文书
2013年最新自荐信范文
2014/06/23 职场文书
教师群众路线心得体会
2014/11/04 职场文书
项目安全员岗位职责
2015/02/15 职场文书
Python下opencv使用hough变换检测直线与圆
2021/06/18 Python
MySQL外键约束(FOREIGN KEY)案例讲解
2021/08/23 MySQL
golang实现一个简单的websocket聊天室功能
2021/10/05 Golang
GTX1660显卡搭配显示器推荐
2022/04/19 数码科技