页面瀑布流布局的实现 javascript+css

先看所谓的瀑布流布局

在不使用瀑布流布局的情况下,当页面要显示不同高度的图片时,会如下面显示

下面的元素总是和最靠近它的元素对齐。

为了使元素能够在我们想要的位置上显示,我们使用绝对定位。

说一下大体思路(也是看了别人的):
一切的不对齐都是从第一行的图片排列开始的,也许不是很准确,那么换一个说法:
要想使图片排列整齐,那么就得从第一行排列开始。
假设第一行x个元素排列中有一个最矮的(假设不假设都一样,假设是为了便于理解),
较高的元素比这个最矮的要多出一块区域来,那么第二行就要有人去把这个多出来的区域填上
当有人填上后,我们发现第一行最矮元素再加上这个填空白元素,比其他元素都更高了,这时我们把他俩看成一个元素
这样还是只有一行x个元素,然后就循环呗!每次找出最矮的来,让下一行的元素填充

代码如下(图片和reset.css要自己准备)

  1 <!DOCTYPE html>
  2 <html>
  3 <head>
  4 <meta charset="gb2312" />
  5 <title>瀑布流练习</title>
  6 <link type="text/css" rel="stylesheet" href="./css/reset.css" />
  7 
  8 <style>
  9 ul.wrap{
 10     width:1200px;
 11     margin:0 auto;
 12     position:relative; /* 相对定位 */
 13 }
 14 ul.wrap li{
 15     width:400px;
 16     float:left;
 17     position:absolute; /* 绝对定位 */
 18 }
 19 ul.wrap li img{
 20     /* 计算好长度 */
 21     width:364px;
 22     border:2px solid #bdbdbd;
 23     padding:10px;
 24     margin:4px;
 25 }
 26 </style>
 27 
 28 <script type="text/javascript">
 29 
 30 window.onload = function(){
 31     pubuliu("ulwrap",3,400);
 32 };
 33 
 34 //实现ul下的li瀑布流
 35 //cols 表示一行几列,liWidth 表示一列的宽度
 36 function pubuliu(ulId,cols,liWidth){
 37     var wrap = document.getElementById(ulId);
 38     var lis = wrap.getElementsByTagName("li");
 39     
 40     var li_h = [];
 41     for(var i=0; i<lis.length; i++){
 42         if(i < cols){
 43             li_h[i] = lis[i].scrollHeight;
 44             //定位元素
 45             lis[i].style.left = i * liWidth + "px";
 46             lis[i].style.top = "0px";
 47         }else{
 48             //获取数组最小值
 49             var min_liH = Math.min.apply( Math, li_h );
 50             var key = getKeyByValue(li_h,min_liH);
 51             //重定义最小高度
 52             li_h[key] = min_liH + lis[i].scrollHeight;
 53             
 54             //定位元素
 55             lis[i].style.left = key * liWidth + "px";
 56             lis[i].style.top = min_liH + "px";
 57         }
 58     }
 59 }
 60 
 61 //根据数组中的值获取索引
 62 function getKeyByValue(arr,value){
 63     for(var i=0; i<arr.length; i++){
 64         if(arr[i] == value){
 65             return i;
 66         }
 67     }
 68 }
 69 </script>
 70 </head>
 71 
 72 <body>
 73     <ul class="wrap clearfix" id="ulwrap">
 74         <li>
 75             <img src="./images/1.jpg" />
 76         </li>
 77         <li>
 78             <img src="./images/2.jpg" />
 79         </li>
 80         <li>
 81             <img src="./images/3.jpg" />
 82         </li>
 83         <li>
 84             <img src="./images/4.jpg" />
 85         </li>
 86         <li>
 87             <img src="./images/5.jpg" />
 88         </li>
 89         <li>
 90             <img src="./images/6.jpg" />
 91         </li>
 92         <li>
 93             <img src="./images/7.jpg" />
 94         </li>
 95         <li>
 96             <img src="./images/8.jpg" />
 97         </li>
 98         <li>
 99             <img src="./images/9.jpg" />
100         </li>
101         <li>
102             <img src="./images/10.jpg" />
103         </li>
104     </ul>
105 </body>
106 </html>

瀑布流布局分为两部分:css部分和js部分。

css部分负责确定 li 的宽度、一行显示几列和定位方式

js部分负责确定具体的定位坐标

解释一下pubuliu(ulId, cols, liWidth)这个函数。它对 ulId 元素下的子li元素进行瀑布流布局,cols是一行显示几列,liWidth是一列的宽度。

原文地址:https://www.cnblogs.com/lhat/p/4764839.html