瀑布流布局

瀑布流布局适合于小数据块,每个数据块内容相近且地位平等。随着滚动条向下滚动,瀑布流布局还会不断加载数据块并无限附加到页面尾部。

这里写图片描述

实现

首先在body中创建好模板

    <div id="box">
        <ul></ul>
        <ul></ul>
        <ul></ul>
        <ul></ul>
    </div>

设置写简单的样式,让每个图片之间有点间隙,让照片更有视觉冲击力,比较有美感。

    * {
        padding: 0;
        margin: 0;
    }
    #box {
        width: 90%;
        margin: 20px auto;
    }
    #box ul {
        list-style: none;
        float: left;
        width: 24%;
        margin: 5px;
    }
    #box ul img {
        width: 100%;
        margin: 5px;
    }

接下来利用js创建图片和li

    function createImg (count) {
         //循环创建
        for(var i = 0; i < count; i++) {
            //创建图片 和 li
            var img = document.createElement("img");
            img.src = "image/" + i + ".jpg";
            var li = document.createElement("li");
            li.appendChild(img);
         }
    }

这时候就要想想怎么把图片添加到ul,因为这时候图片大小不一样,如果你依次循环添加到ul中,有可能出现长的图片都在一列,短的都在一列,可能会使中间出现一个大的缺口,那么就会很缺少美感。

    //获取到所有的ul
    var ulArr = document.getElementsByclassName("ul");
    //假设一个最短的ul
    var minHeightUl = ulArr[0];
    //每次添加图片之前循环找到每次最短的ul添加
    for (var j = 0; j < ulArr.length; j++) {
        if (minHeightUl.offsetHeight > ulArr[j].offsetHeight) {
            minHeightUl = ulArr[j];
        }
    }
    minHeightUl.appendChild(li);

lazyLoad

如果想实现lazyLoad只需要把上面的src指向改为data-src,在滚动条移动到相应位置再把图片的data-src替换成src,可以参考另一篇博文 lazyLoad与节流

多列等高布局

比如说一个三列布局,我们设置每一列的宽度为33.3%,并左浮动形成三列效果。但是三列布局中每一列的文字内容长度不同,导致各列的高度也不相同。那么我们如何为这些列设置一样的高度呢,一种解决方案是为每一列设定一个固定的高度值,但是实际开发中,每一列的内容都可能会随着数据的不同而动态变化。既然无法得到一个精确的高度值,我们可以换一种思路,由于每一列之间的高度差别较小,我们可以使用一个较大的内边距,这个内边距超过了我们预估的列间高度的最大差异值,以使得每一列都增加相应的高度

   .col {
      padding-bottom: 500px;
   }

现在每一列的高度都增加了500像素,为了抵消这个高度,我们可以运用负值margin的威力

   .col {
      padding-bottom: 500px;
      margin-bottom: -500px;
   }

最后,我们将container设置overflow: hidden,将超出实际内容高度隐藏掉,这样就实现了多列等高的效果。

两列自适应布局

我们再来看另一种经典布局方式——两列自适应布局,也就是一列宽度固定,而另一列宽度自适应。经典的亚马逊网站就适应了这一布局方式,在某个宽度范围内缩放浏览器窗口时,一侧的图片列表宽度不变,左侧的主内容区域宽度随浏览器宽度发生变化。

   <div class="container">
      <div class="side">
      <div class="main">
   </div>

图片列表的宽度固定,绝对定位在row的左边。row使用padding将main顶到右边,这时main可以设置width: 100% 实现自适应。

   .container {
      position: relative;
      width: 100%;
      box-sizing: border-box;
      padding-left: 300px;
   }
   .side {
       position: absolute;
       left: 0;
       width: 300px;
       height: 500px;
   }
   .main {
       width: 100%;
       height: 500px;
   }

三列自适应布局

三列自适应布局更复杂一些,它要求左右两列宽度固定,中间一列宽度自适应。

   <div class="container">
      <div class="main">
      <div class="left">
      <div class="right">
   </div>

我们先设置基本的宽度(3列都是向左浮动,这里省略)

   .left {
      width: 350px;
   }
   .right {
      width: 250px;
   }
   .main {
      width: 100%;
   }

这时,左侧和右侧列都被挤出,显示在了中间列的下方。我们给左边的一列设置

   .left {
       margin-left: -100%;
   }

这里的100%指的是父元素的宽度,所以left列来到了最左边。右侧的定位也可以通过负margin来实现。

   .right {
       margin-right: -250px;
   }

然后给container设定padding留出right列的位置

   .container {
       padding-left: 350px;
       padding-right: 250px;
   }

现在位置唯一不正确的就是left列,因为它的margin-left 已经被设置,所以我们需要思考其他的方法,可以使用相对定位

   .left {
       position: relative;
       right: 350px;
   }

最后,为了防止布局被挤破,我们可以在body中规定一个最小的宽度尺寸,如果小于该窗口,窗口浏览器将出现横向滚动条,而非继续压缩

   body {
      min-width: 950px;
   }

以上的布局又被称为圣杯布局,还有一种双飞翼布局可以实现相同的效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值