原生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 相关文章推荐
js动态创建表格,删除行列的小例子
Jul 20 Javascript
JavaScript函数的4种调用方法详解
Apr 22 Javascript
浅谈Javascript中的Function与Object
Jan 26 Javascript
jQuery实现数秒后自动提交form的方法
Mar 05 Javascript
复杂的javascript窗口分帧解析
Feb 19 Javascript
使用递归遍历对象获得value值的实现方法
Jun 14 Javascript
将List对象列表转换成JSON格式的类实现方法
Jul 04 Javascript
axios的拦截请求与响应方法
Aug 11 Javascript
JavaScript怎样在删除前添加确认弹出框?
May 27 Javascript
vue iview多张图片大图预览、缩放翻转
Jul 13 Javascript
微信小程序引入模块中wxml、wxss、js的方法示例
Aug 09 Javascript
bootstrapValidator表单校验、更改状态、新增、移除校验字段的实例代码
May 19 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获得用户使用的代理服务器ip即真实ip
2006/12/31 PHP
使用PHP实现蜘蛛访问日志统计
2013/07/05 PHP
php实现对象克隆的方法
2015/06/20 PHP
PHP之预定义接口详解
2015/07/29 PHP
PHP缓冲区用法总结
2016/02/14 PHP
深入解析PHP的Laravel框架中的event事件操作
2016/03/21 PHP
yii2.0实现创建简单widgets示例
2016/07/18 PHP
PHP入门教程之PHP操作MySQL的方法分析
2016/09/11 PHP
PHP实现二维数组按某列进行排序的方法
2016/11/18 PHP
php-fpm服务启动脚本的方法
2018/04/27 PHP
用console.table()调试javascript
2014/09/04 Javascript
JavaScript中字符串分割函数split用法实例
2015/04/07 Javascript
纯js实现无限空间大小的本地存储
2015/06/18 Javascript
Hammer.js+轮播原理实现简洁的滑屏功能
2016/02/02 Javascript
Javascript发送AJAX请求实例代码
2016/08/21 Javascript
浅谈javascript中的数据类型转换
2016/12/27 Javascript
微信小程序 中wx.chooseAddress(OBJECT)实例详解
2017/03/31 Javascript
使用nvm管理不同版本的node与npm的方法
2017/10/31 Javascript
layui之select的option叠加问题的解决方法
2018/03/08 Javascript
微信小程序拍照和摄像功能实现方法示例
2019/02/01 Javascript
解决在Vue中使用axios用form表单出现的问题
2019/10/30 Javascript
js实现鼠标拖曳效果
2020/12/30 Javascript
[00:35]DOTA2上海特级锦标赛 EG战队宣传片
2016/03/04 DOTA
python切换hosts文件代码示例
2013/12/31 Python
python简单实现基数排序算法
2015/05/16 Python
基于python的Tkinter实现一个简易计算器
2015/12/31 Python
python 读取目录下csv文件并绘制曲线v111的方法
2018/07/06 Python
Pyqt清空某一个QTreeewidgetItem下的所有分支方法
2019/06/17 Python
详解python opencv、scikit-image和PIL图像处理库比较
2019/12/26 Python
耐克巴西官方网站:Nike巴西
2016/08/14 全球购物
G-Form护具官方网站:美国运动保护装备
2019/09/04 全球购物
室内设计专业个人的自我评价
2013/10/19 职场文书
音乐专业应届生教师求职信
2013/11/04 职场文书
《葡萄沟》教学反思
2016/02/23 职场文书
整理Python中常用的conda命令操作
2021/06/15 Python
用 Python 定义 Schema 并生成 Parquet 文件详情
2021/09/25 Python