利用JavaScript制作瀑布流
2016-05-17 16:44
661 查看
今天看了网上老师关于瀑布流的教程,学习做了一个,效果如下:
(1)页面布局:
瀑布流的特点是每一个图片块等宽不等高
每一个图片块是由三部分包裹组成:
1.一个大的div,className为box,它有内边距padding,用于里面小的div之间的间隔,(用padding不用margin的原因是:js获取数据块的高度时( offsetHeight) 包括图片所在的盒子高度和数据块间的距离 offsetHeight包含padding的值而不能将margin的值计入在内),如图所示:
2.大div里面的小div,className为pic;
3.pic里面的图片img
(2)实现瀑布流方式排列:
瀑布流的原理是在确定第一行图片块的列数后,第二行开始,判断每一列的高度,新的图片块box放在高度最小的那一列下面,放完之后接下来的图片块也判断每一列的高度,放在高度最小的那一列下面,以此类推。
(3)实现图片加载功能:
原理:利用window.onscroll,当最下面一个图片块显示出一半的时候,开始加载新的图片,写一个判断函数来判断是否到最后一张图片一半,加载方式利用DOM操作,createElement和appendChild.
(1)页面布局:
瀑布流的特点是每一个图片块等宽不等高
每一个图片块是由三部分包裹组成:
1.一个大的div,className为box,它有内边距padding,用于里面小的div之间的间隔,(用padding不用margin的原因是:js获取数据块的高度时( offsetHeight) 包括图片所在的盒子高度和数据块间的距离 offsetHeight包含padding的值而不能将margin的值计入在内),如图所示:
2.大div里面的小div,className为pic;
3.pic里面的图片img
<body> <div id="main"> <div class="box"> <div class="pic"><img src="images/0.jpg" alt=""></div> </div> <div class="box"> <div class="pic"><img src="images/1.jpg" alt=""></div> </div> <div class="box"> <div class="pic"><img src="images/2.jpg" alt=""></div> </div> <div class="box"> <div class="pic"><img src="images/3.jpg" alt=""></div> </div> <div class="box"> <div class="pic"><img src="images/4.jpg" alt=""></div> </div> <div class="box"> <div class="pic"><img src="images/5.jpg" alt=""></div> </div> <div class="box"> <div class="pic"><img src="images/6.jpg" alt=""></div> </div> <div class="box"> <div class="pic"><img src="images/7.jpg" alt=""></div> </div>
*{ margin:0; padding: 0; } .main{ position: relative; } /* 用padding而不用换margin的原因:js获取数据块的高度时( offsetHeight) 包括图片所在的盒子高度和数据块间的距离 offsetHeight包含padding的值而不能将margin的值计入在内 */ .box{ padding: 15px 0 0 15px; float:left; } .pic{ padding: 10px; border: 1px solid gray; border-radius: 5px; box-shadow: 0 0 5px gray; } /* 瀑布流的特点是等宽不等高 */ .pic img{ width: 165px; height: auto; }
(2)实现瀑布流方式排列:
瀑布流的原理是在确定第一行图片块的列数后,第二行开始,判断每一列的高度,新的图片块box放在高度最小的那一列下面,放完之后接下来的图片块也判断每一列的高度,放在高度最小的那一列下面,以此类推。
//写一个函数,用于瀑布流,两个参数:(1)父元素ID(2)每个块的class function waterfall(parentId,boxClass) { //获取父元素 var oParent=document.getElementById(parentId); //获 4000 取class为boxClass的块; var aBoxs=getByclass(oParent,boxClass); //为了让浏览器变大变小的时候瀑布流的列数保持不变,要计算并确定列数,并保证父元素main的宽度不变 //换句话说,就是确定列数,求出main宽度 //每个盒子的宽度 //这里的clientWidth是页面的宽度,你刷新后伸展拉索都保持不变,但你宽度变了,在刷新,就会改变 var oBoxW=aBoxs[0].offsetWidth; //求出列数 var colsNum=Math.floor(document.documentElement.clientWidth/oBoxW); //设置父元素的宽度 oParent.style.cssText='width:'+oBoxW*colsNum+'px;margin:0 auto;'; /* alert(colsNum);*/ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////// //创建一个数组,用于保存每一列的高度,每一个块排列上去时,先判断每一列的高度,哪个最小,就放在哪个下面 var hArr=[]; for(var i=0;i<aBoxs.length;i++) { if(i<colsNum) { hArr.push(aBoxs[i].offsetHeight); } else { var minH=Math.min.apply(null,hArr); var index=getMinhIndex(hArr,minH);//得到的就是第几个块高度中最小的 //对下一个块的位置left top进行设置 aBoxs[i].style.position='absolute'; aBoxs[i].style.top=minH+'px'; aBoxs[i].style.left=aBoxs[index].offsetLeft+'px'; //aBoxs[i].style.left=oBoxW*index+'px'; hArr[index]+=aBoxs[i].offsetHeight; } } } function getByclass(oParent,sClass){ var aResult=[]; var aEle=oParent.getElementsByTagName('*'); for(var i=0;i<aEle.length;i++){ if(aEle[i].className==sClass){ aResult.push(aEle[i]); } } return aResult; } //写一个函数,知道一个数组中某个元素的值,通过这个值,找到这是数组中的第几个元素 function getMinhIndex(arr,val)//第一个参数是数组,第二个参数是某元素的值 { for(var i in arr) { if(arr[i]==val) { return i; } } }
(3)实现图片加载功能:
原理:利用window.onscroll,当最下面一个图片块显示出一半的时候,开始加载新的图片,写一个判断函数来判断是否到最后一张图片一半,加载方式利用DOM操作,createElement和appendChild.
//写一个函数,用于判断是否具备了滚条加载数据库的条件 function checkScrollSlide() { var scrollTop=document.documentElement.scrollTop||document.body.scrollTop; var clientH=document.documentElement.clientHeight; var nowScrollHeight=scrollTop+clientH; var oParent=document.getElementById('main'); var aBoxs=getByclass(oParent,'box'); var lastBoxH=aBoxs[aBoxs.length-1].offsetTop+Math.floor(aBoxs[aBoxs.length-1].offsetHeight/2); if(nowScrollHeight>lastBoxH) { return true; } else { return false; } } window.onload=function() { waterfall('main','box'); //不做连接数据库的,写一个json var dataInt={"data":[{'src':'0.jpg'},{'src':'1.jpg'},{'src':'2.jpg'},{'src':'3.jpg'},{'src':'4.jpg'},{'src':'5.jpg'},{'src':'6.jpg'},{'src':'7.jpg'},{'src':'8.jpg'},{'src':'9.jpg'},{'src':'10.jpg'},{'src':'11.jpg'},{'src':'0.jpg'},{'src':'1.jpg'},{'src':'2.jpg'}]} window.onscroll=function() { if(checkScrollSlide()) { var oParent=document.getElementById('main'); for(var i=0;i<dataInt.data.length;i++) { var oBox=document.createElement('div'); oBox.className='box'; oParent.appendChild(oBox); var oPic=document.createElement('div'); oPic.className='pic'; oBox.appendChild(oPic); var oImg=document.createElement('img'); oImg.src="images2/"+dataInt.data[i].src; oPic.appendChild(oImg); } waterfall('main','box'); } } }
相关文章推荐
- JQuery1——基础($对象,选择器,对象转换)
- Android学习笔记(二九):嵌入浏览器
- Android java 与 javascript互访(相互调用)的方法例子
- JavaScript演示排序算法
- javascript实现10进制转为N进制数
- 最后一次说说闭包
- Ajax
- 2019年开发人员应该学习的8个JavaScript框架
- HTML中的script标签研究
- 对一个分号引发的错误研究
- 异步流程控制:7 行代码学会 co 模块
- ES6 走马观花(ECMAScript2015 新特性)
- JavaScript拆分字符串时产生空字符的原因
- Canvas 在高清屏下绘制图片变模糊的解决方法
- Redux系列02:一个炒鸡简单的react+redux例子
- JavaScript 各种遍历方式详解
- call/apply/bind 的理解与实例分享