兩欄佈局,左邊定寬200px,右邊自適應。如何實現?
個人第一個反應就是:用flex伸縮盒呀,而後balabala...
說完以後,面試官說,還有沒有別的方法?flex有些瀏覽器不支持
嗯...我愣了一下,日常遇到這種問題貌似都是這麼寫的...
別的方法?我又想了想。JS?對,JS確定能夠。
而後就說,能夠用JS獲取當前窗口寬度,而後減去200px就是右邊的寬度了
面試官:嗯,這樣的確能夠,可是佈局通常不要用JS,還有沒有別的方法?CSS的
額,這下我徹底愣住了好嘛,人也變得有些緊張。還要別的方法啊,什麼方法呢???
哎呀媽呀,想不出來,腫麼辦...
而後面試官看了我半天,十分體諒的說,那咱們進行下一個問題吧...
(以上面試官原話記不大請了,可是意思就是這樣~)
回來後,通過百度,哇!原來方法如此之多~還如此簡單~
下面就來總結一下~html
1、兩欄佈局(左定寬,右自動)
1. float + margin
即固定寬度元素設置float屬性爲left,自適應元素設置margin屬性,margin-left應>=定寬元素寬度。
舉例:
HTML代碼:前端
- <div class="wrap">
- <div class="wrap_left">
- 我是左欄
- </div>
- <div class="wrap_right">
- 我是右欄
- </div>
- </div>
複製代碼
CSS代碼web
- html,body,div{
- margin: 0;
- padding: 0;
- }
- .wrap{
- margin: 10px;
- }
- .wrap_left{
- float: left;
- width: 200px;
- background-color: red;
- }
- .wrap_right{
- margin-left: 220px;
- background-color: green;
- }
複製代碼
2.position + margin
即在父標籤設置position屬性爲relative;子標籤中定寬元素設置position屬性爲absolute;自適應元素設置margin屬性,margin-left>=定寬元素寬度。
舉例:
HTML代碼面試
- <div class="wrap">
- <div class="wrap_left">
- 我是左欄
- </div>
- <div class="wrap_right">
- 我是右欄
- </div>
- </div>
複製代碼
CSS代碼瀏覽器
- html,body,div{
- margin: 0;
- padding: 0;
- }
- .wrap{
- margin: 10px;
- position: relative;
- }
- .wrap_left{
- position: absolute;
- width: 200px;
- background-color: red;
- }
- .wrap_right{
- margin-left: 220px;
- background-color: green;
- }
複製代碼
3.float + 負margin
即給自適應寬度元素定義一個父標籤,並設置float屬性爲left;width爲100%;自適應寬度元素設置margin,margin-left應>=定寬元素寬度;
固定寬度元素設置margin-left屬性爲負值:-100%;
除此以外應注意HTML結構中應先寫自適應元素,再寫固定寬度元素。
舉例:
HTML代碼ide
- <div class="wrap">
- <div class="wrap_right">
- 我是右欄
- </div>
- </div>
- <div class="wrap_left">
- 我是左欄
- </div>
複製代碼
CSS代碼佈局
- html,body,div{
- margin: 0;
- padding: 0;
- }
- .wrap{
- float: left;
- width: 100%;
- }
- .wrap .wrap_right{
- margin-left: 220px;
- background-color: green;
- }
- .wrap_left{
- float: left;
- width: 200px;
- margin-left: -100%;
- background-color: red;
- }
複製代碼
注:使用的float屬性,必要時清除一下浮動。
4.用table佈局實現
來自評論裏@qazxsw的方法:flex
- <table width="100%" cellspacing="0" cellpadding="0" border="1" height="300">
- <tr>
- <td width="200" bgcolor="red"></td>
- <td bgcolor="green"></td>
- </tr>
- </table>
複製代碼
不過這個方法,必定要設置高度才能夠~
5.觸發BFC實現 —— 來自評論裏柯南同窗@15913127081的方法
關於BFC是什麼、怎麼觸發BFC以及BFC能夠用來作什麼,你們能夠看看這篇,前端精選文摘:BFC 神奇背後的原理(我會告訴你我也是纔看的麼~哈哈~)
實現方法,即爲定寬元素設置float:left;自適應寬度元素設置能夠觸發BFC的屬性。(能夠觸發BFC的屬性?繼續看上面那個連接!!)
示例:
HTML代碼:spa
- <div class="wrap_left">
- 我是左欄
- </div>
- <div class="wrap_right">
- 我是右欄
- </div>
複製代碼
CSS代碼:orm
- html,body,div{
- margin: 0;
- padding: 0;
- }
-
- .wrap_left{
- float: left;
- width: 200px;
- background-color: red;
- }
- .wrap_right{
- overflow: hidden;
- background-color: green;
- }
複製代碼
前面有說到通常我都是用的flex伸縮盒,那也來講一下用flex怎麼實現的吧
6.flex伸縮盒方法
即父標籤設置display:flex屬性,自適應元素設置flex-grow:1;
HTML代碼
- <div class="wrap">
- <div class="wrap_left">
- 我是左欄
- </div>
- <div class="wrap_right">
- 我是右欄
- </div>
- </div>
複製代碼
CSS代碼
- html,body,div{
- margin: 0;
- padding: 0;
- }
- .wrap{
- display: flex;
- display: -webkit-flex;
- }
- .wrap_left{
- width: 200px;
- background-color: red;
- }
- .wrap_right{
- flex-grow:1;
- -webkit-flex-grow:1;
- background-color: green;
- }
複製代碼
進階
2、三欄佈局
掌握了上面的方法,咱們會發現製做一個三欄佈局也是很是容易的。
下面咱們在上面栗子的基礎上,看看實現一個兩側定寬,中間自適應的三欄佈局如何實現
1. float + margin(兩側定寬,中間自適應)
HTML代碼:
- <div class="wrap_left">
- 我是左欄
- </div>
- <div class="wrap_right">
- 我是右欄
- </div>
- <div class="wrap_content">
- 我是中間欄
- </div>
複製代碼
CSS代碼:
- html,body,div{
- margin: 0;
- padding: 0;
- }
- .wrap_left{
- width: 200px;
- float: left;
- background-color: red;
- }
-
- .wrap_content{
- margin-left: 220px;
- margin-right: 220px;
- background-color: yellow;
- }
- .wrap_right{
- width: 200px;
- float: right;
- background-color: green;
- }
複製代碼
2. position + margin(兩側定寬,中間自適應)
HTML代碼:
- <div class="wrap_left">
- 我是左欄
- </div>
- <div class="wrap_right">
- 我是右欄
- </div>
- <div class="wrap_content">
- 我是中間欄
- </div>
複製代碼
CSS代碼
- html,body,div{
- margin: 0;
- padding: 0;
- }
- .wrap_left{
- width: 200px;
- position: absolute;
- background-color: red;
- left: 0;
- }
-
- .wrap_content{
- margin-left: 220px;
- margin-right: 220px;
- background-color: yellow;
- }
- .wrap_right{
- width: 200px;
- position: absolute;
- right: 0;
- background-color: green;
- }
複製代碼
3.float + 負margin(兩側定寬,中間自適應)
HTML代碼
- <div class="wrap">
- <div class="wrap_content">
- 我是中間欄
- </div>
- </div>
- <div class="wrap_left">
- 我是左欄
- </div>
- <div class="wrap_right">
- 我是右欄
- </div>
複製代碼
CSS代碼
- html,body,div{
- margin: 0;
- padding: 0;
- }
- .wrap{
- float: left;;
- width: 100%;
- }
- .wrap_left{
- width: 200px;
- float: left;
- margin-left: -100%;
- background-color: red;
- }
-
- .wrap_content{
- margin-left: 220px;
- margin-right: 220px;
- background-color: yellow;
- }
- .wrap_right{
- width: 200px;
- float: left;
- margin-left: -200px;
- background-color: green;
- }
複製代碼
4.table實現
- <table width="100%" cellspacing="0" cellpadding="0" border="1" height="300">
- <tr>
- <td width="200" bgcolor="red"></td>
- <td bgcolor="yellow"></td>
- <td width="200" bgcolor="green"></td>
- </tr>
- </table>
複製代碼
5.BFC方法
HTML代碼
- <div class="wrap_left">
- 我是左欄
- </div>
- <div class="wrap_right">
- 我是右欄
- </div>
- <div class="wrap_content">
- 我是中間欄
- </div>
複製代碼
CSS代碼
- html,body,div{
- margin: 0;
- padding: 0;
- }
-
- .wrap_left{
- float: left;
- width: 200px;
- background-color: red;
- }
- .wrap_right{
- float: right;
- width: 200px;
- background-color: green;
- }
- .wrap_content{
- overflow: hidden;
- background-color: yellow;
- }
複製代碼
注:HTML中先寫定寬元素,再寫自適應寬度元素。
6.flex伸縮盒
即父標籤設置display:flex屬性,自適應元素設置flex-grow:1;
HTML代碼
- <div class="wrap">
- <div class="wrap_left">
- 我是左欄
- </div>
- <div class="wrap_content">
- 我是中間欄
- </div>
- <div class="wrap_right">
- 我是右欄
- </div>
- </div>
複製代碼
CSS代碼
- html,body,div{
- margin: 0;
- padding: 0;
- }
- .wrap{
- display: flex;
- display: -webkit-flex;
- }
- .wrap_left{
- width: 200px;
- background-color: red;
- }
- .wrap_right{
- width: 200px;
- background-color: green;
- }
- .wrap_content{
- flex-grow:1;
- -webkit-flex-grow:1;
- background-color: yellow;
- }
複製代碼