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 相关文章推荐
两个select之间option的互相添加操作(jquery实现)
Nov 12 Javascript
javascript 隔行换色函数代码
Oct 24 Javascript
如何确保JavaScript的执行顺序 之jQuery.html深度分析
Mar 03 Javascript
jQuery Mobile弹出窗、弹出层知识汇总
Jan 05 Javascript
js实现楼层效果的简单实例
Jul 15 Javascript
Bootstrapvalidator校验、校验清除重置的实现代码(推荐)
Sep 28 Javascript
JS中使用gulp实现压缩文件及浏览器热加载功能
Jul 12 Javascript
利用jQuery实现简单的拖曳效果实例代码
Oct 20 jQuery
基于js文件加载优化(详解)
Jan 03 Javascript
vue-router 源码实现前端路由的两种方式
Jul 02 Javascript
解决Vue中引入swiper,在数据渲染的时候,发生不滑动的问题
Sep 27 Javascript
vue打开子组件弹窗都刷新功能的实现
Sep 21 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+Tidy-完美的XHTML纠错+过滤
2007/04/10 PHP
PHP执行速率优化技巧小结
2008/03/15 PHP
php后台程序与Javascript的两种交互方式
2009/10/25 PHP
Apache中php.ini的设置方法
2013/02/28 PHP
实测在class的function中include的文件中非php的global全局环境
2013/07/15 PHP
PHP获取短链接跳转后的真实地址和响应头信息的方法
2014/07/25 PHP
jQuery+Ajax+PHP“喜欢”评级功能实现代码
2015/10/08 PHP
Yii框架创建cronjob定时任务的方法分析
2017/05/23 PHP
javascript function、指针及内置对象
2009/02/19 Javascript
Javascript创建Silverlight Plugin以及自定义nonSilverlight和lowSilverlight样式
2010/06/28 Javascript
通过jQuery源码学习javascript(一)
2012/12/27 Javascript
漂亮的jquery提示效果(仿腾讯弹出层)
2013/02/05 Javascript
Jquery实现侧边栏跟随滚动条固定(兼容IE6)
2014/04/02 Javascript
用js读写cookie的简单方法(推荐)
2016/08/08 Javascript
jQuery删除节点用法示例(remove方法)
2016/09/08 Javascript
纯JS单页面赛车游戏制作代码分享
2017/03/03 Javascript
关于Webpack dev server热加载失败的解决方法
2018/02/22 Javascript
JS实现计算小于非负数n的素数的数量算法示例
2019/02/26 Javascript
Python3实现将文件归档到zip文件及从zip文件中读取数据的方法
2015/05/22 Python
使用httplib模块来制作Python下HTTP客户端的方法
2015/06/19 Python
深入理解Python 关于supper 的 用法和原理
2018/02/28 Python
pytorch训练imagenet分类的方法
2018/07/27 Python
Python文件打开方式实例详解【a、a+、r+、w+区别】
2019/03/30 Python
python rsa实现数据加密和解密、签名加密和验签功能
2019/09/18 Python
python解包用法详解
2021/02/17 Python
加拿大领先家居家具网上购物:Aosom.ca
2020/05/27 全球购物
中专毕业生的自我鉴定
2013/12/01 职场文书
生物科学专业个人求职信范文
2013/12/05 职场文书
教育科研先进个人材料
2014/01/26 职场文书
《盲人摸象》教学反思
2014/02/16 职场文书
《金子》教学反思
2014/04/13 职场文书
运动会搞笑广播稿
2014/10/14 职场文书
后进基层党组织整改方案
2014/10/25 职场文书
2014年学校禁毒工作总结
2014/12/23 职场文书
2016党员干部政治学习心得体会
2016/01/23 职场文书
vue3中provide && inject的使用
2021/07/01 Vue.js