• 页面瀑布流布局的实现 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是一列的宽度。

  • 相关阅读:
    bzoj2115: [Wc2011] Xor
    bzoj2844: albus就是要第一个出场
    hdu3949
    bzoj2487: Super Poker II
    bzoj3456: 城市规划
    bzoj3992: [SDOI2015]序列统计
    ubuntu 使用命令行登录oracle
    ubuntu安装docker
    linux查询硬件信息
    ubuntu oracle 环境搭建
  • 原文地址:https://www.cnblogs.com/lhat/p/4764839.html
Copyright © 2020-2023  润新知