[关闭]
@Sakura-W 2016-09-18T12:43:29.000000Z 字数 3290 阅读 1400

Layout

CSS


本文主要总结一些经典的CSS布局方案,便于以后参考。

传统的布局解决方案一般基于盒模型,依赖display属性+float属性+position属性。它对于那些特殊的布局非常不方便,比如垂直居中。未来将更多的采用CSS3的flex属性和grid属性来进行布局。(flex和grid都是一种display值)。

一、一栏布局

1.固定宽度

一般给页面主体加上最大宽度,而其中的内容都是响应式的,可根据主体的宽度进行适应。
HTML结构:

  1. <div class="container">
  2. <div class="header"></div>
  3. <div class="nav"></div>
  4. <div class="content"></div>
  5. <div class="footer"></div>
  6. </div>

CSS样式:

  1. .container{
  2. max-width: 1200px;
  3. margin: 0 auto;
  4. }

效果如下:
图片.png-20.9kB

2.通栏布局

通栏布局里外层盒子的宽度等于视口的宽度。
HTML结构:

  1. <div class="header"></div>
  2. <div class="nav"></div>
  3. <div class="content"></div>
  4. <div class="footer"></div>

CSS样式:

  1. html, body{
  2. width: 100%;
  3. }
  4. .header, .nav, .content, .footer{
  5. width: 100%;
  6. }

效果如下:
图片.png-14.6kB

二、两栏布局

两栏布局的话,一般是主体内容分为两栏,header、nav、footer等部分还是通栏
HTML结构:

  1. <div class="header"></div>
  2. <div class="nav"></div>
  3. <div class="content">
  4. <div class="main"></div>
  5. <div class="aside"></div>
  6. </div>
  7. <div class="footer"></div>

CSS样式:

  1. html, body{
  2. width: 100%;
  3. }
  4. .header, .nav, .content, .footer{
  5. width: 100%;
  6. }
  7. .main{
  8. float: left;
  9. width: 65%;
  10. }
  11. .aside{
  12. width: 35%;
  13. }

效果如下:
图片.png-36.5kB

三、三栏布局

三列布局是一种很常见的页面布局方式,三列一般分别是子列sub、主列main和附加列extra,其中子列一般是居左的导航,宽度固定;主列是居中的主要内容,宽度自适应;附加列是居右的广告等额外信息,宽度也固定。

经典的圣杯布局和双飞翼布局都是三栏布局,两边的盒子宽度固定,中间盒子自适应,也就是我们常说的**固比固**布局。三栏布局中,中间盒子优先渲染并且宽度随着页面宽度变化而变化,两边盒子宽度固定不变。

1.圣杯布局

HTML结构:

  1. <div class="container">
  2. <div class="main">main</div>
  3. <div class="sub">sub</div>
  4. <div class="extra">extra</div>
  5. </div>

CSS样式:

  1. body{
  2. min-width: 500px;/*在页面宽度小于一定值时会发生错乱*/
  3. }
  4. .container{
  5. padding-left: 200px;/*防止sub和extra覆盖main的内容*/
  6. padding-right: 100px;
  7. max-width: 1200px;
  8. margin: 0 auto;
  9. outline: solid 1px #000;
  10. overflow: hidden;
  11. }
  12. .main{
  13. float: left;
  14. width: 100%;
  15. height: 400px;
  16. background-color: rgba(255, 0, 0, .5);
  17. }
  18. .sub{
  19. position: relative;/*防止覆盖main的内容*/
  20. left: -200px;
  21. float: left;
  22. width: 200px;
  23. height: 400px;
  24. margin-left: -100%;/*100%是相对父容器的宽度*/
  25. background-color: rgba(0, 255, 0, .5);
  26. }
  27. .extra{
  28. position: relative;
  29. right: -100px;
  30. float: left;
  31. width: 100px;
  32. height: 400px;
  33. margin-left: -100px;
  34. background-color: rgba(0, 0, 255, .5);
  35. }

说明:圣杯布局利用float属性排布三块内容,然后利用负外边距使三块内容从左到右排布,最后利用相对定位避免三块内容相互覆盖。

2.双飞翼布局

HTML结构:

  1. <div class="main-wrapper">
  2. <div class="main"></div>
  3. </div>
  4. <div class="sub"></div>
  5. <div class="extra"></div>

CSS样式:

  1. .main-wrapper {
  2. float: left;
  3. width: 100%;
  4. }
  5. .main {
  6. height: 300px;
  7. margin-left: 200px;
  8. margin-right: 100px;
  9. background-color: rgba(255, 0, 0, .5);
  10. }
  11. .sub {
  12. float: left;
  13. width: 200px;
  14. height: 300px;
  15. margin-left: -100%;
  16. background-color: rgba(0, 255, 0, .5);
  17. }
  18. .extra {
  19. float: left;
  20. width: 100px;
  21. height: 300px;
  22. margin-left: -100px;
  23. background-color: rgba(0, 0, 255, .5);
  24. }

说明:双飞翼布局中盒子的定位方式与圣杯布局一致,都是采用负外边距来定位sub和extra列。不同的是,双飞翼布局避免main的内容被覆盖的方法是:在main列外面包裹一个宽度为100%的盒子,然后通过设置main列的左、右边距正确定位main列。

比较:

1)相同点:主列优先加载、渲染,布局方式都是三列浮动,然后通过负外边距形成三列布局。
2)不同点:如何处理中间主列的位置:圣杯布局是利用父元素的内边距实现,双飞翼布局是把主列嵌套在另一个盒子中,再利用主列的外边距实现。
3)相比而言,双飞翼布局虽然多了一个div元素,但没有相对定位属性的代码,因此更加简洁!!

参考:
浅析圣杯布局和双飞翼布局

3.圣杯布局和双飞翼布局的flex实现方案

这种实现方案可以自适应浏览器视口的宽度和高度
HTML结构:

  1. <header class="header"></header>
  2. <div class="content">
  3. <div class="main"></div>
  4. <div class="left"></div>
  5. <div class="right"></div>
  6. </div>
  7. <footer class="footer"></footer>

CSS样式:

  1. *{
  2. margin: 0;
  3. padding: 0;
  4. }
  5. body{
  6. min-height: 100vh;
  7. display: flex;
  8. flex-flow: column nowrap;
  9. }
  10. .header, .footer{
  11. flex: 0 0 100px;/*header和footer固定高度*/
  12. background-color: #666;
  13. }
  14. .content{
  15. display: flex;
  16. flex: 1 1 auto;
  17. flex-flow: row nowrap;
  18. }
  19. .left, .right{
  20. flex: 0 0 10em;/*左右两栏固定宽度*/
  21. }
  22. .left{
  23. order: -1;
  24. background-color: rgba(119, 187, 221, 1);
  25. }
  26. .main{
  27. flex: 1 1 auto;
  28. background-color: rgba(214, 214, 214, 1);
  29. }
  30. .right{
  31. background-color: rgba(255, 102, 51, 1);
  32. }

效果如下:
图片.png-7.1kB

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注