您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

深入学习js瀑布流布局

2024/4/20 8:27:28发布24次查看
本文实例为大家分享了js瀑布流布局学习资料,供大家参考,具体内容如下
特点:等宽不等高。
实现方式:javascript/jquery/css3多栏布局。
样例网站:花瓣网-->分类
一、js实现瀑布流
index.html:页面结构
<!doctype html> <html> <head> <meta charset="utf-8"> <title>瀑布流布局</title> <link rel="stylesheet" href="styles/layout.css"> </head> <body> <div id="main"> <div><div><img src="../waterfall/pic/0.jpg" alt=""></div></div> <div><div><img src="../waterfall/pic/1.jpg" alt=""></div></div> <div><div><img src="../waterfall/pic/2.jpg" alt=""></div></div> <div><div><img src="../waterfall/pic/3.jpg" alt=""></div></div> <div><div><img src="../waterfall/pic/4.jpg" alt=""></div></div> <div><div><img src="../waterfall/pic/5.jpg" alt=""></div></div> <div><div><img src="../waterfall/pic/6.jpg" alt=""></div></div> <div><div><img src="../waterfall/pic/7.jpg" alt=""></div></div> <div><div><img src="../waterfall/pic/8.jpg" alt=""></div></div> <div><div><img src="../waterfall/pic/9.jpg" alt=""></div></div> <div><div><img src="../waterfall/pic/10.jpg" alt=""></div></div> <div><div><img src="../waterfall/pic/11.jpg" alt=""></div></div> <div><div><img src="../waterfall/pic/12.jpg" alt=""></div></div> <div><div><img src="../waterfall/pic/13.jpg" alt=""></div></div> <div><div><img src="../waterfall/pic/14.jpg" alt=""></div></div> <div><div><img src="../waterfall/pic/15.jpg" alt=""></div></div> <div><div><img src="../waterfall/pic/16.jpg" alt=""></div></div> <div><div><img src="../waterfall/pic/17.jpg" alt=""></div></div> <div><div><img src="../waterfall/pic/18.jpg" alt=""></div></div> <div><div><img src="../waterfall/pic/19.jpg" alt=""></div></div> <div><div><img src="../waterfall/pic/20.jpg" alt=""></div></div> <div><div><img src="../waterfall/pic/21.jpg" alt=""></div></div> <div><div><img src="../waterfall/pic/22.jpg" alt=""></div></div> <div><div><img src="../waterfall/pic/23.jpg" alt=""></div></div> <div><div><img src="../waterfall/pic/24.jpg" alt=""></div></div> <div><div><img src="../waterfall/pic/25.jpg" alt=""></div></div> <div><div><img src="../waterfall/pic/26.jpg" alt=""></div></div> <div><div><img src="../waterfall/pic/27.jpg" alt=""></div></div> <div><div><img src="../waterfall/pic/28.jpg" alt=""></div></div> <div><div><img src="../waterfall/pic/29.jpg" alt=""></div></div> <div><div><img src="../waterfall/pic/30.jpg" alt=""></div></div> <div><div><img src="../waterfall/pic/31.jpg" alt=""></div></div> <div><div><img src="../waterfall/pic/32.jpg" alt=""></div></div> <div><div><img src="../waterfall/pic/33.jpg" alt=""></div></div> <div><div><img src="../waterfall/pic/34.jpg" alt=""></div></div> <div><div><img src="../waterfall/pic/35.jpg" alt=""></div></div> <div><div><img src="../waterfall/pic/36.jpg" alt=""></div></div> <div><div><img src="../waterfall/pic/37.jpg" alt=""></div></div> <div><div><img src="../waterfall/pic/38.jpg" alt=""></div></div> <div><div><img src="../waterfall/pic/39.jpg" alt=""></div></div> <div><div><img src="../waterfall/pic/40.jpg" alt=""></div></div> <div><div><img src="../waterfall/pic/41.jpg" alt=""></div></div> <div><div><img src="../waterfall/pic/42.jpg" alt=""></div></div> <div><div><img src="../waterfall/pic/43.jpg" alt=""></div></div> </div> <script src="scripts/waterfall.js"></script> </body> </html>
layout.css:页面元素样式
*{ pdding:0; margin:0; } div#main{ position: relative; } div.box{ padding:15px 0 0 15px; float: left; } div.pic{ padding:10px; border:1px solid #ccc; border-radius:5px; box-shadow: 0 0 5px #ccc; } .pic img{ height:auto; width:165px; }
waterfall.js
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"} ] } 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 img=document.createelement("img"); img.setattribute("src",dataint.data[i]); img.src="pic/"+dataint.data[i].src; opic.appendchild(img); } dataint=null;//清空数据块,防止无限加载 waterfall('main','box');//对页面新元素进行布局渲染 } } } function waterfall(parent,box){ //将main下的class为box的所有元素取出来 var oparent=document.getelementbyid(parent); var oboxs=getbyclass(oparent,box); console.log(oboxs.length); //计算整个页面显示的列数(页面宽/box宽) var oboxw=oboxs[0].offsetwidth; // console.log(oboxw); var cols=math.floor(document.documentelement.clientwidth/oboxw); // console.log(cols); //设置main的宽 oparent.style.csstext="width:"+oboxw*cols+"px;margin:0 auto;" var harr=[];//存放每列高度的数组 for(var i=0;i<oboxs.length;i++){ if(i<cols){ harr.push(oboxs[i].offsetheight); }else{ var minh=math.min.apply(null,harr);//获取当前数组最小高度值 // console.log(minh); var index=getminhindex(harr,minh);//获取数组最小高度的索引 //console.log(index); oboxs[i].style.position="absolute";//将之后的图片依次绝对定位 oboxs[i].style.top=minh+"px"; oboxs[i].style.left=index*oboxw+"px";//计算新图片所在的位置并赋值 harr[index]+=oboxs[i].offsetheight;//变化数组列的高度值,因为加上了一张图片 } //console.log(harr); } } //根据class获取元素 function getbyclass(parent,clsname){ var boxarr=new array(),//用来存储获取到的所有class为box的元素 oelements=parent.getelementsbytagname("*"); for(var i=0;i<oelements.length;i++){ if(oelements[i].classname==clsname){ boxarr.push(oelements[i]); } } return boxarr; } function getminhindex(arr,val){ for(var i=0;i<arr.length;i++){ if(arr[i]==val){ return i; } } } //检测是否具备滚动条加载数据块条件 function checkscrollslide(){ var oparent=document.getelementbyid("main"); var oboxs=getbyclass(oparent,"box"); var lastboxh=oboxs[oboxs.length-1].offsettop+math.floor(oboxs[oboxs.length-1].offsetheight/2); var scrolltop=document.body.scrolltop||document.documentelement.scrolltop;//混杂模式和标准模式下的scrolltop获取 //console.log(scrolltop); var height=document.body.clientheight||document.documentelement.clientheight;//混杂模式和标准模式下的浏览器窗口高度获取 return (lastboxh<scrolltop+height)?true:false;//检测最后一个box高度是否小于滚动高度+窗口高度,返回布尔值 }
二、jquery
$( window ).on( "load", function(){ waterfall('main','pin'); var dataint={'data':[{'src':'1.jpg'},{'src':'2.jpg'},{'src':'3.jpg'},{'src':'4.jpg'}]}; window.onscroll=function(){ if(checkscrollside()){ $.each( dataint.data, function( index, value ){ var $opin = $('<div>').addclass('pin').appendto( $( "#main" ) ); var $obox = $('<div>').addclass('box').appendto( $opin ); $('<img>').attr('src','./images/' + $( value).attr( 'src') ).appendto($obox); }); waterfall(); }; } }); /* parend 父级id pin 元素id */ function waterfall(parent,pin){ var $apin = $( "#main>div" ); var ipinw = $apin.eq( 0 ).width();// 一个块框pin的宽 var num = math.floor( $( window ).width() / ipinw );//每行中能容纳的pin个数【窗口宽度除以一个块框宽度】 //oparent.style.csstext='width:'+ipinw*num+'px;ma rgin:0 auto;';//设置父级居中样式:定宽+自动水平外边距 $( "#main" ).css({ 'width:' : ipinw * num, 'margin': '0 auto' }); var pinharr=[];//用于存储 每列中的所有块框相加的高度。 $apin.each( function( index, value ){ var pinh = $apin.eq( index ).height(); if( index < num ){ pinharr[ index ] = pinh; //第一行中的num个块框pin 先添加进数组pinharr }else{ var minh = math.min.apply( null, pinharr );//数组pinharr中的最小值minh var minhindex = $.inarray( minh, pinharr ); $( value ).css({ 'position': 'absolute', 'top': minh + 15, 'left': $apin.eq( minhindex ).position().left }); //数组 最小高元素的高 + 添加上的apin[i]块框高 pinharr[ minhindex ] += $apin.eq( index ).height() + 15;//更新添加了块框后的列高 } }); } function checkscrollside(){ var $apin = $( "#main>div" ); var lastpinh = $apin.last().get(0).offsettop + math.floor($apin.last().height()/2);//创建【触发添加块框函数waterfall()】的高度:最后一个块框的距离网页顶部+自身高的一半(实现未滚到底就开始加载) var scrolltop = $( window ).scrolltop()//注意解决兼容性 var documenth = $( document ).height();//页面高度 return (lastpinh < scrolltop + documenth ) ? true : false;//到达指定高度后 返回true,触发waterfall()函数 }
三、css多栏布局
.container{ -webkit-column-width:160px; -moz-column-width:160px; -webkit-column-gap:5px; -moz-column-gap:5px; } /*数据块 砖块*/ .container div{width:160px; margin:4px 0;}
【css3和js实现方法比较】
--css3方式--
1:不需要计算,浏览器自动计算,只需设置1列宽,性能高
2:列宽随着浏览器宽口大小进行改变,用户体验不好;
3:图片排序按照垂直顺序排列,打乱图片显示顺序
4.图片加载还是需要js
--js方式--
js实现的瀑布流不会有上面的缺点,但是性能相对要差!
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
更多深入学习js瀑布流布局。
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product