标签:布局 javascript
瀑布式布局适合于小数据块,每个数据块内容相近且没有侧重。通常,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部。所以,我们形象的称此类布局为瀑布流布局。
在此之前,我们用CSS实现此类布局,通常会有以下两种方式:
1.传统多列浮动
虽然说这种布局方式很简单,也不需要明确的知道数据块的高度。但是如果浏览器窗口大小变化时,只能固定X列,很难调整数据块的排列。
2.CSS多列布局
需要使用到CSS3中一项属性:column。我们需要指定容器的列个数、列间距、列中间边框、列宽度来实现
#container { -webkit-column-count: 5; /*-webkit-column-gap: 10px; -webkit-column-rule: 5px solid #333; -webkit-column-width: 210px;*/ -moz-column-count: 5; /*-moz-column-gap: 20px; -moz-column-rule: 5px solid #333; -moz-column-width: 210px;*/ column-count: 5; /*column-gap: 10px; column-rule: 5px solid #333; column-width: 210px;*/ }但是我们考虑这样一个问题,此类方法的实现思路是从上到下排列到一定高度后,再把剩余元素依次添加到下一列,这个与我们之前所欲想的思路是完全相悖的。因此,它更适用于文字多栏排列。
所以,我们考虑用JavaScript来实现绝对定位下的瀑布流布局。
先说一下实现思路:
至于我们是怎样创建一个工程,怎样把图片资源添加进去这些一啪啦琐碎的事,我也就不再说了(Ps.哈哈哈~~~怎么办,就是懒。也是任性O(∩_∩)O)
在html文件中,我们先使用几个div模型充当容器,里面盛放我们想要盛放的内容,这里我们使用的图片瀑布流的形式来展示
<body> <div id="contenter"> <div class="box"> <div class="box_img"> <img src="image/img1.jpg"> </div> </div> <div class="box"> <div class="box_img"> <img src="image/img2.jpg"> </div> </div> <div class="box"> <div class="box_img"> <img src="image/img3.jpeg"> </div> </div> <div class="box"> <div class="box_img"> <img src="image/img5.jpeg"> </div> </div> <div class="box"> <div class="box_img"> <img src="image/img6.jpeg"> </div> </div> <div class="box"> <div class="box_img"> <img src="image/img7.jpeg"> </div> </div> <div class="box"> <div class="box_img"> <img src="image/img8.jpeg"> </div> </div> <div class="box"> <div class="box_img"> <img src="image/img9.jpeg"> </div> </div> <div class="box"> <div class="box_img"> <img src="image/img10.jpeg"> </div> </div> <div class="box"> <div class="box_img"> <img src="image/img11.jpeg"> </div> </div> </div> </body>在开始的时候,我们先默认加载10张图片,然后我们在css文件中,更改他们的样式
*{ margin: 0; padding: 0; } /*父容器采用相对定位的方式*/ #contenter{ position: relative; } /*向左浮动*/ .box{ float: left; padding: 5px; } .box_img{ padding: 5px; border: 1px solid #cccccc; box-shadow: 0 0 5px #cccccc; border-radius:5px; } .box_img img{ width: 200px; height: auto; }最后,我们在js文件中,开始具体的实现瀑布流布局
/** * Created by pc on 2015/8/28. */ window.onload = function(){ imgLocation("contenter","box"); var imgData = {"data":[{"src":"img12.jpeg"},{"src":"img13.jpg"},{"src":"img14.jpg"},{"src":"img15.jpeg"},{"src":"img16.jpeg"},{"src":"img17.jpeg"},{"src":"img18.jpeg"}]}; /*不断加载新的内容*/ window.onscroll = function(){ if(checkFlag()){ var parentid = document.getElementById("contenter"); for(var i =0;i<imgData.data.length;i++){ var childcontent = document.createElement("div"); childcontent.className="box"; parentid.appendChild(childcontent); var boximg = document.createElement("div"); boximg.className = "box_img"; childcontent.appendChild(boximg); var img = document.createElement("img"); img.src = "image/"+imgData.data[i].src; boximg.appendChild(img); } imgLocation("contenter","box"); } } } /*确定图片摆放位置*/ function imgLocation(parent,content){ /* 将父级元素下的content全部提取出来*/ var parentid = document.getElementById(parent); var childelement = getChildElement(parentid,content); /*每张图片的宽度一样,所以我们只需要提取第一张图片的宽度*/ var imgWidth = childelement[0].offsetWidth; /*确定每排放的列数*/ var cols = Math.floor(document.documentElement.clientWidth/imgWidth); parentid.style.cssText = "width:"+imgWidth*cols+"px;margin:0 auto"; /*确定一个存放图片高度的数组*/ var imgHeightArr = []; for(var i=0;i<childelement.length;i++){ if(i<cols){ imgHeightArr[i]=childelement[i].offsetHeight; }else{ /*找到每列当中最小的高度,将剩余的图片排列到下方*/ var minHeight = Math.min.apply(null,imgHeightArr); var minIndex = getMinHeightLocation(imgHeightArr,minHeight); /*使用绝对定位的方法,确定图片的摆放位置*/ childelement[i].style.position = "absolute"; childelement[i].style.top = minHeight +"px"; childelement[i].style.left = childelement[minIndex].offsetLeft + "px"; imgHeightArr[minIndex] = imgHeightArr[minIndex]+childelement[i].offsetHeight; } } } /*得到最小高度图片的位置*/ function getMinHeightLocation(imgHeightArr,minHeight){ for(var i in imgHeightArr){ if(imgHeightArr[i] == minHeight){ return i; } } } /*得到子级元素*/ function getChildElement(parent,content){ var colArr=[]; /*将所有元素提取出来,存放到一个数组当中*/ var allchildelement = parent.getElementsByTagName("*"); for(var i=0;i<allchildelement.length;i++){ if(allchildelement[i].className ==content){ colArr.push(allchildelement[i]); } } return colArr; } /*判断滚动条是否在页面最下端*/ function checkFlag(){ var parentid = document.getElementById("contenter"); var childelement = getChildElement(parentid,"box"); /*以最下方的图片作为判断依据*/ var lastElementHeight = childelement[childelement.length-1].offsetTop; var scrollTop = document.documentElement.scrollTop||document.body.scrollTop; var pageHeight = document.documentElement.clientHeight||document.body.clientHeight; if(lastElementHeight<scrollTop+pageHeight){ return true; } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
标签:布局 javascript
原文地址:http://blog.csdn.net/u011318165/article/details/48050751