实现三栏布局
三栏布局在开发十分常见,即两边固定宽度,中间自适应宽度的布局。
Flex
使用CSS3
的flex
布局实现三栏布局,Flex
布局也称弹性布局,可以为盒状模型提供最大的灵活性,是布局的首选方案,现已得到所有现代浏览器的支持,此处主要是利用flex
容器成员默认按照主轴排列,以及利用flex
属性即flex-grow
,flex-shrink
和flex-basis
的简写形式将间的块自适应撑起。
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 32 33 34 35
| <!DOCTYPE html> <html> <head> <title>FLEX</title> <style type="text/css"> .container{ display: flex; height: 200px; border: 1px solid #eee; } .container > div{ color: #fff; } .container > .left{ width: 200px; background-color: #19be6b; } .container > .main{ flex: 1; background-color: #2979ff; } .container > .right{ width: 200px; background-color: #fa3534; } </style> </head> <body> <div class="container"> <div class="left">left</div> <div class="main">main</div> <div class="right">right</div> </div> </body> </html>
|
Calc
通过CSS
的calc
可以动态计算中间部分的长度从而做到自适应,calc
可以配合inline-block
行内块级元素实现三栏布局,注意使用行内块级元素的时候如果编写HTML
时换行,这个空白的换行也会作为元素解析从而会产生空白间隙,所以在编写时此处不要换行,此外calc
通过与float
配合实现也是可行的。
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 32 33 34
| <!DOCTYPE html> <html> <head> <title>Calc</title> <style type="text/css"> .container{ height: 200px; border: 1px solid #eee; } .container > div{ display: inline-block; height: 100%; color: #fff; } .container > .left{ width: 200px; background-color: #19be6b; } .container > .main{ width: calc(100% - 400px); background-color: #2979ff; } .container > .right{ width: 200px; background-color: #fa3534; } </style> </head> <body> <div class="container"> <div class="left">left</div><div class="main">main</div><div class="right">right</div> </div> </body> </html>
|
BFC
BFC
块级格式化上下文Block Formatting Context
,是Web
页面的可视CSS渲染的一部分,是块盒子的布局过程发生的区域,也是浮动元素与其他元素交互的区域,是用于布局块级盒子的一块渲染区域,并且与这个区域的外部毫无关系,是一个独立的区域,是一个环境,在这里利用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 32 33 34 35 36 37 38
| <!DOCTYPE html> <html> <head> <title>BFC</title> <style type="text/css"> .container{ height: 200px; border: 1px solid #eee; } .container div{ color: #fff; height: 100%; } .container > .left{ float: left; width: 200px; background-color: #19be6b; } .container > .main{ display: flex; background-color: #2979ff; } .container > .right{ float: right; width: 200px; background-color: #fa3534; } </style> </head> <body> <div class="container"> <div class="left">left</div> <div class="right">right</div> <div class="main">main</div> </div> </body> </html>
|
Margin
这个方法是使使左右模块各自向左右浮动,并设置中间模块的margin
值使中间模块宽度自适应。
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 32 33 34 35 36 37 38 39
| <!DOCTYPE html> <html> <head> <title>Margin</title> <style type="text/css"> .container{ height: 200px; border: 1px solid #eee; } .container div{ color: #fff; height: 100%; } .container > .left{ float: left; width: 200px; background-color: #19be6b; } .container > .main{ margin-left: 200px; margin-right: 200px; background-color: #2979ff; } .container > .right{ float: right; width: 200px; background-color: #fa3534; } </style> </head> <body> <div class="container"> <div class="left">left</div> <div class="right">right</div> <div class="main">main</div> </div> </body> </html>
|
Float
使用Float
配合margin
实现三栏布局,主要是margin
的负值的应用。
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| <!DOCTYPE html> <html> <head> <title>Float</title> <style type="text/css"> .container{ height: 200px; border: 1px solid #eee; } .container div{ color: #fff; height: 100%; } .container > .left{ float: left; width: 200px; margin-left: -100%; background-color: #19be6b; } .container > .main-container{ float: left; width: 100%; } .container > .main-container > .main{ margin-left: 200px; margin-right: 200px; background-color: #2979ff; } .container > .right{ float: right; width: 200px; margin-left: -200px; background-color: #fa3534; } </style> </head> <body> <div class="container"> <div class="main-container"> <div class="main">main</div> </div> <div class="left">left</div> <div class="right">right</div> </div> </body> </html>
|
Table
利用table
布局即表格的样式,实现三栏布局。
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 32 33 34 35 36
| <!DOCTYPE html> <html> <head> <title>Table</title> <style type="text/css"> .container{ display: table; height: 200px; width: 100%; border: 1px solid #eee; } .container > div{ display: table-cell; color: #fff; } .container > .left{ width: 200px; background-color: #19be6b; } .container > .main{ background-color: #2979ff; } .container > .right{ width: 200px; background-color: #fa3534; } </style> </head> <body> <div class="container"> <div class="left">left</div> <div class="main">main</div> <div class="right">right</div> </div> </body> </html>
|
Grid
目前CSS
布局方案中,网格布局可以算得上是最强大的布局方案了。它可以将网页分为一个个网格,然后利用这些网格组合做出各种各样的布局。Grid
布局与Flex
布局有一定的相似性,都可以指定容器内部多个成员的位置。不同之处在于,Flex
布局是轴线布局,只能指定成员针对轴线的位置,可以看作是一维布局。Grid
布局则是将容器划分成行和列,产生单元格,然后指定成员所在的单元格,可以看作是二维布局。
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 32 33
| <!DOCTYPE html> <html> <head> <title>Grid</title> <style type="text/css"> .container{ height: 200px; display: grid; grid-template-columns: 200px auto 200px; border: 1px solid #eee; } .container > div{ color: #fff; } .container > .left{ background-color: #19be6b; } .container > .main{ background-color: #2979ff; } .container > .right{ background-color: #fa3534; } </style> </head> <body> <div class="container"> <div class="left">left</div> <div class="main">main</div> <div class="right">right</div> </div> </body> </html>
|
参考
1 2 3
| https://zhuanlan.zhihu.com/p/25070186 https://juejin.cn/post/6844903686758465550 https://juejin.cn/post/6844904062224171021
|