定期更新面經P5 P6面經、歡迎star
左邊定寬、右邊自適應(類似管理臺)
方案一 左邊設定左浮動,右邊寬度設定100% ()
.left { float: left; } .right { width: 100% }複製程式碼
方案二 左設定左浮動、右邊也左浮動 但是使用calc去補寬度長度計算(方案一二沒有完全分層)
-【分析】.left { float: left; } .right { width: calc(100vw-200px); }複製程式碼
- 浮動。(注意:為了不影響其他元素,別忘了在父級上清除浮動)
- calc() = calc(四則運算) 用於在 css 中動態計算長度值,需要注意的是,運算子前後都需要保留一個空格,例如:width: calc(100% - 10px);
- vw: viewport width。1vw = viewport 寬度的 1%, 100vw = viewport width,
同樣的還有 vh: viewport height。1vw = viewport 高度的 1%, 100vh = viewport height。
瀏覽器支援情況: 主流瀏覽器、IE10+
vw 和 vh 會隨著viewport 的變化而變化,因此十分適合於自適應場景來使用。
方案三 父容器設定 display:flex;right部分設定 flex:1
.contain { display: flex } .right { flex: 1 }複製程式碼
方案四 右邊div套個包裹、並前置、左及包裹 雙浮動左
.contain{ background: pink; float: left; width: 100%; } .left{ height: 200px; width: 200px; float: left; margin-left: -100%; background: red; } .right { background: blue; height: 300px; margin-left: 200px; }複製程式碼
<div class="contain"> <div class="right"> rrr </div> </div> <div class="left">lll </div>複製程式碼
【分析】
- 首先設定左邊部分和右邊部分左浮動,併為自適應部分(Right)設定寬度100%。此時的效果是這樣的:
- 設定左邊部分左外邊距為負100%,此時效果如下:
但是右邊部分的寬度仍然為100%,部分內容被 Left 所覆蓋。 - 為 Right 部分新增左邊距(即 Left 部分的寬度)
總結
- 關於左側寬度固定,右側寬度自適應兩列布局的一種很常用的方法我相信大家都知道。就是利用左側元素浮動,或者絕對定位的方式使其脫離常規文件流,讓兩個塊級元素能夠在同一行顯示。然後右側元素 margin-left 的值等於左側元素寬度,這時右側元素將緊挨著左側元素,由於塊元素的寬度會自動預設充滿剩下的螢幕,所以就實現了右側自適應的效果了。
- 第二種方法,我利用的是建立一個新的BFC(塊級格式化上下文)來防止文字環繞的原理來實現的。BFC就是一個相對獨立的佈局環境,它內部元素的佈局不受外面佈局的影響。它可以通過以下任何一種方式來建立:
float的值不為none
position的值不為static或者relative
display的值為 table-cell, table-caption, inline-block, flex, 或者 inline-flex中的其中一個
overflow的值不為visible
關於BFC,在w3c裡是這樣描述的:在BFC中,每個盒子的左外邊框緊挨著包含塊的左邊框(從右到左的格式化時,則為右邊框緊挨)。即使在浮動裡也是這樣的(儘管一個包含塊的邊框會因為浮動而萎縮),除非這個包含塊的內部建立了一個新的BFC。這樣,當我們給右側的元素單獨建立一個BFC時,它將不會緊貼在包含塊的左邊框,而是緊貼在左元素的右邊框。就像是箱子一個個排列 而不是疊上去
<!DOCTYPE> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <link rel="stylesheet" href="test.css" type="text/css"> </head> <style media="screen"> .one { float: left; height: 100px; width: 300px; background-color: blue; } .two { overflow: auto; height: 200px; background-color: red; } </style> <body> <div class="one"></div> <div class="two">第二種方法</div> </body> </html>複製程式碼
左右定寬 中間自適應
position(絕對定位法) center的div需要放在最後面
絕對定位法原理是將左右兩邊使用absolute定位,因為絕對定位使其脫離文件流,後面的center會自然流動到他們上面,然後使用margin屬性,留出左右元素的寬度,既可以使中間元素自適應螢幕寬度。<div class='left'>left</div> <div class='right'>right</div> <div class='center'>center</div> .left,.right{ position: absolute; width: 200px; height: 200px; background-color: #df8793; top:0; } .left{ left:0px; } .right{ right: 0px; } .center{ margin: 0 210px; overflow: hidden; background-color: yellow; height: 200px; }複製程式碼
float:自身浮動法 center的div需要放在最後面
自身浮動法的原理就是使用對左右使用分別使用float:left和float:right,float使左右兩個元素脫離文件流,中間元素正常在正常文件流中,使用margin指定左右外邊距對其進行一個定位。<div class='left'>left</div> <div class='right'>right</div> <div class='center'>center</div> .left,.right{ width: 200px; height: 200px; background-color: #df8793; } .left{ float: left; } .right{ float: right; } .center{ margin: 0 210px; overflow: hidden; background-color: yellow; height: 200px; }複製程式碼
聖盃佈局
聖盃佈局的原理是margin負值法。使用聖盃佈局首先需要在center元素外部包含一個div,包含div需要設定float屬性使其形成一個BFC,並設定寬度,並且這個寬度要和left塊的margin負值進行配合
<div class='wrap'>
<div class='center'>center</div>
</div>
<div class='left'>left</div>
<div class='right'>right</div>
.wrap{
width: 100%; // .left margin-left 同步
float: left;
height: 200px;
background-color: #238978;
}
.center{
margin: 0 210px;
}
.left{
float: left;
margin-left: -100%; // .wrap width同步
width: 200px;
height: 200px;
background-color: #eee;
}
.right{
float: left;
margin-left: -200px;
width: 200px;
height: 200px;
background-color: #eee;
}複製程式碼
- flex佈局
在外圍包裹一層div,設定為display:flex;中間設定flex:1;但是盒模型預設緊緊挨著,可以使用margin控制外邊距。<div class='wrap'> <div class='left'>left</div> <div class='center'>center</div> <div class='right'>right</div> </div> .wrap{ display: flex; } .center{ flex:1; margin: 0 10px; background-color: pink; } .left{ width: 200px; height: 200px; background-color: #eee; } .right{ width: 200px; height: 200px; background-color: #eee; }複製程式碼
水平居中
- 行內元素的居中 (父元素 text-align: center ) 這樣子元素如果為inline-block 就會居中
- 塊狀元素居中 (塊狀沒法用text-align)
- 寬度一定: 我們使用對該元素margin: auto來實現 或 margin: 20px auto 並且一定要設定寬度值width 一起使用
- 寬度不定 :
1) 加table標籤設定 margin:0 auto 將需要進行居中的元素,用一個大表格將其圍起來(而且這個表格只有這一個單元格哦),然後設定表格的屬性(如第2條方法)居中就行。不過缺點是加了不少的無用標籤,程式碼看起來比較臃腫。
2) display: inline 設定text-align:center 居中的塊級元素的display屬性設定為inline,這樣的目的是先把塊級元素變為行內元素,可以在一行內顯示,然後將這些元素的父級元素text-align設定為:center即可。大概原理就是:塊級->行內->居中(參照第1條方法),不過缺點也很明顯,塊級元素的一些特點沒有了,例如高度、寬度設定等。
3) 運用float屬性,主要的思想也就是將所需要居中的元素先float到左邊,這樣就能在一行內顯示,然後將整個列表float到父元素左邊,然後設定left來設定居中。怎麼設定呢?先設定父元素:left:50%,這樣整個父元素就往右便宜50%,然後設定列表:right:50%,這樣列表的東西再往左走父元素的50%,這樣就達到了居中的目的 基本思想也就是將父元素(容器)先往右偏移父容器寬度的50%,然後再將列表的元素向左相對偏移50%,就可以得到居中的效果。
- 寬度不定 :
- 寬度一定: 我們使用對該元素margin: auto來實現 或 margin: 20px auto 並且一定要設定寬度值width 一起使用
垂直居中
1) 固定高度
- line-height + height 但是 固定高度,無法實現兩行文字的垂直居中對齊
- absolute 固定高度 無法自適應內容 元素脫離文件流
<div class="container">Hello World!</div>複製程式碼
.container { position: absolute; left: 50%; top: 50%; margin-left: -150px; margin-top: -150px; width: 300px; height: 300px; border: 1px solid red; } // 支援calc .container { position: absolute; left: calc(50% - 150px); top: calc(50% - 150px); width: 300px; height: 300px; border: 1px solid red; }複製程式碼
- 空標籤+float:left
<div class="space"></div> <div class="container"> <div class="inner"> hello world! </div> </div>複製程式碼
.space { float: left; height: 50%; margin-top: -150px; } .container { clear: both; height: 300px; border: 1px solid red; position: relative; }複製程式碼
2) 高度自適應
- CSS3裡使用transform裡的translate()的兩個百分比引數 如果兩個引數都為百分比值,此時會基於自身寬度和高定進行移動。此函式移動的機制同position:relative相似
<div class="container">Hello World!</div> .container { position: absolute; top: 50%; left: 50%; transform: translate(-50%, -50%); // 自身寬度和高度的一半 border: 1px solid red; } 優點:無需定高度。高度隨內容自適應。 缺點:元素脫離文件流。如果需要居中的元素已經在高度上超過了視口,那它的頂部會被視口裁切掉。複製程式碼
擺脫maigin 百分比靠父元素寬度的問題 50%加上translate負值並不能實現垂直居中佈局。 改用
vh來做<div class="container">Hello World!</div> .container { width: 300px; margin: 50vh auto 0; transform: translateY(-50%); border: 1px solid red; }複製程式碼
- flex佈局
<div class="container"> <div class="inner"> <p>hello world!</p> </div> </div>複製程式碼
當我們使父元素display: flex時,margin: auto不僅可以水平居中,也能夠實現垂直居中。這是因為auto外邊距會平分水平或垂直方向上的額外空間。.container { display: flex; height: 100vh; } .inner { margin: auto; }複製程式碼
當然,也可以使用justify-content: center來定義彈性專案主軸的對齊方式,align-items: center來定義彈性專案側軸的對齊方式。.container { display: flex; justify-content: center; align-items: center; height: 100vh; }複製程式碼
模擬表格 父display:table 子display: table-cell vertical-align: middle
<div class="container"> <div class="inner"> hello world! </div> </div>複製程式碼
.container { display: table; /* 讓div以表格的形式渲染 */ width: 100%; border: 1px solid red; } .inner { display: table-cell; /* 讓子元素以表格的單元格形式渲染 */ text-align: center; vertical-align: middle; }複製程式碼
作者:渺渺惜雨懷_
連結:https://juejin.im/post/5a1e2f246fb9a045186a7db2
來源:掘金
著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。