很早之前就听说过瀑布流布局,瀑布流布局能够降低页面的复杂度,对用户也比较友好,但它也有局限,对于一些页面差异比较大的页面或内如不是一种很好的选择。
推荐大家看一下瀑布流鼻祖Pinterest的网站,不过好像需要注册......或者就是手机淘宝和京东可以一直下滑显示新的内容之类等等
或者看看我的(图片来源于百度):
实现方式:
1、传统多列浮动。代表网站蘑菇街和哇哦。
2、用css3实现(貌似是最简单的)
3、绝对定位。代表网站Pinterest。(我也是这样实现的)
需要注意的是,
绝对定位的top=如果为第一行元素,固定高,第一行以后,为当前元素的索引减去每行容纳的元素个数+自身高
绝对定位的left=当前元素和每行容纳的元素个数取余乘以元素的宽
利用滚动条来判断是否需要加载新元素:比较浏览器显示高+滚动条偏移量 和 所有元素高之间的关系
代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>图片瀑布流</title> <style> body { margin: 0; padding: 0; } html, body { background-color: rgba(0, 0, 0, 0.534); } .block { position: relative; height: 2000px; width: 840px; margin: 0 auto; border: 10px solid red; } .newdiv { position: absolute; width: 200px; float: left; background-color: white; border-radius: 5px; box-shadow: 0 0 10px grey; } .imglist { width: 180px; margin: 10px 10px; } </style> </head> <body> <div class="block"> </div> <script src="./js/jquery-3.3.1.min.js"></script> <script> // 将所有的图片路径存到一个数组中 var list = ["1.jpg", "2.jpg", "3.jpg", "4.jpg", "5.jpg", "6.jpg", "7.jpg", "8.jpg", "9.jpg", "10.jpg", "11.jpg", "12.jpg", "13.jpg", "14.jpg", "15.jpg", ]; // 当滚动条距离完全划完还有30个像素时,重新创建img showImg(list); $(document).bind('scroll', function () { if ($(window).height() + $(this).scrollTop() >= $(document).height() - 30) { // console.log(1); var newList = [list[Math.floor(Math.random() * list.length)], list[Math.floor(Math.random() * list.length)], list[Math.floor(Math.random() * list.length)], list[Math.floor(Math.random() * list.length)]]; showImg(newList); } }); function showImg(obj) { // 创建img元素 obj.forEach(function (res, index) { console.log(index); var new_div = $("<div class='newdiv'></div>"); var img = $("<img class='imglist'>"); img.attr("src", "./img/" + res); new_div.append(img); $('.block').append(new_div); }); // 遍历所有容器 $('.newdiv').each(function (index) { if (index < 4) { $('.newdiv').eq(index).css("top", 10); console.log(1); } else { $('.newdiv').eq(index).css({ "top": $('.newdiv').eq(index - 4)[0].offsetHeight + $('.newdiv').eq(index - 4)[ 0].offsetTop + 10 }) } $('.newdiv').eq(index).css("left", index % 4 * 210); // console.log(index); }); $('.block').css("height", $(document).height()); } </script> </body> </html>