瀑布流,又称瀑布流式布局,布局模式和瀑布很相像而得名。是比较流行的一种网站页面布局,视觉表现为参差不齐的多栏布局,随着页面滚动条向下滚动,这种布局还会不断加载数据块并附加至当前尾部。最早采用此布局的网站是Pinterest,逐渐在国内流行开来。国内大多数清新站基本为这类风格。
国内这样的网站有很多。像素材网,一些电商网站等都采用这类布局方式。为了揭开瀑布流模式的设计,我今天就为大家介绍两种常见的做法。
方案一:使用jQuery的Masonry插件进行制作。代码如下:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>jQuery Masonry瀑布流</title> <script src="//cdn.bootcss.com/jquery/2.2.0/jquery.min.js"></script> <script src="//cdn.bootcss.com/masonry/2.1.08/jquery.masonry.min.js"></script> <style> .container-fluid { padding: 20px; } .box { margin-bottom: 20px; float: left; width: 220px; } .box img { max-width: 100% } </style> </head> <body> <div id="masonry" class="container-fluid"> <div class="box"><img src="1.jpg"></div> <div class="box"><img src="2.jpg"></div> <div class="box"><img src="3.jpg"></div> <div class="box"><img src="4.jpg"></div> <div class="box"><img src="5.jpg"></div> </div> <script> $(function() { var $objbox = $("#masonry"); var gutter = 25; var centerFunc, $top0; $objbox.imagesLoaded(function() { $objbox.masonry({ itemSelector: "#masonry > .box", gutter: gutter, isAnimated: true }); centerFunc = function() { $top0 = $objbox.children("[style*='top: 0']"); $objbox.css("left", ($objbox.width() - ($top0.width() * $top0.length + gutter * ($top0.length - 1))) / 2).parent().css("overflow", "hidden"); }; centerFunc(); }); var tur = true; $(window).resize(function() { if (tur) { setTimeout(function() { tur = true; centerFunc(); }, 1000); tur = false; } }); }); </script> </body> </html>
方案二:自己实现,不使用插件的方式。代码如下:
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>自定义瀑布流</title> <style> body{ margin: 0px; background: darkgray; } .container{ position: relative; } .box{ padding: 5px; float: left; } .box_border{ padding: 5px; border: 1px solid #cccccc; box-shadow: 0px 0px 5px #ccc; border-radius: 5px; } .box_border img{ width: 150px; height: auto; } </style> </head> <body> <div class="container" id="container"> <div class="box_border" id="box_border"> <div class="box" id="box1"> <img src="image/01.jpg"> </div> <div class="box" id="box1"> <img src="image/01.jpg"> </div> <div class="box" id="box1"> <img src="image/01.jpg"> </div> ...... </div> </div> <script> window.onload = function() { var cparent = document.getElementById("container"); setImgLocation(cparent); //设置加载的图片 var data = ["image/01.jpg", "image/02.jpg", "image/03.jpg", "image/04.jpg", "image/05.jpg", "image/06.jpg", "image/07.jpg", "image/08.jpg", "image/09.jpg", "image/11.jpg", "image/12.jpg", "image/13.jpg", "image/14.jpg", "image/15.jpg", "image/16.jpg", "image/17.jpg"]; window.onscroll = function () { if (checkLoad(cparent)) { for (var i = 0; i < data.length; i++) { //创建新的节点 var div1 = document.createElement("div"); div1.className = "box"; var div2 = document.createElement("div"); div2.className = "box_border"; var img = document.createElement("img"); img.className = ".box_border img"; img.src = data[i]; div2.appendChild(img); div1.appendChild(div2); cparent.appendChild(div1); } setImgLocation(cparent); } } } function checkLoad(cparent){ var childArray = getChildNodes(cparent); var lastImgHight = childArray[childArray.length-1].offsetTop; var scrollHeight = document.documentElement.scrollTop||document.body.scrollTop; var browserHeight = document.documentElement.clientHeight; if(lastImgHight < scrollHeight+browserHeight){ return true; }else { return false; } } function setImgLocation(cparent){ var childArray = getChildNodes(cparent), imgWidth = childArray[0].offsetWidth, browserWidth = document.documentElement.clientWidth, count = Math.floor(browserWidth/imgWidth); cparent.style.cssText = "width:"+count*imgWidth+"px;margin: 0 auto;"; var imgHArray = []; for(var i=0;i<childArray.length;i++){ if(i<count){ imgHArray[i] = childArray[i].offsetHeight; }else{ var minHeight = Math.min.apply(null,imgHArray), minIndex = getMinIndex(minHeight,imgHArray); childArray[i].style.position = "absolute"; childArray[i].style.top = minHeight+"px"; childArray[i].style.left = childArray[minIndex].offsetLeft+"px"; imgHArray[minIndex] += childArray[i].offsetHeight; } } } function getMinIndex(mHeight,imgHArray){ for(var i in imgHArray){ if(imgHArray[i] == mHeight) return i; } } function getChildNodes(parent){ var chArray =[]; var tempNodes = parent.getElementsByTagName("*"); for(var i = 0;i<tempNodes.length;i++){ if(tempNodes[i].className == "box"){ chArray.push(tempNodes[i]); } } return chArray; } </script> </body> </html>
效果如图片所示!睡觉了,就分享到这里!
: » HTML5仿素材网的瀑布流设计
原创文章,作者:jamestackk,如若转载,请注明出处:https://blog.ytso.com/251114.html