移动端样式小技巧(3)——n宫格布局排列

众所周知,元素有3种基本显示框类型,block块级,inline-block行内块级,inline行内。
inline-block是一种特殊存在,可以设置宽高也可以使元素在一行排列。

这两种布局都可以用float:left来写,但是浮动完了还需要清楚浮动。所以可以直接把元素设置成inline-block同样可以自动排列

注意,写的时候一定要把文字固定高度,因为不固定的话,两种方法的布局都会出现形变。

借鉴原作者的写法,我有两种写法:

第一种:

设置每个col-25的宽度为25%,并设置他们为行内块元素,这会引起换行(因为每个行内元素外面会有间隙,所以会因为一行排满而换行),这就需要在外面的容器设置font-size: 0;

n宫格(0).png

html:
<div class="container">
    <div class="row">
      <div class="col-25">
        <img src="img/1.png" alt="" class="pic">
        <p class="word">跟团游</p>
      </div>
      <div class="col-25">
        <img src="img/2.png" alt="" class="pic">
        <p class="word">自由行</p>
      </div>
      <div class="col-25">
        <img src="img/3.png" alt="" class="pic">
        <p class="word">邮轮</p>
      </div>
      <div class="col-25">
        <img src="img/4.png" alt="" class="pic">
        <p class="word">主题游</p>
      </div>
    </div>
    <div class="row">
      <div class="col-25">
        <img src="img/5.png" alt="" class="pic">
        <p class="word">签证</p>
      </div>
      <div class="col-25">
        <img src="img/6.png" alt="" class="pic">
        <p class="word">WIFI</p>
      </div>
      <div class="col-25">
        <img src="img/7.png" alt="" class="pic">
        <p class="word">预售</p>
      </div>
      <div class="col-25">
        <img src="img/8.png" alt="" class="pic">
        <p class="word">同程专线</p>
      </div>
    </div>
  </div>
css:
body,
  p {
    padding: 0;
    margin: 0;
  }

  body {
    background: #ccc;
  }

  .container {
    background: #fff;
  }

  .row {
    /*1.去除子元素,因为设置行内块级inline-block产生的间隙*/
    font-size: 0;
  }

  .row + .row {
    margin-top: 5px;
  }

  .col-25 {
    /* 2.设置行内块级 */
    display: inline-block;
    /* 3.设置宽度为1/4 */
    width: 25%;
    font-size: 12px;
    text-align: center;
    box-sizing: border-box;
    padding: 0 20px;
  }

  .pic {
    display: block;
    width: 100%;
    height: auto;
  }

  .word {
    padding: 5px;
    height: 18px;
    line-height: 18px;
    overflow: hidden;
    /*4.设置元素超出隐藏*/
    text-overflow: ellipsis;
    /*5.设置超出样式为省略号*/
    -webkit-line-clamp: 1;
    /*6.设置2行应用省略*/
    white-space: nowrap;
  }

第二种:

html结构和第一种相同,下图可以看出,这两种写法效果是相同的。
它比第一种写法方便,利用弹性盒子,和box-sizing: border-box;里面图片自适应设备屏幕。

n宫格(1).png

css:
body,
  p {
    padding: 0;
    margin: 0;
  }

  body {
    background: #ccc;
  }

  .container {
    background: #fff;
  }

  .row {
    /*1.使用弹性盒子布局,无需font-size:0;无需将子元素宽度设置width: 25%;*/
    display: flex;
    justify-content: space-around;
  }

  .row + .row {
    margin-top: 5px;
  }

  .col-25 {
    display: inline-block;
    font-size: 12px;
    text-align: center;
    box-sizing: border-box;
    padding: 0 20px;
  }

  .pic {
    display: block;
    width: 100%;
    height: auto;
  }

  .word {
    padding: 5px;
    height: 18px;
    line-height: 18px;
    overflow: hidden;
    /*2.设置元素超出隐藏*/
    text-overflow: ellipsis;
    /*3.设置超出样式为省略号*/
    -webkit-line-clamp: 1;
    /*4.设置2行应用省略*/
    white-space: nowrap;
  }

但这个方法因为没有把图片的宽度定下来,所以极端屏幕下(屏幕足够小),布局会有问题,如下图所示:
n宫格(1).png

所以我个人推荐,还是使用第一种方法来写布局和样式。

热评文章