javascript实现仿百度图片的瀑布流加载效果


Posted in Javascript onApril 20, 2016

由于没有服务器,就用一个json字符串作为下拉时加载图片数据的来源了

html:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<script src="js/waterfall.js"></script>
<style type="text/css">
 *{padding: 0;margin:0;}
 #main{
  position: relative;
 }
 .pin{
  padding: 15px 0 0 15px;
  float:left;
 }
 .box{
  padding: 10px;
  border:1px solid #ccc;
  box-shadow: 0 0 6px #ccc;
  border-radius: 5px;
 }
 .box img{
  width:162px;
  height:auto;
 }
</style>
</head>
<body>
<div id="main">
 <div class="pin">
  <div class="box">
   <img src="./images/1.jpg"/>
  </div>
 </div>
 <div class="pin">
  <div class="box">
   <img src="./images/2.jpg"/>
  </div>
 </div>
 <div class="pin">
  <div class="box">
   <img src="./images/3.jpg"/>
  </div>
 </div>
 <div class="pin">
  <div class="box">
   <img src="./images/4.jpg"/>
  </div>
 </div>
 <div class="pin">
  <div class="box">
   <img src="./images/5.jpg"/>
  </div>
 </div>
 <div class="pin">
  <div class="box">
   <img src="./images/6.jpg"/>
  </div>
 </div>
 <div class="pin">
  <div class="box">
   <img src="./images/7.jpg"/>
  </div>
 </div>
 <div class="pin">
  <div class="box">
   <img src="./images/8.jpg"/>
  </div>
 </div>
 <div class="pin">
  <div class="box">
   <img src="./images/9.jpg"/>
  </div>
 </div>
 <div class="pin">
  <div class="box">
   <img src="./images/10.jpg"/>
  </div>
 </div>
 <div class="pin">
  <div class="box">
   <img src="./images/11.jpg"/>
  </div>
 </div>
 <div class="pin">
  <div class="box">
   <img src="./images/12.jpg"/>
  </div>
 </div>
 <div class="pin">
  <div class="box">
   <img src="./images/13.jpg"/>
  </div>
 </div>
 <div class="pin">
  <div class="box">
   <img src="./images/14.jpg"/>
  </div>
 </div>
 <div class="pin">
  <div class="box">
   <img src="./images/15.jpg"/>
  </div>
 </div>
 <div class="pin">
  <div class="box">
   <img src="./images/16.jpg"/>
  </div>
 </div>
 <div class="pin">
  <div class="box">
   <img src="./images/17.jpg"/>
  </div>
 </div>
 <div class="pin">
  <div class="box">
   <img src="./images/18.jpg"/>
  </div>
 </div>
 <div class="pin">
  <div class="box">
   <img src="./images/19.jpg"/>
  </div>
 </div>
 <div class="pin">
  <div class="box">
   <img src="./images/20.jpg"/>
  </div>
 </div>
 <div class="pin">
  <div class="box">
   <img src="./images/21.jpg"/>
  </div>
 </div>
</div>
</body>
</html>

JSWallper.js:

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=[];//用于存储 每列中的所有块框相加的高度。a
 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实现仿百度图片的瀑布流加载效果

源码下载:https://3water.com/jiaoben/452663.html

演示地址:http://demo.3water.com/js/2016/JSWallper/

Javascript 相关文章推荐
javascript getElementsByClassName实现代码
Oct 11 Javascript
Javascript 鼠标移动上去 滑块跟随效果代码分享
Nov 23 Javascript
jQuery.event兼容各浏览器的event详细解析
Dec 18 Javascript
JavaScript实现带播放列表的音乐播放器实例分享
Mar 07 Javascript
Easyui的组合框的取值与赋值
Oct 28 Javascript
解决vue-cli + webpack 新建项目出错的问题
Mar 20 Javascript
详解通过源码解析Node.js中cluster模块的主要功能实现
May 16 Javascript
JavaScript使用prototype原型实现的封装继承多态示例
Aug 31 Javascript
js数组去重的方法总结
Jan 18 Javascript
Vue Autocomplete 自动完成功能简单示例
May 25 Javascript
有关vue 开发钉钉 H5 微应用 dd.ready() 不执行问题及快速解决方案
May 09 Javascript
js面向对象方式实现拖拽效果
Mar 03 Javascript
jquery使用Cookie和JSON记录用户最近浏览历史
Apr 19 #Javascript
javascript实现简单计算器效果【推荐】
Apr 19 #Javascript
Jquery实现的简单轮播效果【附实例】
Apr 19 #Javascript
jQuery实现选项联动轮播效果【附实例】
Apr 19 #Javascript
浅析JavaScript中浏览器的兼容问题
Apr 19 #Javascript
javascript+HTML5 Canvas绘制转盘抽奖
May 16 #Javascript
深入浅析JavaScript中的constructor
Apr 19 #Javascript
You might like
php生成随机数或者字符串的代码
2008/09/05 PHP
深入file_get_contents函数抓取内容失败的原因分析
2013/06/25 PHP
Apache实现Web Server负载均衡详解(不考虑Session版)
2013/07/05 PHP
基于php双引号中访问数组元素报错的解决方法
2018/02/01 PHP
Thinkphp 框架扩展之Widget扩展实现方法分析
2020/04/23 PHP
jQuery Ajax之load()方法
2009/10/12 Javascript
JavaScript 放大镜 移动镜片效果代码
2011/05/09 Javascript
jquery $.getJSON()跨域请求
2011/12/21 Javascript
jQuery动态创建html元素的常用方法汇总
2014/09/05 Javascript
一个JavaScript处理textarea中的字符成每一行实例
2014/09/22 Javascript
node.js中的fs.lchmodSync方法使用说明
2014/12/16 Javascript
jQuery支持添加事件的日历特效代码分享(3种样式)
2015/08/24 Javascript
jQuery复制表单元素附源码分享效果演示
2015/09/30 Javascript
JS实现动态生成表格并提交表格数据向后端
2020/11/25 Javascript
浅谈JavaScript对象的创建方式
2016/06/13 Javascript
微信小程序 LOL 英雄介绍开发实例
2016/09/30 Javascript
jQuery延迟执行的实现方法
2016/12/21 Javascript
原生js实现选项卡功能
2017/03/08 Javascript
整理关于Bootstrap过渡动画的慕课笔记
2017/03/29 Javascript
vue实现移动端省市区选择
2019/09/27 Javascript
js基础之事件捕获与冒泡原理
2019/10/09 Javascript
Vue $emit()不能触发父组件方法的原因及解决
2020/07/28 Javascript
微信小程序实现可拖动悬浮图标(包括按钮角标的实现)
2020/12/29 Javascript
ES2020让代码更优美的运算符 (?.) (??)
2021/01/04 Javascript
浅谈python新式类和旧式类区别
2019/04/26 Python
重写子类方法时,抛出异常的书写注意事项
2015/10/17 面试题
打架检讨书50字
2014/01/11 职场文书
单位实习证明怎么写
2014/01/17 职场文书
聚美优品广告词改编
2014/03/14 职场文书
物理学专业求职信
2014/07/04 职场文书
湖南省召开党的群众路线教育实践活动总结大会报告
2014/10/21 职场文书
党的群众路线教育实践活动领导班子整改方案
2014/10/25 职场文书
MySQL infobright的安装步骤
2021/04/07 MySQL
python使用XPath解析数据爬取起点小说网数据
2021/04/22 Python
解决mysql的int型主键自增问题
2021/07/15 MySQL
flex弹性布局详解
2022/03/20 HTML / CSS