實現三欄佈局
實現三欄佈局
三欄佈局在開發十分常見,即兩邊固定寬度,中間自適應寬度的佈局。
Flex
使用CSS3
的flex
佈局實現三欄佈局,Flex
佈局也稱彈性佈局,可以為盒狀模型提供最大的靈活性,是佈局的首選方案,現已得到所有現代瀏覽器的支援,此處主要是利用flex
容器成員預設按照主軸排列,以及利用flex
屬性即flex-grow
,flex-shrink
和flex-basis
的簡寫形式將間的塊自適應撐起。
<!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
配合實現也是可行的。
<!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
區域不會與浮動元素重疊的特性實現三欄佈局。
<!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; /* BFC可觸發條件之一:彈性元素,display為flex或inline-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
值使中間模組寬度自適應。
<!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
的負值的應用。
<!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
佈局即表格的樣式,實現三欄佈局。
<!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
佈局則是將容器劃分成行和列,產生單元格,然後指定成員所在的單元格,可以看作是二維佈局。
<!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>
每日一題
https://github.com/WindrunnerMax/EveryDay
參考
https://zhuanlan.zhihu.com/p/25070186
https://juejin.cn/post/6844903686758465550
https://juejin.cn/post/6844904062224171021