ISSN 1009-3044 E—mail:xsjl@dnzs.net.cn http://www.dnzs.net.cn Tel:+86—551-65690963 65690964 ComputerKnowle内eandTechnology电脑知识与技术 Vo1.12,No.25,September 2016 瀑布流布局的多种实现方式及其比较研究 董春侠,司占军,张海月 (天津科技大学包装与印刷工程学院,天津300222) 摘要:瀑布流布局突破了传统网页的布局方式,不仅设计独特,更能带来良好的用户体验,使得展示类网站在视觉和功效 上得到统一。该文从瀑布流布局的核心点出发,首先介绍瀑布流布局的原理,然后利用JavaScript、jQuery、CSS3三种方法 实现瀑布流布局效果,并介绍其用到的相关知识点,最后对三种实现方式进行比较,分析其各自性能的优缺点。 关键词:瀑布流布局;JavaScript;jQuery;CSS3 中图分类号:TP311 文献标识码:A 章编号:1009.3044(2016)25-0053.03 AVariety ofImplementationMethods ofWaterfallFlowLayoutandThekComparison DONG Chun-xia,SI Zhan-jun,ZHANG Hai・yue (School ofPackaging and Printing Works,Tinjain Universiy tof Science and Technology,Tianjin 300222,China) Abstract:Waterfall flow layout broke through the traditional web page layout.It not only has unique design style,but also carl bring a good user experience,SO that the display websites can make a accordance in the visual and effectiveness.This paper starts from the core point of the waterfall flow layout.First,the principle of waterfall flow layout was introduced,Then use three mehodst as JavaScript,jQuery,css3 to achieve het effect of hte watefarll lfow layout,and introduce the relevant knowledge.Fi— nally,the advantages and disadvantages of the three methods were compared analyzed. Key words:waterfall lfow layout;javascript;jquery;css3 1背景 在“读图时代”的背景下,人们在获取信息时希望通过一种 轻松愉快的方式n ,在面对大量图片汹涌而来时,传统的表格布 局、DIV+CSS布局已经不能满足网页的布局要求,新型的瀑布 流布局的出现改变了这一现状,成为目前展示类网站中常用的 一据,即下拉滚动时,触发加载数据操作,并把数据添加到目标容 器中 。 2.1数据块排列(对容器中已有元素nnm个进行排列)实现思路 如下 1)固定数据块的宽度; 种布局方式。最早采用此布局的网站是Pinterest,浏览者通 的浏览过程,符合人们在移动互联网时代快速浏览的习惯,因 2)初始化,对容器中已有数据块元素进行计算,获取可视 区域的宽度clientW和数据块的宽度oBoxW,计算页面中的列 数cols(clientW/oBoxW); 3)设置容器的宽度(cols*oBoxW)和居中样式; 过快速扫视屏幕就可以在短时间内获得大量的信息,大大简化 此备受追捧 。懒加载模式是瀑布流布局的另外一大亮点,用 户不需要通过点击鼠标进行翻页,而是通过滑动鼠标滚轮来获 取更多信息 。 瀑布流布局的技术实现主要是应用JavaScript技术或 jQuery等Js框架,实现方法的原理基本都相同 。本文采用多 种方式实现瀑布流布局,并对它们进行比较,分析其各自性能 的优缺点。 4)定义一个数组hart用来存放每列的高度; 5)获取hAir中最小的值minH及其所在的索引index; 6)循环遍历容器中的所有数据块,将其放在minH所在列 的下面,根据index,确定该数据块的left,top值,left为所在列的 序号index乘以列宽cols,top为所在列的当前高度; 2瀑布流布局的实现原理 瀑布流是一种网站页面布局的形象化描述,其特点是采用 定宽而不定高的设计,实现原理主要包含两个部分,一个是对 7)更新所在列的当前高度,值为当前高度加上这个数据块 元素的高度。 2.2动态加载数据 现有数据块进行排列计算各自所在的位置;二是动态加载数 1)绑定滚动事件,并确定预加载线高度值,即滚动到哪个 高度后,需要去加载数据,这里以容器中最后一个数据块的高 收稿日期:2016—07—28 作者简介:董春侠(1992一),女,安徽宿州人,学生,天津科技大学包装与印刷工程学院硕士在读,主要研究方向为数字出版,web前 端;司占军(1971一),男,河北张家口人,天津科技大学包装与印刷工程学院教授、硕士生导师,硕士,主要研究方向为数 字出版技术,虚拟现实;张海月(1992一),女,天津人,学生,天津科技大学包装与印刷工程学院硕士在读,主要研究方向 为数字出版,虚拟现实。 本栏目责任编辑:谢媛媛 软件设计开发 53 ComputerKnowledge and Technology电脑知识‘ 技术 第12卷第25期(2016年9月) 3.2效果实现 度(1astBoxH)与滚动距离(scro1]Top) ̄ll页面高度(height)之和进 行比较,若lastBoxH<scroll Fop+height,进行加载数据,若last— BoxH>scrollTop+height不进行加载; 3.2.1 JavaScript实现瀑布流布局 2)将新加载的数据渲染到页面中。 首先确定页面中数据块的列数,然后将第一行数据块的高 [ / 7 I计算判数ooI 3(窗口竟 列竟)I 度存放在数组中,对剩下的数据块进行遍历.将其定位在每列 高度最小的那一列。核心代码如下: function waterfall(parent,box){ //:te ̄main下面所有class为box的元素取jIJ来 var oPanent=document.ge【ElemenfById(”main”); var oB0xs=getByClass(oPanent,box); 1 j毫盒子的高度逛加在致蛆h^r r中I :数 肼算整个页面的列数(页面宽度/box宽度) var oBoxW=oBoxs[0].offsetWidth; var cols=Math.lfoor(document.doeumentElement.client・ Width/oBoxW); ;据 排 列 E 块 厂 l求出hat r中量 1、值及其索引l+———一l辖下一个娃据块定位在高度量小的判l : : 0 auto ; //设置main的宽度和居中显示 oPanent.style.(・ssText= widtla: +oBoxW cols+ px;margin: 匪 var hArr=[];//存放每一列高度的数组 for(var i=0;i<oBoxs.1ength;i++){ I< 粤 羞列 加 数 面 ’薨 据 1if(i<cols){ hAlIr.push(oBoxs[i].offsetHeight); }else{ var minH=Math.arin.apply(null,hArr); var index=getMinlndex(hArr,minH); 图1瀑布流算法流程图 oBoxs[i].style.posili0n=,abs()lute ; oBoxs[i].style.top=minH+。’px”: oBoxs[i].style.1efl=oBoxW index+ px : hArrlindex]+=oBoxs[il.offsetHeight, 1 } J 3实现方式 瀑布流布局可以用三种方式进行实现:原生JavaSeript、 jQuery和CSS3,然后利用Jason数据模拟后台数据库来不断提 供新的数据,再应用JavaScript动态加载数据块,并渲染到页面 中。 3.1页面结构布局 最终实现效果冈曳I】下罔2: 瀑布流布局以是以数据块来显示数据的,各个数据块的样 式基本相同,不同之处在于数据块内部的文字和图片,因此页 面结构的布局代码如下: <dI、r id=”main”> <div class=”box’’> <div class=”img”> <img SFC=”img/1.JPg”ah=”风景1”> </div> </div> <div(,lass=”box”> <div class=”img’ > <img src=”img/2.JPg”ah=”风景2”> </div> <,(jiv> 图2 JavaScript实现瀑布流的效果图 </div> 3.2.2 jQuery实现瀑布流布局 数据块的单元是class为box的div盒子。在设置样式时, class为main的盒子的positim1应设置为relative。方便后来对数 jQuery实现瀑布流的原理与JavaScript基本相同,借助 jQuery提供的强大选择器和方法,可以大大减少原生JavaScript 的代码书写,快速实现瀑布流布局。jQuery实现瀑布流的代码 如下 本栏目责任编辑:谢媛嫒 据块进行绝对定位 瀑布流布局的核心是等宽不等高,因此还 要给(!lass为img的cIiv盒子同定宽度。 软件设计开发 第12卷第25期(2016年9月) mneti删Waterfall0l ∥将mdin下面所有 矗始为b妇的元素取出来 々dt boxs=¥( #l di“ di '; ar ̄=boxs.eq(o).outerWidth0; ,卅算整个页面的列数(贞面宽度/box宽度) vat cols=M ̄ith ㈨ndo’r);widthO/w); ComputerKnow ̄edgeandTechno/ogy电脑知识与技术 ¥.each(dataInt.data,function(index,value){ vat oBox=¥( <div>3.addClass('box9.ap— pendTo(¥(”#main”)); vat oImg=¥( <div>,).addClass( img').印一 pendTo(¥(oBox)); var img=¥( <img>3.attr('src', ̄mg/ +¥(vaI— ,艘筐m in的宽度利居中显示 ¥( }}ttIain,).css(t ̄widtB * §{’魏且自 n : auto )); vd士I1AH=f1j膊放每一列高度的数组 b撤§.edch neti ̄n(iade,,value)f 训打h=bo s.eq(tndex)。otllerHeight0; if(JndexCeol ̄)l hAnfindexl'-h; } 鲍f vat minH ̄Math.min.apply(null,hArr); i,af minHIM ̄=¥.inArray(minH,hArr.; 嚣(划ue);css(1 ,p0sition bsolute , +top 'minH+ px , "left :w minHIndex+"px 1) hArdmJnHIndexJ+ ̄boxg.eq(index).outerHeight O; } }) } 3.2.3 CSS3实现瀑布流布局 该方法主要用到了CSS3的columns属性。column—count用 来设置列数,column—width设置每列宽度。当只设置column— width时,浏览器会根据窗口大小和每列的宽度来计算列数;当 只设置column—count时,浏览器会平均计算每列宽度;若两者 都设置时,浏览器会根据column—count计算宽度和column— width设置的宽度进行比较,取较大的值作为每列宽度,当窗口 缩小时,column—width的值为每列的最小宽度。这里我们只给 class为main的盒子设置column—width属性。 3.3动态加载图片 完成前面的代码书写后我们只是实现容器中已有的数据 块的排列,而瀑布流一个特点是滚动加载新的内容,因此需要 给window绑定scroll事件(JavaScript中用window.onscroll0)来 监听滚动条的变化,然后用Jason数据模拟后台更新数据块,最 后将新的数据块渲染到页面中。利用jQuery实现动态加载图 片的代码如下: var datalnt={”data”:【{ src : 1.JPg,1,{ src : 2.jpg,】’{ src : 3.JPg,J, { src : .JPg,)]) ¥(window).on('scroll ,function0{ if(checkScrollSlide){ 辱数据块渲染到页面当中 本栏目责任编辑:谢媛媛 ue).attr( src,)).appendTo(¥(olmg)); )) waterfall0; l }) 4瀑布流布局实现方式比较 JavaScript、jQuery和CSS3三种方式都可以实现瀑布流效 果,但JavaScript和jQuery两种方法实现思路基本一致,因此将 其归为JavaScript类,下面对JS和CSS3两种方法进行比较,分 析其在性能和用户体验上的优缺点。 1)性能:JavaScript实现的瀑布流中,需要通过计算得到列 数,即浏览器窗口的宽度/图片宽度,并且图片的定位是根据每 一列的高度来计算接下来图片的位置;而CSS3实现的瀑布流 中,浏览器会自动计算显示的列数,只需要设置列宽即可,因此 使用CSS3方法要比使用JavaScript或jQuery性能高很多。 2)用户体验:JavaScript实现的瀑布流中,图片进行横向排 列,每张图片的位置是通过计算得到的,因此比较规范;CSS3 实现的瀑布流中,列宽会随着浏览器矿口的大小进行改变,并 且图片的排列顺序是按照垂直排列,这打乱了图片在页面中显 示顺序,用户体验不好,此外当滚动滚动条加载图片时,依然需 要依靠JavaScript来实现。 5结束语 瀑布流布局巧妙地利用了视觉元素间的落差感来引导视 线的流动,营造了一种轻松愉快的浏览体验[61,它的实现的方法 有多种,每种方法都有其各自的优缺点,开发者可以综合多种 方法,达到性能和用户体验的最优化。实验中,数据块内仅仅 插入了图片,在实际运用中还可以加入文字等来丰富数据块的 内容。 参考文献: [I徐晔.基于瀑布流式布局的展示类网站界面设计研究[I】J】.轻 工科技,2015(12):102—103. [2]张妍.电信新版手机云桌面启用瀑布流布局[N].人民邮电, 2014—01-22007. [3】张卫,于梦婷.瀑布流式布局在电子商务网站界面中的创新 设计[J】.电脑知识与技术,2013(30):6941—6942. 【4】梁莉菁.基于JavaScript的瀑布流式网页布局的设计与实现 [J].萍乡学院学报,2015(3):63—67. [5】dhbdfr.瀑布流算法.http://blog.sina.com.cn/s/blog_9f3ce- cc50101gk7r.htm1. 【6】谢涛.从“瀑布流式布局”谈网页界面的创新设计[J].设计艺 术研究。2013(2):31—35,39.