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 相关文章推荐
Js+Dhtml:WEB程序员简易开发工具包(预先体验版)
Nov 07 Javascript
javascript得到XML某节点的子节点个数的脚本
Oct 11 Javascript
JavaScript 面向对象编程(1) 基础
May 18 Javascript
JavaScript 基础篇(一)
Mar 30 Javascript
同时使用n个window onload加载实例介绍
Apr 25 Javascript
使用 JavaScript 进行函数式编程 (一) 翻译
Oct 02 Javascript
indexedDB bootstrap angularjs之 MVC DOMO (应用示例)
Jun 20 Javascript
在点击div中的p时,如何阻止事件冒泡
Feb 07 Javascript
jQuery插件jquery.kxbdmarquee.js实现无缝滚动效果
Feb 15 Javascript
对vue.js中this.$emit的深入理解
Feb 23 Javascript
微信小程序自定义纯净模态框(弹出框)的实例代码
Mar 09 Javascript
基于JavaScript实现简单抽奖功能代码实例
Oct 20 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实现的简单分页类及用法示例
2016/05/06 PHP
利用PHP访问带有密码的Redis方法示例
2017/02/09 PHP
PHP基于XMLWriter操作xml的方法分析
2017/07/17 PHP
PHP编程快速实现数组去重的方法详解
2017/07/22 PHP
php fread函数使用方法总结
2019/05/28 PHP
laravel 获取某个查询的查询SQL语句方法
2019/10/12 PHP
基于PHP实现用户登录注册功能的详细教程
2020/08/04 PHP
Javascript中Eval函数的使用
2010/03/23 Javascript
jQuery分别获取选中的复选框值的示例
2014/06/17 Javascript
使用jQuery不判断浏览器高度解决iframe自适应高度问题
2014/12/16 Javascript
javascript实现点击商品列表checkbox实时统计金额的方法
2015/05/15 Javascript
简单的jQuery入门指引
2015/07/28 Javascript
JavaScript实现隐藏省略文字效果的方法
2017/04/27 Javascript
Vue 2.0在IE11中打开项目页面空白的问题解决
2017/07/16 Javascript
js is_valid_filename验证文件名的函数
2017/07/19 Javascript
python 第三方库的安装及pip的使用详解
2017/05/11 Python
分享给Python新手们的几道简单练习题
2017/09/21 Python
django实现登录时候输入密码错误5次锁定用户十分钟
2017/11/05 Python
Python冲顶大会 快来答题!
2018/01/17 Python
python+matplotlib实现动态绘制图片实例代码(交互式绘图)
2018/01/20 Python
Python KMeans聚类问题分析
2018/02/23 Python
朴素贝叶斯分类算法原理与Python实现与使用方法案例
2018/06/26 Python
学python爬虫能做什么
2020/07/29 Python
玩具反斗城西班牙网上商城:ToysRUs西班牙
2017/01/19 全球购物
工程部经理岗位职责
2015/02/02 职场文书
数学教师个人总结
2015/02/06 职场文书
单位考核聘任报告
2015/03/02 职场文书
质检员岗位职责范本
2015/04/07 职场文书
2015年社区纪检工作总结
2015/04/21 职场文书
教学质量月活动总结
2015/05/11 职场文书
文化大革命观后感
2015/06/17 职场文书
2015党建工作简报
2015/07/21 职场文书
新员工入职感想
2015/08/07 职场文书
“学党章、守党纪、讲党规”学习心得体会
2016/01/14 职场文书
《浅水洼里的小鱼》教学反思
2016/02/16 职场文书
python 标准库原理与用法详解之os.path篇
2021/10/24 Python