一种三列布局,两边定宽,中间自适应;中间栏要放在文档流前面以优先渲染
圣杯布局
- 下面是HTML部分1234567891011<div id="container"><div id="main" class="col">#main</div><div id="left" class="col">#left</div><div id="right" class="col">#right</div></div>
- 下面是CSS部分1234567891011body {min-width: 550px;}.col {position: relative;float: left;}#container {padding: 0 190px 0 190px;}#main {width: 100%;height: 400px;background-color: #ccc;}#left {width: 190px;height: 400px;margin-left: -100%;left: -190px;background-color: #0000FF;}#right {width: 190px;height: 400px;margin-left: -190px;right: -190px;background-color: #FF0000;}
- 先用浮动把3个div并排列出来,中间div宽度设为100%,两边宽度定出来;这样的效果是:main全屏宽度,left和right会被挤压到第二排并列;
- margin-left:-100%和margin-left:-190px(right的宽度);这样的效果是:left和right覆盖在main的左右两端;
- .container{padding:0 190px 0 190px}空出左右两边的位置,left:-190px;right:-190px;这样的效果是:把main压缩起来腾出左右两端位置,left和right定位到左右两端
双飞翼布局:实现目标相同,与圣杯布局相比,双飞翼HTML中为main添加了一个子元素main-wrap,这个小小的改动是为了之后处理main中内容被遮盖的问题,这也是两者实现方式最大的不同点
下面是HTML部分
12345678910111213<div id="container"><div id="main" class="col"><div id="main-wrap">#main</div></div><div id="left" class="col">#left</div><div id="right" class="col">#right</div></div>下面是CSS部分
12345678910body {min-width: 550px;}.col {float: left;}#main {width: 100%;height: 400px;background-color: #ccc;}#main-wrap {margin: 0 190px 0 190px;}#left {width: 190px;height: 400px;margin-left: -100%;background-color: #0000FF;}#right {width: 190px;height: 400px;margin-left: -190px;background-color: #FF0000;}
区别在于第三个步骤,双飞翼布局是利用.main-wrap{margin: 0 190px 0 190px;}空出左右两边位置。因为不需要left,right定位,所以不需要position:relative属性
flex方案
下面是HTML部分:
12345<div id="container"><div id="left">#left</div><div id="main">#mian</div><div id="right">#right</div></div>下面是CSS部分
1234#container{display: flex;flex-direction: row;}.main{flex:1; background: grey;}.left{width:190px;height:400px;background: #0000FF;}.right{width:190px;height:400px;background:#FF0000;}
缺点是ie的兼容性不好,没有达到优先加载中间div的目的