CSS(10) -- 圣杯布局 && 双飞翼布局

45 阅读3分钟

两者都是实现,两侧定宽,中间自适应的三列布局!!!

一. 圣杯布局

2024.png

.left .right .middle 的父盒子为 .container

圣杯布局的特点:

  • 给父盒子设置 padding:0 /.right's width / 0 /.left's width ,这样的话,把 .middle 先float ,它就会自动占领 .container 中间的位置,它就到位了!!!

  • .left 和 .right 也都 float ,但因为 .middle 已经上去了,所以它俩就会在 .middle 的下面,要想办法把它俩升上去!!

  • 就用上了 margin-left/margin-right : 负值

  • 给 .left 设置 margin-left : -100%

       - margin 的百分比是相对于父元素计算的!!!
       - 所以就是设置负值,就会升到上一行,然后从上一行的右边开始计算值!!!方便理解,设置了 -50% 进行对比!!!
    

margin-left : -100% 2025.png

margin-left : -50%

2026.png

  • 给 .right 设置 margin-left : -自己的宽度

  • 因为上面给父盒子设置了 padding ,所以想要它俩到位,还需要我们手动移一下,就用到了绝对定位 relative !!!

二. 双飞翼布局

2027.png

双飞翼特点:

  • 双飞翼就不给 .container 设置 padding 了固定 .middle 的位置了 。
  • 而是在 .middle 里面再放一个子盒子,在子盒子里放中间的内容。通过设置 子盒子 的 margin 来确定中间列的位置 ,注意要设置 .middle 的宽度为 100% 。占满整个!!

.left .right .middle > .inner

  • 还是都 float 起来,然后 .middle 因为html结构在上面,且它宽度为 100% ,所以还是它在上面 ,.left .right 在下面一行 。

  • 要把.left .right 它俩升上去,还是用margin-left/margin-right : 负值

    - 但由于现在它俩父盒子的宽度变了,圣杯布局法,因为给 .container 设置了 padding ,所以它宽度就变小了。而现在是 100% ,所以
    - .left `margin-left : -100%`
    - .right `margin-left : -自己的宽度` 会直接到位,就不需要再通过 relative 定位去移动了!!!
    
  • 而通过给 .inner 设置 margin : 0 /.right's width / 0 /.left's width 就也到位了!!

三. 总结

  • 两者都是,通过把三者都浮动起来 float 。但由于 .middle 宽度较大,会把 .left .right 挤到下一行。

  • 然后通过设置 .left 的 margin-left : -100% ,.right 的 margin-left : -自己的宽度 把它俩升上去

  • 区别就出来了

      - 由于 margin 的百分比是按照父元素计算的!!
      - 而两种方法的它俩的父盒子宽度不一样 :
           - 双飞翼的父盒子为 100% ,所以可以直接到位
           - 圣杯的父盒子由于设置了 padding ,所以还需要再借助relative定位,再次移动才能到位!!
    
  • 至于中间的 .miidle

        - 圣杯是直接给 .middle 设置了 padding 来确定中间列的位置
        - 双飞翼是,在 .middle 里加了子盒子,通过子盒子的 margin 来确定位置
    
  • 注意: 都需要给 .container 开启 BFC ,防止高度塌陷!!!

  • 注意: 都需要给left、middle、right设置上 padding-bottom: 9999px; margin-bottom: -9999px;解决三列底部会参差不齐的问题!!!

圣杯和双飞翼!!!