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 相关文章推荐
加载 Javascript 最佳实践
Oct 30 Javascript
jquery xMarquee实现文字水平无缝滚动效果
Apr 29 Javascript
Javascript中的Callback方法浅析
Mar 15 Javascript
js倒计时简单实现方法
Dec 17 Javascript
详细总结Javascript中的焦点管理
Sep 17 Javascript
jQuery实现拖动效果的实例代码
Jun 25 jQuery
JavaScript实现元素滚动条到达一定位置循环追加内容
Dec 28 Javascript
基于openlayers4实现点的扩散效果
Aug 17 Javascript
使用vue-router设置每个页面的title方法
Feb 11 Javascript
原生js封装的ajax方法示例
Aug 02 Javascript
Vue extend的基本用法(实例详解)
Dec 09 Javascript
SpringBoot+Vue开发之Login校验规则、实现登录和重置事件
Oct 19 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实现的css文件背景图片下载器代码
2014/11/11 PHP
php实现基于微信公众平台开发SDK(demo)扩展的方法
2014/12/22 PHP
PHP利用APC模块实现文件上传进度条的方法
2015/01/26 PHP
PHP随机生成信用卡卡号的方法
2015/03/23 PHP
php使用PDO事务配合表格读取大量数据插入操作实现方法
2017/02/16 PHP
thinkPHP实现的联动菜单功能详解
2017/05/05 PHP
jQuery实现带有动画效果的回到顶部和底部代码
2015/11/04 Javascript
jquery采用oop模式class类的使用示例
2016/01/22 Javascript
jQuery对checkbox 复选框的全选全不选反选的操作
2016/08/09 Javascript
jQuery实现的tab标签切换效果示例
2016/09/05 Javascript
AngularJS过滤器filter用法实例分析
2016/11/04 Javascript
EasyUI为Numberbox添加blur事件的方法
2017/03/05 Javascript
如何解决vue与传统jquery插件冲突
2017/03/20 Javascript
AngulaJS路由 ui-router 传参实例
2017/04/28 Javascript
vue-cli构建项目下使用微信分享功能
2018/05/28 Javascript
Nautil 中使用双向数据绑定的实现
2019/10/02 Javascript
在Vue中使用CSS3实现内容无缝滚动的示例代码
2020/11/27 Vue.js
[04:39]显微镜下的DOTA2第十三期—Pis卡尔个人秀
2014/04/04 DOTA
[01:21:36]CHAOS vs Alliacne 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
浅谈Django自定义模板标签template_tags的用处
2017/12/20 Python
用TensorFlow实现戴明回归算法的示例
2018/05/02 Python
TensorFlow打印tensor值的实现方法
2018/07/27 Python
Python实现删除排序数组中重复项的两种方法示例
2019/01/31 Python
python 返回一个列表中第二大的数方法
2019/07/09 Python
python中的逆序遍历实例
2019/12/25 Python
Python list运算操作代码实例解析
2020/01/20 Python
tensorflow 环境变量设置方式
2020/02/06 Python
基于python和flask实现http接口过程解析
2020/06/15 Python
python interpolate插值实例
2020/07/06 Python
python自动提取文本中的时间(包含中文日期)
2020/08/31 Python
全球异乡人的跨境社交电商平台:Kouhigh口嗨网
2020/07/24 全球购物
求职信标题怎么写
2014/05/26 职场文书
某集团股份有限公司委托书样本
2014/09/24 职场文书
《陶罐和铁罐》教学反思
2016/03/03 职场文书
创业计划书之电动车企业
2019/10/11 职场文书
安装pytorch时报sslerror错误的解决方案
2021/05/17 Python