最近在面試中遇到過這樣一道面試題,讓寫出左中右,三欄佈局,左欄右欄固定寬度200px,中間欄寬度自適應。要求三欄的高度隨最高的一欄展現css
常規拿到這個面試題,首先想到的是三個盒子左浮動右浮動,而後中間盒子給個左右外邊距,防止內部元素被浮動元素覆蓋。可是這樣只是實現了基本的三列布局。html
代碼以下:面試
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <style> * { margin: 0; padding: 0; } .left { float: left; background:rosybrown; } .right { float: right; background: royalblue; } .left,.right { width: 200px; } .center { margin-left: 200px; margin-right: 200px; background-color: aqua; } </style> </head> <body> <div class="container"> <div class="left">left</div> <div class="right">right</div> <div class="center"> 1 <br> 2 <br> 3 <br> 4 <br> 5 <br> </div> </div> </body> </html>
效果以下所示:佈局
乍一看實現了三列布局,可是題目要求等高,這個可就麻煩了。常規的css,非table佈局很難解決這個問題。因而乎只能利用一些奇淫巧技。代碼改動以下:flex
<style> .container { overflow: hidden; } .left,.right { padding-bottom: 9999px; margin-bottom: -9999px; width: 200px; } .center { margin-left: 200px; margin-right: 200px; background-color: aqua; padding-bottom: 9999px; margin-bottom: -9999px; } </style>
一樣的html片斷,此次再看下效果:ui
實現了等高效果。當時我是記得能夠利用負邊距實現這個奇淫巧技的,可是筆試紙上寫的css寫的對不對忘記了。spa
這裏原理暫且不寫,感興趣的小夥伴能夠查詢下負邊距相關的資料。code
在跟面試官聊了之後,其實面試官是想考察我對flex的使用。那麼若是用flex該如何實現這種三列布局呢?htm
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <style> * { margin: 0; padding: 0; } .container { display: flex; } .left { width: 200px; background: #f00; } .right { width: 200px; background: #f0f; } .center { flex: 1; background: #00f; } </style> </head> <body> <div class="container"> <div class="left"> left </div> <div class="center"> center<br> 123 </div> <div class="right"> right </div> </div> </body> </html>
要點就是父容器設置爲flex容器,子元素會自動變爲flex項目。這時候經過給center設置flex:1,讓其撐滿剩餘空間。blog
這裏面試官繼續問了: flex是三個屬性的縮寫,那你知道是哪三個屬性嗎?
這裏直接說答案爲:[ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
其中flex-grow規定了對flex項目對剩餘空間的分配比例(剩餘空間多的話)
flex-shrink規定了容器空間不夠時,容器項目要被壓縮的比例。
flex-basic通常指項目佔據主軸的空間,好比200px;
這裏只對center的值設置了flex:1,那left,right,center的flex默認值分別展開是什麼呢?
這裏經過F12審查能夠獲得結果:
.left與.right =>
flex-basic:auto(寬200px);flex-grow:0(不佔剩餘空間);flex-shrink:1(縮小比例佔1份)
.center => flex-basic(0%);flex-grow:1(left與right都爲0,因此它佔據了所有的剩餘空間);flex-shrink:1(縮小比例佔1份)
由於當前空間足夠,因此這裏flex-shrink沒有體現。
大概與這道題相關的css知識有這麼多,若是是你,能作到哪一步呢?