css百分比的應用

前言

百分比的應用隨處可見,在這裏作一個小小的總結。git

使用百分比的場合

  • [ 盒子模型 ]
    • width、height
  • [ 文本 ]
    • font-size、line-height 、vertical-align
  • [ 背景 ]
    • border-radius、background-position
  • [ 佈局 ]
    • bottom、left、right、top
  • [ 動畫 ]
    • transform: translate

若是上面列舉的全部屬性你都可以輕鬆地說出它們的百分比含義,那麼估計這篇文章就不大適合你了。github

接下去咱們使用JsFiddle上面的demo來逐個說說這些樣式的百分比bash

1. width 和 height

這個最經常使用也是最簡單的了,它們的百分比計算是基於包裹它的父元素的寬和高來計算,好比:佈局

其盒子模型如圖所示 :
box model動畫

有一種特殊狀況是,父元素沒有明確的高度定義 [ 指的是不定義height或者使用min/max-height這種,都屬於不明確的高度定義 ],而且子元素使用百分比而且不是絕對定位,那麼這時候的百分比等同於auto。this

width : auto

在 CSS3 中,width:auto多種尺寸表現有了專門的屬性值進行對應spa

.example1 {
    width: fill-available;
}
.example2 {
    width: max-content;
}
.example3 {
    width: min-content;
}
.example4 {
    width: fit-content;
}
複製代碼

width 的四種表現

充分利用可用空間 [ fill-available ]

  • 塊級元素
    <div> 、<p>這些元素的寬度默認是100%基於父級容器的
  • 行內元素
    <inline-block> 內容超過一行,且寬度大於容器寬度的時候

收縮與包裹 [ fit-content ]

  • float 、position : absolute
    width = 內容寬度
  • 收縮到最小 [ min-content ]
    • table-layout = auto、父元素爲position : relative且寬度很小,子元素爲position : absolute
      [ 你們空間都不夠的時候,文字能斷的就斷,中文是隨便斷的,英文單詞不能斷 ]

超出容器限制 [ max-content ]

  • 行內元素
    white-space:nowrap

height : auto

height:100% 暗示元素將具備其父容器的100%高度。
height:auto 意味着,該元素將具備靈活的高度,即其高度將取決於其子元素的高度翻譯

  • 塊級元素
    • 子元素 => (塊級元素)
      height = .子元素 { height }
    • 子元素 => (行內元素)
      由行內元素組成line-box高度撐開
  • 行內元素
    line-heightvertical-align

2. margin和padding

這兩個屬性的百分比就比較有意思了,也是咱們常常用錯的兩個。在CSS盒子模型規範明確提出了其百分比的含義:設計

The percentage is calculated with respect to the width of the generated box's containing block. Note that this is true for 'margin-top' and 'margin-bottom' as well. If the containing block's width depends on this element, then the resulting layout is undefined in CSS 2.1.3d

padding的解釋也是相似。

上面的意思能夠總結出三點:

百分比的計算是基於其包含塊的寬度
百分比的計算規則適用於 margin 和 padding 的四個方向
若是包含塊的寬度取決於該元素,那麼百分比的使用結果是未定義的。

這時定有童鞋會疑惑,爲何 CSS 規範的制定者會選擇使用包含塊的寬度來做爲參考值,而不是高度?

其實在上面總結的三點中已經有所涉及的了,在咱們平時的樣式佈局中,元素的高度取決於子元素的高度,若是子元素的 margin 或者 padding 的百分比又依賴於包含塊的高度,那麼兩者互相依賴,就永遠沒法獲得一個穩定的值,陷入了一種死循環,所以也許是基於這個考慮,CSS 的規範中才會提到上面要點的第三點。以上純屬本身的猜想,僅供參考。

margin : auto

  • 垂直方向
    • 水平方向的 auto,其計算值取決於可用空間( 剩餘空間 )

原文:On the B edge and D edge, the used value depends on the available space.
翻譯:若是場景是B和D,那麼其 auto 計算值取決於可用空間。

  • 水平方向
    根據規範,margin-top: auto; 和 margin-bottom: auto;,其計算值爲0

padding : auto ?

auto is not a valid value for padding property

3. border-radius

根據MDN-border-radius的百分比介紹:

  • 橫軸上的百分比參考的是元素自身的寬度
  • 縱軸上的百分比參考的是元素自身的高度,負值是無效的

border-radius的百分比參考值是自身的尺寸,因而你能夠常常使用百分比來畫出一個圓形來:

4. background-position

background-position 這個屬性容許你在它的包含塊中隨意移動背景圖片(或者漸變),默認值是0 0

若是使用百分比,那麼百分比的計算應該是這樣的,假設一個容器的長寬爲400X200,圖片是150X150,那麼當設置 background-position: 20% 100%

父元素百分比位置和圖片百分比位置對應 [ 經過容器位置肯定圖片位置 ]

(0, 0) => ((400 - 150) * 20%, (200 - 150) * 100%)
也就是移動的結果是(父元素-背景圖片)*百分比,這樣的設計很符合咱們平時排版的思路。

font-size

參照物 => 父元素

line-height

參照物 => 自身 font-size 大小

vertical-align

參照物 => 自身 line-height 大小

bottom、left、right、top

參考的是元素包含塊的尺寸

  • left 和 right
    • 參照包含塊的寬度
  • bottom 和 top
    • 參照包含塊的高度

transform: translate

在水平或者垂直居中的應用場景中,我最常使用的即是這個平移變換了,輕輕鬆鬆的-50%就可讓塊元素居中,那麼這個百分之50%基於的是什麼樣的參考值呢?答案即是其自身元素的寬度或者高度,這裏的寬度和高度是否包含了padding和border呢?

參考的是border-box的尺寸

請注意,當百分比值用於可繼承屬性時,只有結合參照值計算後的絕對值會被繼承,而不是百分比值自己。

@dlm-wizard
Write
相關文章
相關標籤/搜索