在寫正文以前css
固然要注意:咱們這裏所說的中間部分寬度自適應就是隨着屏幕大小的改變而本身適應的過程。這也是三欄佈局產生的緣由所在html
HTML代碼瀏覽器
<div class="werppar"> <div class="left"></div> <div class="right"></div> <div class="container"></div> </div>
下面是 css 代碼部分dom
.werppar{ /* 造成bfc塊級做用域上下文 ,目的爲了清除浮動*/ overflow: hidden; border: 5px solid red; } .left{ float: left; width: 200px; height: 200px; background-color: lawngreen; } .right{ float: right; width: 200px; height: 200px; background-color: lightcoral; } .container{ margin: 0 200px; height: 200px; background-color: rebeccapurple; }
html佈局
<div class="werppar"> <div class="container"></div> <div class="left"></div> <div class="right"></div> </div>
下面是cssflex
.werppar{ position: relative; } .left{ position: absolute; top: 0; left: 0; width: 200px; height: 200px; background-color: lawngreen; } .right{ position: absolute; top: 0; right: 0; width: 200px; height: 200px; background-color: lightcoral; } .container{ margin: 0 200px; height: 200px; background-color: rebeccapurple; }
<div class="werppar"> <div class="left"></div> <div class="right"></div> <div class="container"></div> </div>
下面是css代碼3d
.werppar{ width: 100%; } .left{ float: left; width: 200px; height: 200px; background-color: gold; } .right{ float: right; width: 200px; height: 200px; background-color: greenyellow; } .container{ /*這裏造成bfc區域,不會與浮動的元素髮生重疊*/ overflow: hidden; height: 200px; background-color: palevioletred; }
效果以下:
code
效果仍是同樣,此時的container區域就是一個bfc區域了,那麼它就不會被浮動元素蓋住,container的寬度就是減去left的寬度 + right的寬度,剩下的就是本身的區域,這樣不用像margin : 0 200px;左右撐開邊距,因此也就造成的寬度自適應,不過它的缺點也是顯而易見的,不能優先渲染container區域htm
<div class="werppar"> <div class="container"></div> <div class="left"></div> <div class="right"></div> </div>
cssblog
*{ margin: 0; padding: 0; } .werppar{ background-color: pink; /*左右欄經過添加負的margin放到正確的位置了,此段代碼是爲了擺正中間欄的位置*/ padding:0 200px; } .container,.left,.right{ float: left; height: 200px; } .container{ width:100%; height:200px; background:blue; } .left{ width:200px; height:200px; /*margin負值,讓移動父級容器的寬度*/ margin-left:-100%; background:#f40; /*中間欄的位置擺正以後,左欄的位置也相應右移,經過相對定位的left恢復到正確位置*/ position:relative; left:-200px; } .right{ width:200px; height:200px; margin-left:-200px; background:#0c9; /*中間欄的位置擺正以後,右欄的位置也相應左移,經過相對定位的right恢復到正確位置*/ position:relative; right:-200px; }
能夠看下效果圖:
這就是所謂的聖盃佈局,那麼這個原理是什麼呢? 其實就是基於兩條 1.浮動2.margin
負值,我來解釋解釋
container
元素寬度100%,寬度全給了container
了,哪left和right天然會掉下去了margin-left
負值到一個界限,它就會貼回到上一行,由於他們是一塊兒浮動的,因此咱們須要負一個它父容器的總寬度,這時候它回到的上一行,此時咱們還須要,使用定位將這個left元素,位移到正確的位置,這樣就很簡單left:-自身寬度便可
,margin
一個負的自身寬度,在使用定位right:-200px
將其迴歸到正確的位置,🆗這樣就搞定了<div class="werppar"> <div class="box"> <div class="container"></div> </div> <div class="left"></div> <div class="right"></div> <p style="clear: both;"></p> </div>
css
.werppar{ width:100%; } .box,.left,.right{ float: left; height: 200px; } .box{ width:100%; height:200px; } .container{ margin : 0 200px; height: 200px; background:blue; } .left{ width:200px; height:200px; margin-left:-100%; background:#f40; } .right{ width:200px; height:200px; margin-left:-200px; background:#0c9; }
效果以下:
這裏咱們能夠看出,這裏面和聖盃佈局其實差異不是很大,
.box
的元素包裹起來了,並且浮動的不再是.container
元素了,這也就是說,container元素不會被外面的浮動元素所影響了left:-100%
就能回到想要的位置?這是爲何呢,須要注意的一點是,在這裏。left父級盒子是寬度100%的,再也不是聖盃佈局中留出來左右padding值的父級自適應寬度的盒子margin-left:-200px
正好貼到父級盒子最右邊,就能獲得想要的位置了<div class="flex-box"> <div class="flex-content flex-item">我是內容</div> <div class="flex-left flex-item">我是左邊欄</div> <div class="flex-right flex-item">我是右邊欄</div> </div>
css
.flex-box{ display: flex; } .flex-left{ width: 200px; height: 200px; background-color: lime; order: 0; } .flex-content{ order: 1; width: 100%; background-color: aquamarine; } .flex-right{ width: 200px; height: 200px; background-color: gold; order: 2; }
這裏就很簡單了,利用彈性盒子的手法,給子元素添加的屬性order,這個屬性意思爲在主軸方向的排列中顯示的優先級,值越小,優先級越高,放在最前的container最早渲染
筆記總結 🆗,就到這裏了,我還要繼續奮戰