添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

多列布局在一个网页设计中非常常见,不仅可以用来做外部容器的布局,在一些局部也经常出现多列布局,比如下面圈出来的都是多列布局:

<div class="parent">
  <div class="left">
    <p>left</p>
  </div>
  <div class="right">
    <p>right</p>
    <p>right</p>
  </div>
</div>

当我们没有给他设置样式的时候,它是这样子

我们要的是两列布局,所以我们给left加一个float:left;,然后它变成这样了:

我们看到right的内容环绕了left,这是浮动(float)的一个特性,那怎么解决呢? 因为右边环绕了左边,我们只需要将右边往右边移过去就行了: margin-left: 100px;如果左右两列还想要一点间距,margin-left设置大一点就行了。

1. 浮动元素,float 除 none 以外的值; 
2. 定位元素,position(absolute,fixed); 
3. display 为以下其中之一的值 inline-block,table-cell,table-caption; 
4. overflow 除了 visible 以外的值(hidden,auto,scroll);

BFC有如下特性:

1. 内部的Box会在垂直方向上一个接一个的放置。
2. 垂直方向上的距离由margin决定
3. bfc的区域不会与float的元素区域重叠。
4. 计算bfc的高度时,浮动元素也参与计算
5. bfc就是页面上的一个独立容器,容器里面的子元素不会影响外面元素。

上面几个特性怎么理解呢?

  • 如果垂直方向上有多个div,他们都有margin,那垂直的margin会合并

    <div class="parent">
      <div class="child"></div>
      <div class="child"></div>
    </div>
    .child {
        margin-top: 10px;
        margin-bottom: 20px;
    

    上述代码两个child之间的间距是20px,而不是30px,因为垂直的margin会合并。但如果我给上面第一个child再套一个容器,使用overflow:hidden;他就成了一个BFC,根据BFC的特性,BFC的子元素不会影响外面的元素,margin就不会合并,两个child的间距就是30px;

    <div class="parent3">
      <div class="overflow">
        <div class="child3">child4</div>
      </div>
      <div class="child3">child4</div>
    </div>
    .child3 {
        margin-top: 10px;
        margin-bottom: 20px;
    .overflow {
        overflow: hidden;
    
  • BFC是一个独立的容器,不会被浮动元素覆盖,里面的文字也不会环绕浮动元素,我们这里的两栏布局就是利用的这个特性。

  • 计算BFC高度时,浮动元素的高度也会计算其中,这不就是我们用来清除浮动的一种做法吗?

    .parent {
        overflow: hidden;
    

    <div class="parent4">
      <div class="left4">
        <p>left4</p>
      </div>
      <div class="right4">
        <p>right4</p>
        <p>right4</p>
      </div>
    </div>
    .parent4 {
        display: table;
        width: 100%;
        table-layout: fixed;
    .left4 {
        display: table-cell;
        width: 100px;
        padding-right: 20px
    .right4 {
        display: table-cell;
    
    .parent5 {
        display: flex;
    .left5 {
        width: 100px;
        margin-right: 20px;
    .right5 {
        flex: 1;
    
    .parent5 {
        display: flex;
    .left5 {
        margin-right: 20px;
    .right5 {
        flex: 1;
    

    C = W * N + G * (N -1);  // 此处N为4
    // 变换为
    C = W * N + G * N - G;
    // 再变为
    C = (W + G) * N - G;
    // 最后变为
    C + G = (W + G) * N;
    

    C + G = (W + G) * N;对应的示意图为:

    这次我们的html结构如下所示,间距是20px:

    <div class="parent6">
      <div class="column"><p>1</p></div>
      <div class="column"><p>2</p></div>
      <div class="column"><p>3</p></div>
      <div class="column"><p>4</p></div>
    </div>
    

    .parent6 {
        margin-left: -20px;
    .column {
        float: left;
        width: 25%;
        padding-left: 20px;
        box-sizing: border-box;
    

    用float的方式布局有一个不足之处,就是我们写死了25%,这个只适用于4列,如果不知道几列就不能这么写了,当然用JS动态计算不算。

    .parent8 {
        display: table;
        width: calc(100% + 20px);
        table-layout: fixed;
      position: relative;
        left: -20px;
    .column3 {
        display: table-cell;
        padding-left: 20px;
    

  •