瀑布流布局
Posted 海贼还在贼贼笑
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了瀑布流布局相关的知识,希望对你有一定的参考价值。
瀑布流布局学习
- 特点:等宽不等高。
- 实现方式:javascript/Jquery/CSS3多栏布局。
- 样例网站:花瓣网-->分类(http://huaban.com/)
一、JS实现瀑布流
index.html:页面结构
View Code
layout.css:页面元素样式
View Code
waterfall.js
1 window.onload=function(){ 2 waterFall(\'main\',\'box\'); 3 //模拟后台相应数据json 4 var dataInt={ 5 "data": 6 [ 7 {"src":"0.jpg"}, 8 {"src":"1.jpg"}, 9 {"src":"2.jpg"}, 10 {"src":"3.jpg"}, 11 {"src":"4.jpg"}, 12 {"src":"5.jpg"}, 13 {"src":"6.jpg"} 14 ] 15 } 16 window.onscroll=function(){ 17 if(checkScrollSlide){ 18 //将数据块渲染到当前页面的尾部 19 var oParent=document.getElementById("main"); 20 for(var i=0;i<dataInt.data.length;i++){ 21 var oBox=document.createElement("div"); 22 oBox.className="box"; 23 oParent.appendChild(oBox); 24 var oPic=document.createElement("div"); 25 oPic.className="pic"; 26 oBox.appendChild(oPic); 27 var img=document.createElement("img"); 28 img.setAttribute("src",dataInt.data[i]); 29 img.src="pic/"+dataInt.data[i].src; 30 oPic.appendChild(img); 31 } 32 dataInt=null;//清空数据块,防止无限加载 33 waterFall(\'main\',\'box\');//对页面新元素进行布局渲染 34 } 35 } 36 } 37 function waterFall(parent,box){ 38 //将main下的class为box的所有元素取出来 39 var oParent=document.getElementById(parent); 40 var oBoxs=getByClass(oParent,box); 41 console.log(oBoxs.length); 42 //计算整个页面显示的列数(页面宽/box宽) 43 var oBoxW=oBoxs[0].offsetWidth; 44 // console.log(oBoxW); 45 var cols=Math.floor(document.documentElement.clientWidth/oBoxW); 46 // console.log(cols); 47 //设置main的宽 48 oParent.style.cssText="width:"+oBoxW*cols+"px;margin:0 auto;" 49 var hArr=[];//存放每列高度的数组 50 for(var i=0;i<oBoxs.length;i++){ 51 if(i<cols){ 52 hArr.push(oBoxs[i].offsetHeight); 53 }else{ 54 var minH=Math.min.apply(null,hArr);//获取当前数组最小高度值 55 // console.log(minH); 56 var index=getMinhIndex(hArr,minH);//获取数组最小高度的索引 57 //console.log(index); 58 oBoxs[i].style.position="absolute";//将之后的图片依次绝对定位 59 oBoxs[i].style.top=minH+"px"; 60 oBoxs[i].style.left=index*oBoxW+"px";//计算新图片所在的位置并赋值 61 hArr[index]+=oBoxs[i].offsetHeight;//变化数组列的高度值,因为加上了一张图片 62 } 63 //console.log(hArr); 64 } 65 66 } 67 //根据class获取元素 68 function getByClass(parent,clsName){ 69 var boxArr=new Array(),//用来存储获取到的所有class为box的元素 70 oElements=parent.getElementsByTagName("*"); 71 for(var i=0;i<oElements.length;i++){ 72 if(oElements[i].className==clsName){ 73 boxArr.push(oElements[i]); 74 } 75 } 76 return boxArr; 77 } 78 function getMinhIndex(arr,val){ 79 for(var i=0;i<arr.length;i++){ 80 if(arr[i]==val){ 81 return i; 82 } 83 } 84 85 } 86 //检测是否具备滚动条加载数据块条件 87 function checkScrollSlide(){ 88 var oParent=document.getElementById("main"); 89 var oBoxs=getByClass(oParent,"box"); 90 var lastBoxH=oBoxs[oBoxs.length-1].offsetTop+Math.floor(oBoxs[oBoxs.length-1].offsetHeight/2); 91 var scrollTop=document.body.scrollTop||document.documentElement.scrollTop;//混杂模式和标准模式下的scrollTop获取 92 //console.log(scrollTop); 93 var height=document.body.clientHeight||document.documentElement.clientHeight;//混杂模式和标准模式下的浏览器窗口高度获取 94 return (lastBoxH<scrollTop+height)?true:false;//检测最后一个box高度是否小于滚动高度+窗口高度,返回布尔值 95 96 }
二、JQuery
1 $( window ).on( "load", function(){ 2 waterfall(\'main\',\'pin\'); 3 var dataInt={\'data\':[{\'src\':\'1.jpg\'},{\'src\':\'2.jpg\'},{\'src\':\'3.jpg\'},{\'src\':\'4.jpg\'}]}; 4 window.onscroll=function(){ 5 if(checkscrollside()){ 6 $.each( dataInt.data, function( index, value ){ 7 var $oPin = $(\'<div>\').addClass(\'pin\').appendTo( $( "#main" ) ); 8 var $oBox = $(\'<div>\').addClass(\'box\').appendTo( $oPin ); 9 $(\'<img>\').attr(\'src\',\'./images/\' + $( value).attr( \'src\') ).appendTo($oBox); 10 }); 11 waterfall(); 12 }; 13 } 14 }); 15 16 /* 17 parend 父级id 18 pin 元素id 19 */ 20 function waterfall(parent,pin){ 21 var $aPin = $( "#main>div" ); 22 var iPinW = $aPin.eq( 0 ).width();// 一个块框pin的宽 23 var num = Math.floor( $( window ).width() / iPinW );//每行中能容纳的pin个数【窗口宽度除以一个块框宽度】 24 //oParent.style.cssText=\'width:\'+iPinW*num+\'px;ma rgin:0 auto;\';//设置父级居中样式:定宽+自动水平外边距 25 $( "#main" ).css({ 26 \'width:\' : iPinW * num, 27 \'margin\': \'0 auto\' 28 }); 29 30 var pinHArr=[];//用于存储 每列中的所有块框相加的高度。 31 32 $aPin.each( function( index, value ){ 33 var pinH = $aPin.eq( index ).height(); 34 if( index < num ){ 35 pinHArr[ index ] = pinH; //第一行中的num个块框pin 先添加进数组pinHArr 36 }else{ 37 var minH = Math.min.apply( null, pinHArr );//数组pinHArr中的最小值minH 38 var minHIndex = $.inArray( minH, pinHArr ); 39 $( value ).css({ 40 \'position\': \'absolute\', 41 \'top\': minH + 15, 42 \'left\': $aPin.eq( minHIndex ).position().left 43 }); 44 //数组 最小高元素的高 + 添加上的aPin[i]块框高 45 pinHArr[ minHIndex ] += $aPin.eq( index ).height() + 15;//更新添加了块框后的列高 46 } 47 }); 48 } 49 50 function checkscrollside(){ 51 var $aPin = $( "#main>div" ); 52 var lastPinH = $aPin.last().get(0).offsetTop + Math.floor($aPin.last().height()/2);//创建【触发添加块框函数waterfall()】的高度:最后一个块框的距离网页顶部+自身高的一半(实现未滚到底就开始加载) 53 var scrollTop = $( window ).scrollTop()//注意解决兼容性 54 var documentH = $( document ).height();//页面高度 55 return (lastPinH < scrollTop + documentH ) ? true : false;//到达指定高度后 返回true,触发waterfall()函数 56 }
三、CSS多栏布局
1 .container{ 2 -webkit-column-width:160px; 3 -moz-column-width:160px; 4 -webkit-column-gap:5px; 5 -moz-column-gap:5px; 6 } 7 8 9 /*数据块 砖块*/ 10 11 .container div{width:160px; 12 margin:4px 0;}
【css3和js实现方法比较】 --css3方式-- 1:不需要计算,浏览器自动计算,只需设置1列宽,性能高 2:列宽随着浏览器宽口大小进行改变,用户体验不好; 3:图片排序按照垂直顺序排列,打乱图片显示顺序 4.图片加载还是需要js --js方式-- js实现的瀑布流不会有上面的缺点,但是性能相对要差!
以上是关于瀑布流布局的主要内容,如果未能解决你的问题,请参考以下文章