@Sakura-W
2016-09-18T12:43:29.000000Z
字数 3290
阅读 1522
CSS
本文主要总结一些经典的CSS布局方案,便于以后参考。
传统的布局解决方案一般基于盒模型,依赖display属性+float属性+position属性。它对于那些特殊的布局非常不方便,比如垂直居中。未来将更多的采用CSS3的flex属性和grid属性来进行布局。(flex和grid都是一种display值)。
一般给页面主体加上最大宽度,而其中的内容都是响应式的,可根据主体的宽度进行适应。
HTML结构:
<div class="container"><div class="header"></div><div class="nav"></div><div class="content"></div><div class="footer"></div></div>
CSS样式:
.container{max-width: 1200px;margin: 0 auto;}
效果如下:

通栏布局里外层盒子的宽度等于视口的宽度。
HTML结构:
<div class="header"></div><div class="nav"></div><div class="content"></div><div class="footer"></div>
CSS样式:
html, body{width: 100%;}.header, .nav, .content, .footer{width: 100%;}
效果如下:

两栏布局的话,一般是主体内容分为两栏,header、nav、footer等部分还是通栏
HTML结构:
<div class="header"></div><div class="nav"></div><div class="content"><div class="main"></div><div class="aside"></div></div><div class="footer"></div>
CSS样式:
html, body{width: 100%;}.header, .nav, .content, .footer{width: 100%;}.main{float: left;width: 65%;}.aside{width: 35%;}
效果如下:

三列布局是一种很常见的页面布局方式,三列一般分别是子列sub、主列main和附加列extra,其中子列一般是居左的导航,宽度固定;主列是居中的主要内容,宽度自适应;附加列是居右的广告等额外信息,宽度也固定。
经典的圣杯布局和双飞翼布局都是三栏布局,两边的盒子宽度固定,中间盒子自适应,也就是我们常说的**固比固**布局。三栏布局中,中间盒子优先渲染并且宽度随着页面宽度变化而变化,两边盒子宽度固定不变。
HTML结构:
<div class="container"><div class="main">main</div><div class="sub">sub</div><div class="extra">extra</div></div>
CSS样式:
body{min-width: 500px;/*在页面宽度小于一定值时会发生错乱*/}.container{padding-left: 200px;/*防止sub和extra覆盖main的内容*/padding-right: 100px;max-width: 1200px;margin: 0 auto;outline: solid 1px #000;overflow: hidden;}.main{float: left;width: 100%;height: 400px;background-color: rgba(255, 0, 0, .5);}.sub{position: relative;/*防止覆盖main的内容*/left: -200px;float: left;width: 200px;height: 400px;margin-left: -100%;/*100%是相对父容器的宽度*/background-color: rgba(0, 255, 0, .5);}.extra{position: relative;right: -100px;float: left;width: 100px;height: 400px;margin-left: -100px;background-color: rgba(0, 0, 255, .5);}
说明:圣杯布局利用float属性排布三块内容,然后利用负外边距使三块内容从左到右排布,最后利用相对定位避免三块内容相互覆盖。
HTML结构:
<div class="main-wrapper"><div class="main"></div></div><div class="sub"></div><div class="extra"></div>
CSS样式:
.main-wrapper {float: left;width: 100%;}.main {height: 300px;margin-left: 200px;margin-right: 100px;background-color: rgba(255, 0, 0, .5);}.sub {float: left;width: 200px;height: 300px;margin-left: -100%;background-color: rgba(0, 255, 0, .5);}.extra {float: left;width: 100px;height: 300px;margin-left: -100px;background-color: rgba(0, 0, 255, .5);}
说明:双飞翼布局中盒子的定位方式与圣杯布局一致,都是采用负外边距来定位sub和extra列。不同的是,双飞翼布局避免main的内容被覆盖的方法是:在main列外面包裹一个宽度为100%的盒子,然后通过设置main列的左、右边距正确定位main列。
比较:
1)相同点:主列优先加载、渲染,布局方式都是三列浮动,然后通过负外边距形成三列布局。
2)不同点:如何处理中间主列的位置:圣杯布局是利用父元素的内边距实现,双飞翼布局是把主列嵌套在另一个盒子中,再利用主列的外边距实现。
3)相比而言,双飞翼布局虽然多了一个div元素,但没有相对定位属性的代码,因此更加简洁!!
参考:
浅析圣杯布局和双飞翼布局
这种实现方案可以自适应浏览器视口的宽度和高度
HTML结构:
<header class="header"></header><div class="content"><div class="main"></div><div class="left"></div><div class="right"></div></div><footer class="footer"></footer>
CSS样式:
*{margin: 0;padding: 0;}body{min-height: 100vh;display: flex;flex-flow: column nowrap;}.header, .footer{flex: 0 0 100px;/*header和footer固定高度*/background-color: #666;}.content{display: flex;flex: 1 1 auto;flex-flow: row nowrap;}.left, .right{flex: 0 0 10em;/*左右两栏固定宽度*/}.left{order: -1;background-color: rgba(119, 187, 221, 1);}.main{flex: 1 1 auto;background-color: rgba(214, 214, 214, 1);}.right{background-color: rgba(255, 102, 51, 1);}
效果如下:
