双飞翼布局和圣杯布局区别及实现

双飞翼布局和圣杯布局区别

相同点

两者的功能相同,都是为了实现一个两侧宽度固定,中间宽度自适应的三栏布局,并且中间部分在HTML代码中要写在前边,这样它就会被优先加载渲染。

不同点

主要的不同之处就是在解决中间部分被挡住的问题时,采取的解决办法不一样。圣杯布局是给父元素设置padding-left和padding-right,在给左右两边的内容设置position为relative,通过左移和右移来使实现,而双飞翼布局则是在中间这个div的外层又套了一个div来放置内容,在给这个中间的div设置margin-left和margin-right 。

本文章以三种更简单的方式实现
float+calc、position+calc、flex布局
推荐flex布局

calc() 使长度值计算更方便

calc()

calc() 函数用于动态计算长度值。

 - 需要注意的是,运算符前后都需要保留一个空格,例如:width: calc(100% - 10px);
 - 任何长度值都可以使用calc()函数进行计算;
 - calc()函数支持 "+", "-", "*", "/" 运算;
 - calc()函数使用标准的数学运算优先级规则;
支持版本:CSS3

实现样式图

实现样式图

通用HTML代码

  <div id="app">
    <header>header</header>
    <main>
      <aside class="left">left</aside>
      <section>center</section>
      <aside class="right">right</aside>
    </main>
    <footer>footer</footer>
  </div>

float+calc

不足点:高度需要自己设置

    * {
      margin: 0;
      padding: 0;
      text-align: center;
    }

    header {
      height: 100px;
      line-height: 100px;
      background-color: rgb(95, 134, 241);
    }
    /* 设置高度,子元素浮动后保持高度 */
    main {
      height: 500px;
      line-height: 500px;
    }

    /* 中间盒子 */
    /* width: calc(100% - 400px); 这里减去的宽度为两侧内容宽度的总和 */
    section {
      float: left;
      width: calc(100% - 400px);
      height: 100%;
      background-color: coral;
    }

    aside {
      float: left;
      /* 两侧盒子和中间盒子全部左浮动 */
      width: 200px;
      height: 80%;

    }

    aside.left {
      background-color: chartreuse;
    }

    aside.right {
      background-color: yellowgreen;
    }

    footer {
      height: 100px;
      line-height: 100px;
      background-color: rgb(15, 166, 242);
    }

position+calc

    * {
      margin: 0;
      padding: 0;
      text-align: center;
    }

    header {
      height: 100px;
      line-height: 100px;
      background-color: rgb(95, 134, 241);
    }

    main {
      position: relative;
      height: 500px;
      line-height: 500px;
    }

    /* 中间盒子 */
    /* width: calc(100% - 400px); 这里减去的宽度为两侧内容宽度的总和 */
    section {
      width: calc(100% - 400px);
      height: 100%;
      margin: 0 auto;
      background-color: coral;
    }

    aside {
      position: absolute;
      /* 两侧盒子相对于父元素绝对布局 */
      width: 200px;
      height: 100%;

    }

    aside.left {
      /* 盒子左侧为0 */
      top: 0;
      left: 0;
      background-color: chartreuse;
    }

    aside.right {
      /* 盒子右侧为0 */
      top: 0;
      right: 0;
      background-color: yellowgreen;
    }

    footer {
      height: 100px;
      line-height: 100px;
      background-color: rgb(15, 166, 242);
    }

flex布局

推荐使用

    * {
      margin: 0;
      padding: 0;
      text-align: center;
    }

    header {
      height: 100px;
      line-height: 100px;
      background-color: rgb(95, 134, 241);
    }

    main {
      height: 500px;
      line-height: 500px;
      /* flex布局 */
      display: flex;
    }

    section {
      width: 100%;
      height: 100%;
      flex-shrink: 1;
      /* flex-shrink: 1; 则空间不足时收缩 */
      background-color: coral;
    }

    aside {
      flex-shrink: 0;
      /* flex-shrink: 0; 两侧盒子固定宽度 */
      width: 200px;
      height: 100%;
    }

    aside.left {
      background-color: chartreuse;
    }

    aside.right {
      background-color: yellowgreen;
    }

    footer {
      height: 100px;
      line-height: 100px;
      background-color: rgb(15, 166, 242);
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值