# 從零開始的前端生活--盒尺寸 padding padding對塊級元素的影響 css中預設的box-sizing 是content-box,使用padding會額外增加元素的尺寸。 當padding足夠大,把width擠沒掉了,這時width就無效。裡面的內容表現為“首選最小寬度” 首選最小寬 ...
從零開始的前端生活--盒尺寸
padding
padding對塊級元素的影響
-
css中預設的box-sizing 是content-box,使用padding會額外增加元素的尺寸。
-
當padding足夠大,把width擠沒掉了,這時width就無效。裡面的內容表現為“首選最小寬度”
首選最小寬度
- 對於中文,寬度表現為每個漢字的寬度
- 對於西方文字,寬度表現為特定的連續的英文字元單位組成,一般會終止於空格、短橫線、問號、以及其他非英文字元 (如果想要表現為每個字元為最小寬度,可用 word-break: break-all; )
- 類似於圖片等替換元素,寬度就是該元素內容本身的寬度
padding對純內聯元素(不包括替換元素)的影響
對上下元素的原本佈局沒有任何影響,僅僅是垂直方向發生了層疊
看下下麵這個例子,兩個div之間夾著inline元素a標簽
<div class="box"></div>
<a href="">padding</a>
<div class="box"></div>
.box {
height: 50px;
background-color: pink;
}
a {
background-color: skyblue;
padding: 50px;
text-decoration: none;
}
不瞭解的話,會認為a標簽撐開了div,兩個div之間距離會大於100px。實際上卻是這樣的。
結果是發生了層疊,在細品,兩個div之間的高度就是padding的font-size,也就是a標簽的content-box的高度,padding絲毫沒影響上下元素(註意這裡特指純內聯元素)
應用的話,我們可以利用純內聯元素的padding不影響上下元素的特點來增加點擊區域。
還有一個應用就是,如果一個網頁有頂部固定fixed一個導航欄,當我們通過地址欄的hash值和頁面html的id值相對應元素髮生瞄點定位或者電梯導航。標題就會被導航欄擋住了。如果我們希望不被擋住要怎麼實現?
假設我們標題使用h3,然後在padding或者margin的話,雖然符合要求,但是頁面佈局就亂了,這顯然不是我們想要的,我們要的是既能符合要求,又不影響上下元素。所以純內聯元素的padding就很好解決了問題。可以這樣用
<nav>導航欄</nav>
<h3 id="hash1">這是我們的標題</h3>
<h4><span id="hash2">這是我們的標題四</span></h4>
<h4><span id="hash3">這是我們的標題四</span></h4>
h3 {
background-color: pink;
padding-top: 50px;
height: 1000px;
}
h4 {
background-color: pink;
height: 600px;
}
h4 span {
border: 1px solid black;
padding-top: 50px;
}
簡單寫了代碼,就是在h4裡面套一個純內聯元素然後就可以滿足我們需求了。
- padding是不支持負值的
margin
理清一下各類尺寸
尺寸 | 原生DOM | jQuery |
---|---|---|
元素尺寸(包括padding和border) | offsetWidth | $().outerWidth() |
元素內部尺寸(包括padding不包括border)(元素可視尺寸) | clientWidth | $().innerWidth() |
元素外部尺寸 | $().outerWidth(true) |
margin和內部尺寸
padding會改變元素可視尺寸,畢竟上表寫著。margin只有在元素是“充分利用可用空間”狀態的時候,margin才會改變元素的可視尺寸。
什麼是充分利用可利用空間 的狀態?如下代碼
<div class="father">
<div class="son"></div>
</div>
.father{
width:300px;
margin: 0 -20px;
}
對於son這個div,他沒有設定width,也沒有保持包裹性,他就表現為“充分利用可利用空間”狀態,這個時候son的width就等於父元素的width。這個狀態就會受margin影響,如我們在son上加個 margin: -30px;此時son的寬度就等於父元素的寬度+30*2。無論垂直還是水平方向(這是對具有拉伸特性的絕對定位元素來說),我覺得哪一個方向符合“充分利用可利用空間”狀態就會被margin影響。
margin和外部尺寸
記住一句話,只要是塊狀元素,margin就會影響其外部尺寸。無論垂直還是水平。
只能使用子元素的margin-bottom來實現滾動容器的底部留白。
margin的百分比值的計算規則和padding一樣,都是相對於寬度計算的。
margin合併
定義:塊級元素的上外邊距與下外邊距有時會合併成單個外邊距,這個現象稱為“margin合併”。
備註:1、這裡的塊級元素不包括浮動和定位元素。2、預設是只發生在垂直方向上
margin合併的三種情況:
-
相鄰兄弟元素margin合併
-
父元素和第一個子元素/最後一個子元素
解決辦法(舉例margin-top):
- 父元素設置為塊狀格式化上下文元素,如設置overflow:hidden;
- 父元素設置border-top值
- 父元素設置padding-top值
- 父元素和第一個子元素之間添加內聯元素進行分隔
-
空塊級元素的margin合併
<div class="father"> <div class="son"> </div> </div>
.father{ overflow: hidden;} .son{ margin: 10px 0;}
分析: father設置 overflow是為了防止出現第二種情況(父子合併),結果還真沒出現父子合併,不過出現了空塊級元素合併,father的div高度結果為10px,並不是所想的20px
解決空塊元素合併:
- 設置垂直方向的border或padding
- 裡面添加內聯元素
- 設置height或者min-height
合併的計算規則:
"正正取大值,正負值相加,負負最負值"
舉個慄子
<div class="a"></div>
<div class="b"></div>
.a{ margin-bottom: 50px;}
.b{ margin-top:20px;}
結果a與b之間的間距為50,正正取大值嘛
margin: auto;
先看個慄子
<div class="father">
<div class="son">
</div>
</div>
.father{
width: 300px;
}
.son{
width:200px;
margin-right: 80px;
margin-left: auto;
}
這是單側的auto,效果是這樣的,margin-left = 20px;auto其實就是計算後的剩餘空間,原本300px-200px-80px = 20px
margin的auto就是為塊級元素的左中右對齊而設計的,和內聯元素的text-align相對應。如果上面的son改成
.son{
width: 200px;
margin-left: auto;
}
這樣實現的是右對齊。
.son{
width: 200px;
margin-left: auto;
margin-right: auto;
}
這樣實現的是居中對齊。
剛開始的時候,我覺得margin: auto; 應該是垂直居中對齊的,可是有時顯示不出來。原因分析如下
margin: auto; 計算是有前提條件的,就是元素具有對應方向的填充特性的,什麼意思?假設把son的寬度200px去掉,則son的寬度就會自動填充到和father一樣的寬度,這就是填充特性啊!height行不?當然不行,塊級元素的特點就是這樣,沒設height時就會預設為0,不會像width那樣填充。
所以由上分析,height沒有符合條件,預設下不會auto計算。
但是我們可以創造條件,如下
<div class="box">
<div class="innerbox">hhhhhh</div>
</div>
<div class="father">
<div class="son"></div>
</div>
.father {
width: 300px;
height: 150px;
position: relative;
background-color: pink;
}
.son {
position: absolute;
top: 0;
right: 0;
bottom: 0;
left: 0;
width: 200px;
height: 100px;
margin: auto;
background-color: skyblue;
}
先看下效果
這樣就是垂直居中對齊。為什麼?我們用定位,top:0;等這些,把son尺寸表現為:"格式化寬度和格式化高度",使寬高都具有填充特性。這樣他就可以auto計算了。
真的是太妙了!!!我人傻了。
margin無效
-
純內聯元素的垂直margin是無效的,並且對於內聯替換元素,它的垂直margin有效且不發生合併現象
-
有時候我們定位和float,margin會失效,記住方位要一致,否則只能影響兄弟元素,影響不了元素定位。比如,
top: xx;對應 margin-top; float: right; 對應margin-right;
也許對於第一點,會有這樣例子
<div class="box">
<img src="xxx.jpg">
</div>
.box img{
height: 96px;
margin-top: -200px;
}
這個例子圖片按道理會在box的外面,實際上它往上偏移到一定距離就不動了,margin失效了?不!有生效果,不過內聯元素還受到vertical-align和幽靈空白點的影響!
border
border不支持百分比值
border-width還支持關鍵字,thin,medium,thick,分別對應1px,3px,4px。
border-style
- 預設值為none
- solid 實線邊框
- dashed 虛線邊框
- dotted 圓點邊框
- double 雙線邊框
border-color
border-color的預設顏色就是color色值
border繪製圖形
看下下麵代碼
<div class="box"></div>
.box {
width: 0;
border: 50px solid;
border-color: pink red yellow skyblue;
}
結果是這樣的
驚呆了!當寬度和高度為0時,是這樣的,我之前以為border是長方條,我錯了!!!
我們把寬度和高度改成20px看看
.box {
width: 20px;
height: 20px;
border: 50px solid;
border-color: pink red yellow skyblue;
}
變成這樣
變成梯形了,神奇!!!
border等高佈局
原理:元素邊框高度總是和元素自身高度保持一致
結語
讀張老師的css世界寫的筆記