双飞翼和圣杯布局

1,798 阅读2分钟

双飞翼和圣杯布局属于老生常谈了,最近重新回顾了一下,写下来当作记录供以后参考,同时也是加深自己的理解。如果有不对的地方,希望大家多多指教。

双飞翼布局

image.png

.center 放前面是因为要提前渲染这一块儿的内容

    <header>head</header>
    <section class="clear">
      <div class="center">
        <div class="content"></div>
      </div>
      <div class="first"></div>
      <div class="second"></div>
    </section>
    <footer>footer</footer>
      section {
        min-width: 800px;
      }
      .center,
      .first,
      .second {
        float: left;
        height: 50vh;
      }
      .center {
        width: 100%;
        background: lightblue;
      }
      .center .content {
        margin: 0 100px;
      }
      .first {
        width: 100px;
        margin-left: -100%;
        background: lightcoral;
      }
      .second {
        width: 100px;
        background: lightgoldenrodyellow;
        margin-left: -100px;
      }

我们都知道div属于块级元素,独占一行。想要三个元素都在一行显示,设置浮动让其脱离文档流。center左右留出宽度放置左右元素,因为已经设置100%宽度所以左右两个元素被挤到下一行。first设置marginLeft:100%意味着向左移动整个屏幕的距离,正好放置到左侧事先预留出的100px宽度内。second marginRight:100px向左移动100px即本身的宽度,放置到右侧预留出的地方,这样就可以实现左右固宽中间自适应的三栏布局

圣杯布局

<header>head</header>
<!-- 圣杯 -->
    <main class="clear">
      <div class="middle"></div>
      <div class="left"></div>
      <div class="right"></div>
    </main>
    <footer>footer</footer>
    main {
        min-width: 600px;
        padding: 0 100px;
    }
    .left,
    .middle,
    .right {
        float: left;
        height: 40vh;
    }
    .middle {
        background: orange;
        width: 100%;
    }
    .left {
        background: purple;
        width: 100px;
        margin-left: -100%;
        position: relative;
        left: -100px;
    }
    .right {
        position: relative;
        background: #000;
        width: 100px;
        margin-left: -100px;
        left: 100px;
    }

和双飞翼布局不同的地方在于外层设置padding:100px,middle的宽度只有100vw - 200px,和双飞翼相同的地方在于也是利用负margin来让left和right移动到和middle同一行。不同的地方是还需要设置相对定位,利用定位的left属性main元素的padding部分,达到左右固宽中间自适应的三栏布局。

flex布局

flex布局其实也可以实现,即左右宽度固定,中间元素flex:1占满剩余宽度,这里也就不贴出代码了。