两栏布局
float + margin
实现步骤如下:
- 使用float左浮左边栏
- 右边栏使用margin-left,撑出内容块(避免与左边栏重叠)
- 触发父元素BFC,防止下方元素受float影响上浮
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <div class="box"> <div class="left"></div> <div class="right"></div> </div>
<style> .box{ overflow: hidden; } .left{ float: left; width: 200px; } .right{ margin-left: 210px; } </style>
|
float + calc
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| <div class="box"> <div class="left"></div> <div class="right"></div> </div>
<style> .box{ overflow: hidden; } .left{ float: left; width: 200px; } .right{ float: right; width: calc(100% - 200px) } </style>
|
flex
flex布局下,子元素默认是自动填满高度。
如果需要高度自动,则需要给.box
设置align-items: flex-start
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| <div class="box"> <div class="left"></div> <div class="right"></div> </div>
<style> .box{ display:flex; } .left{ width: 200px; } .right{ flex: 1; // 平铺满剩余的空间 } </style>
|
三栏布局
圣杯布局
使用float和负margin,实现三栏布局。(外国人发明)
实现步骤如下:
- 设置三栏的宽度
- 全部左浮动,由于content的宽度是100%,所以left和right会被挤到下一行
- 给left和right设置负margin值,将left和right拉回,覆盖在content上
- 给三栏的父元素增加padding值
- 将left和right,定位到父元素的空白处(padding)
- 触发三栏父元素的BFC,自适应内部浮动元素的高度
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| <div class="box"> <div class="content"></div> <div class="left"></div> <div class="right"></div> </div>
<style> .box{ padding: 0 300px 0 200px; overflow: hidden; } .content, .left, .right{ float: left; } .content{ width: 100%; } .left{ width: 200px; margin-left: -100%; position: relative; left: -200px; } .right{ width: 300px; margin-left: -300px; position: relative; right: 300px; }
</style>
|
双飞翼布局
双飞翼布局,是在圣杯布局上,做了父元素padding留白的优化。
- 给 content 加子元素
1 2 3
| <div class="content"> <div class="inner"></div> </div>
|
- 给inner设置margin值,将内容区挤到中间进行显示
1 2 3 4 5 6
| <style> .inner{ margin-left: 200px; margin-right: 300px; } </style>
|
flex
注意点
使用flex的order属性,将元素进行优先排列,达到SEO和展示的平衡。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| <div class="box"> <div class="content"></div> <div class="left"></div> <div class="right"></div> </div>
<style> .box{ display: flex; } .left{ width: 200px; order: -1; } .right{ width: 300px; } .content{ flex: 1; } </style>
|
grid
注意点
使用grid-area属性,将元素进行优先排列,达到SEO和展示的平衡。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| <div class="box"> <div class="content"></div> <div class="left"></div> <div class="right"></div> </div>
<style> .box{ display: grid; grid-template-areas: "left content right"; grid-template-columns: 200px auto 300px; } .left{ grid-area: "left"; } .right{ grid-area: "right"; } .content{ grid-area: "content"; } </style>
|
参考