| 5 min read

昨日和 @喻木大大聊面试的时候聊到了这个话题,其实这个问题挺常见的,不过自己面试到还没问过,问过自适应的等比正方形布局。不过聊到这个问题,下面就详细的说下解决思路和考察要点。希望下次不要被榆木童鞋刷掉了😂。

解决这个问题,先简单描述下具体的需求吧:

给出三列布局,左右两边宽度一定,比如120px啦,然后中间的自适应宽度,即浏览器随着窗口大小的变化而自动变化。

问题大致就是这些,其实思路很多,不过我们从css的发展说起吧。在不同的阶段给出不同的解决方法。

首先我们回到上个世纪,当css还没形成的时候,我们写页面,大家都知道依赖于table布局,所以我们可以用table去模拟这个情况,相信大家很快有思路咯。

<table>
  <tbody>
    <tr height="100%">
      <td width="200" bgcolor="#1ba1e2"></td>
      <td> this is center</td>
      <td width="200" bgcolor="#1ba1e2"></td>
    </tr>
  </tbody>
</table>

当然这个思路肯定被淘汰啦,那我们回到CSS Level1。出现了box model以及float的使用。这个思路也是目前大多数解决方案中的一种。因为使用起来及极其方便,三个DIV少量的属性就解决了。左右浮动起来div然后中间用margin表示出间隔就好。

div{
  height:100%;
}
.center-wrap{
  margin:0 200px;  
}
.left-wrap,.right-wrap{
  width:200px;
  background:#1ba1e2;
}
.left-wrap{
  float:left;
}
.right-wrap{
  float:right;
}

到了CSS Level2,我们可以巧妙的利用position 去完成这样的功能,同样就是使用绝对定位,让元素在分别两边现实。

div{
  height:100%;
}
.center-wrap{
  margin:0 200px;  
}
.left-wrap,.right-wrap{
  position:absolute;
  top:0;
  width:200px;
  background-color:#1ba1e2;
}
.left-wrap{
  left:0;
}
.right-wrap{
  right:0;
}

当然我们现在步入了CSS3,如果不用考虑太多的兼容性,我们可以大胆的使用flex语法来实现这个功能.

我们让外部盒子支持flex,然后设置需要自适应的DIV flex:1;然后再通过order来实现对顺序的控制。


.container{
  position:relative;
  display:flex;
}
div{
  height:100%;
}
.center-wrap{
  flex:1;
  order:2;
}
.left-wrap,.right-wrap{
  width:200px;
  background:#1ba1e2;
}
.left-wrap{
  order:1;
}
.right-wrap{
  order:3;
}

HTML结构如下

<div class="container">
    <div class="center-wrap">this is center</div>
  <div class="left-wrap"></div>
  <div class="right-wrap"></div>
</div>

当然我们还可以已经被纳入草案的CSS Grid

是CSS为布局新增的一个模块。网格布局特性主要是针对于Web应用程序的开发者。可以用这个模块实现许多不同的布局。网络布局可以将应用程序分割成不同的空间,或者定义他们的大小、位置以及层级

CSS Grid(网格布局)算是相对目前实践较少的布局方案,来源浏览器支持的范围以及需要重新学习的新语法。由于浏览器支持问题,所以需要手动开启一些配置。

在Chrome浏览器中开启CSS Grid Layout模块功能比较简单,只需要在您的浏览器地址栏中输入:chrome://flags,回车后在列表清单中找到“启用实验性网络平台功能”(#enable-experimental-web-platform-features)

布局大致思路就是我们把 grid-template-columns 划分为

grid-template-columns: 200px auto 200px;
--200 ---- auto ---- 200 
|
|  grid-template-rows 100%;
|
--200 ---- auto ---- 200 

然后给每个DIV指定 grid-area就好了。

.container{
  position:relative;
  display:grid;
  grid-template-columns: 200px auto 200px;
  grid-template-rows: 100%;
   grid-template-areas: "lt cr rt"
}
div{
  height:100%;
}
.center-wrap{
  grid-area: cr;
}
.left-wrap{
  grid-area: lt;
  background:#1ba1e2;
}
.right-wrap{
  grid-area: rt;
  background:#1ba1e2;
}
** 确保你的浏览器开启支持了 CSS Grid **

虽然这个问题很简单,但是却十分基础,可以考验一个知识的扎实度和深度。所以希望能够帮助到大家,尤其最后一个解决思路,肯定会让你的面试官觉得你还是个好学的好孩子的。

You Can Speak "Hi" to Me in Those Ways