两者功能效果相同,实现方式不同
效果预览
- 两侧宽度固定,中间宽度自适应(三栏布局)
- 中间部分优先渲染
- 允许三列中的任意一列成为最高列
圣杯布局
通过左右栏填充容器的左右 padding 实现,更多细节详见注释。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>css 圣杯布局</title> <style> body { /* 清除浏览器默认样式 */ margin: 0; /* 设置最小宽度 */ min-width: 550px; } .header { background-color: gray; height: 40px; } .container { /* 圣杯布局 -- 通过 padding 实现 */ padding-left: 200px; padding-right: 150px; } .center { /* center宽度自适应 */ width: 100%; float: left; background-color: yellow; height: 100px; } .left { width: 200px; float: left; margin-left: -100%; position: relative; right: 200px; background-color: blue; height: 100px; } .right { width: 150px; float: left; margin-right: -150px; background-color: red; height: 100px; } .footer { /* 清除浮动 */ clear: both; background-color: gray; height: 40px; } </style> </head> <body> <div class="header">header</div> <div class="container"> <!-- center 置于 left 和 right 的上方,用于优先渲染页面主体内容 --> <div class="center">center</div> <div class="left">left</div> <div class="right">right</div> </div> <div class="footer">footer</div> </body> </html>
双飞翼布局
通过左右栏填充主体内容的左右 margin 实现,更多细节详见注释。
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>css 双飞翼布局</title> <style> body { /* 清除浏览器默认样式 */ margin: 0; /* 设置最小宽度 */ min-width: 550px; } .header { background-color: gray; height: 40px; } .container { /* 自适应宽度 */ width: 100%; /* 左浮动 */ float: left; } .center { /* 双飞翼布局 -- 通过 margin 留白实现 */ margin-left: 200px; margin-right: 150px; background-color: yellow; height: 100px; } .left { width: 200px; /* 左浮动 */ float: left; /* 自身向左移动父元素(此处为body)宽度的 100% */ margin-left: -100%; background-color: blue; height: 100px; } .right { width: 150px; /* 左浮动 */ float: left; /* 自身向左移动 150px */ margin-left: -150px; background-color: red; height: 100px; } .footer { /* 清除浮动 */ clear: both; background-color: gray; height: 40px; } </style> </head> <body> <div class="header">header</div> <div class="container"> <!-- center 置于 left 和 right 的上方,用于优先渲染页面主体内容 --> <div class="center">center</div> </div> <!-- left 置于 container 外面 --> <div class="left">left</div> <!-- right 置于 container 外面 --> <div class="right">right</div> <div class="footer">footer</div> </body> </html>
手写清除浮动 clearfix
/* 手写 clearfix */ .clearfix:after { content: ""; display: table; clear: both; } .clearfix { *zoom: 1; /* 兼容 IE 低版本 */ }
用在类似圣杯布局的容器上,footer 不再需要 clear: both;
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>css 圣杯布局</title> <style> body { /* 清除浏览器默认样式 */ margin: 0; /* 设置最小宽度 */ min-width: 550px; } .header { background-color: gray; height: 40px; } .container { /* 圣杯布局 -- 通过 padding 实现 */ padding-left: 200px; padding-right: 150px; } .center { /* center宽度自适应 */ width: 100%; float: left; background-color: yellow; height: 100px; } .left { width: 200px; float: left; margin-left: -100%; position: relative; right: 200px; background-color: blue; height: 100px; } .right { width: 150px; float: left; margin-right: -150px; background-color: red; height: 100px; } .footer { /* 清除浮动 */ /* clear: both; */ background-color: gray; height: 40px; } /* 手写 clearfix */ .clearfix:after { content: ""; display: table; clear: both; } .clearfix { *zoom: 1; /* 兼容 IE 低版本 */ } </style> </head> <body> <div class="header">header</div> <div class="container clearfix"> <!-- center 置于 left 和 right 的上方,用于优先渲染页面主体内容 --> <div class="center">center</div> <div class="left">left</div> <div class="right">right</div> </div> <div class="footer">footer</div> </body> </html>