JS瀑布流实现方法实例分析


Posted in Javascript onDecember 19, 2016

本文实例分析了JS瀑布流实现方法。分享给大家供大家参考,具体如下:

描述:

1.每个图片宽度都一样,高度不一样

思路:

1.算出一共有几列(通过视窗总宽度/单个图片宽度得出)

2.根据一共几列*单个图片宽度,设置外围总宽度并水平居中(注:这个宽度应该是计算出来的,而不是定死,因为窗口大小会改变)

3.将第一行图片高度按顺序填充进数组

4.算出第一行图片里高度最短的那个,将第二行的第一张图片添加到其后(绝对定位),添加完第二行第一张,更新他的高度,然后重新计算最短,再开始之前的过程

5.鼠标在滑动滚轮时,继续加载新的图片(注:向上滚动不会加载,也不会一滚动就加载,而是向下滚动到一个临界值时才加载)

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 元素id
*/
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 相关文章推荐
禁止ajax缓存获取程序最新数据的方法
Nov 19 Javascript
JQuery表单验证插件EasyValidator用法分析
Nov 15 Javascript
node.js中的fs.fchownSync方法使用说明
Dec 16 Javascript
jquery实现左右无缝轮播图
Jul 31 Javascript
jQuery图片前后对比插件beforeAfter用法示例【附demo源码下载】
Sep 20 Javascript
Bootstrap模态框(Modal)实现过渡效果
Mar 17 Javascript
在Vue中使用highCharts绘制3d饼图的方法
Feb 08 Javascript
JavaScript循环遍历你会用哪些之小结篇
Sep 28 Javascript
vue中如何去掉空格的方法实现
Nov 09 Javascript
微信小程序分享功能onShareAppMessage(options)用法分析
Apr 24 Javascript
vue与iframe之间的信息交互的实现
Apr 08 Javascript
JS数组的常用方法整理
Mar 31 Javascript
移动端日期插件Mobiscroll.js使用详解
Dec 19 #Javascript
JavaScript闭包和范围实例详解
Dec 19 #Javascript
JS前端笔试题分析
Dec 19 #Javascript
利用vue实现模态框组件
Dec 19 #Javascript
JS中如何实现复选框全选功能
Dec 19 #Javascript
BootStrapValidator校验方式
Dec 19 #Javascript
详解js的延迟对象、跨域、模板引擎、弹出层、AJAX【附实例下载】
Dec 19 #Javascript
You might like
PHP对表单提交特殊字符的过滤和处理方法汇总
2014/02/18 PHP
zf框架的校验器InArray使用示例
2014/03/13 PHP
laravel框架创建授权策略实例分析
2019/11/22 PHP
Javascript下判断是否为闰年的Datetime包
2010/10/26 Javascript
浅说js变量
2011/05/25 Javascript
使用jQuery.fn自定义jQuery翻页插件
2013/01/20 Javascript
nodejs批量修改文件编码格式
2015/01/22 NodeJs
jQuery 1.9.1源码分析系列(十五)之动画处理
2015/12/03 Javascript
JS读写CSS样式的方法汇总
2016/08/16 Javascript
JavaScript第一篇之实现按钮全选、功能
2016/08/21 Javascript
基于JS实现checkbox全选功能实例代码
2016/10/31 Javascript
零基础轻松学JavaScript闭包
2016/12/30 Javascript
vue2.0数据双向绑定与表单bootstrap+vue组件
2017/02/27 Javascript
微信小程序实现倒计时调用相机自动拍照功能
2018/06/10 Javascript
优雅的在React项目中使用Redux的方法
2018/11/10 Javascript
浅析vue 函数配置项watch及函数 $watch 源码分享
2018/11/22 Javascript
浅谈Vue.js之初始化el以及数据的绑定说明
2019/11/14 Javascript
使用webpack搭建pixi.js开发环境
2020/02/12 Javascript
Vue实现返回顶部按钮实例代码
2020/10/21 Javascript
JavaScript中的几种继承方法示例
2020/12/06 Javascript
Python中的列表知识点汇总
2015/04/14 Python
pandas 小数位数 精度的处理方法
2018/06/09 Python
一文带你了解Python中的字符串是什么
2018/11/20 Python
详解爬虫被封的问题
2019/04/23 Python
python操作kafka实践的示例代码
2019/06/19 Python
TensorFlow实现从txt文件读取数据
2020/02/05 Python
django inspectdb 操作已有数据库数据的使用步骤
2021/02/07 Python
美体小铺英国官网:The Body Shop英国
2017/01/24 全球购物
Muziker英国:中欧最大的音乐家商店
2020/02/05 全球购物
拉飞逸官网:Lafayette 148 New York
2020/07/15 全球购物
Prototype是怎么扩展DOM的
2014/10/01 面试题
初中考试作弊检讨书
2014/02/01 职场文书
银行业务授权委托书
2014/10/10 职场文书
教师节获奖感言
2015/07/31 职场文书
一文帮你理解PReact10.5.13源码
2021/04/03 Javascript
Python的三个重要函数详解
2022/01/18 Python