CSS-簡寫屬性的默認行為【Collection】

在segmentfault寫的筆記歸總能力太差了,以后寫筆記還是跑來簡書記錄一下算了。

we known:CSS有很多屬性簡寫(shorthand),比如:font text-decoration background border outline list-style overflow margin padding flex flex-flow transition transform animation等等(暫時想到這些)。
其中要注意的是fontbackground(以及background-positionbackground-clipbackground-origin)、flex的缺省屬性值。


font

來看看font簡寫的可包括哪些分寫屬性:

[font-style||font-variant||font-weight||font-stretch]? font-size[/line-height]? font-family
font-style = normal|italic|oblique
font-variant = normal|small-caps
font-weight = normal|bold|lighter|bolder
|100|200| 300|400|500|600|700|800|900
font-stretch = ultra-condensed|extra-condensed|condensed|semi-condensed|normal
|semi-expanded|expanded|extra-expanded|ultra-expanded
Global values:inherit|initial|unset
line-height = normal|<number>|<length>|<percentage>

font簡寫還可以直接使用瀏覽器自帶的一些設置:captioniconmenumessage-boxsmall-captionstatus-bar

1.其簡寫時,font-sizefont-family是必填且順序不能顛倒過來。
以下代碼可以檢驗:

#p2 {font: 12px/24px;}
#p3 {font: 12px/24px monospace;}
<p id="p1">Lorem ipsum dolor sit amet.</p>
<p id="p2">Lorem ipsum dolor sit amet.</p>
<p id="p3">Lorem ipsum dolor sit amet.</p>
var p1style = window.getComputedStyle(document.getElementById('p1'));
var p2style = window.getComputedStyle(document.getElementById('p2'));
var p3style = window.getComputedStyle(document.getElementById('p3'));
console.log(p1style.font);
console.log(p2style.font);
console.log(p3style.font);

console輸出證明一切:

normal normal normal normal 16px / normal Simsun
normal normal normal normal 16px / normal Simsun
normal normal normal normal 12px / 24px monospace

至于順序只要手動改下就知道了。

2.根據《CSS權威指南 第三版》P130:

在使用簡寫屬性font時,所有被忽略的值都會重置為默認值。

所以才會有font: 1em monospace;會重置line-height的情況存在。
還是上面那段html代碼先把樣式設置改為:

p {line-height: 3em;}
#p1 {font: 1em monospace;}

console輸出:

normal normal normal normal 13px / normal monospace
normal normal normal normal 16px / 48px Simsun

本來瀏覽器會有line-height的默認值,但是使用簡寫屬性后,這個屬性被重置為屬性的初始值(初始值比較妥當,initial

background

background比較麻煩的,各個分屬性的初始值都不一樣,沒有啥規律可言,而且還可以逗號分隔同時設置多個簡寫屬性。
先看看簡寫包含什么:

[<bg-layer>]* <final-bg-layer>
<bg-layer> = background-image||background-position[/background-size]?
||background-repeat||background-attachment||background-origin||background-clip
<final-bg-layer> = <bg-layer>||background-color
background-image = none|url|gradient|element()
background-position = [ [top|bottom|left|right|center
|<percentage>|<length>]{1,2} ]#
background-size = [<length>|<percentage>|auto]{1,2} |cover|contain
background-repeat = repeat-x|repeat-y| [repeat|space|round|no-repeat]{1,2}
background-attachment = scroll|fixed|local
background-origin = border-box|padding-box|content-box
background-clip = border-box|padding-box|content-box

1.這里需要注意的是最下面一層<final-bg-layer>,是可以同時包含background-imagebackground-color的,而且無順序限制。<final-bg-layer>必須放在background屬性聲明的最右邊,否則整條規則都無效。

2.然后要注意的background-position,雖然初始值(initial)是0% 0%,也就是元素的左上角。但是設置一個屬性值時,第二個屬性值(也就是水平方向的屬性值)默認為50%。這個屬性主要是在background-image屬性是一個url或者漸變圖像是體現出來。

3.background-clip初始值是border-box,主要體現為背景設置的可視內容區域。
background-origin初始值是padding-box。跟background-position類似,在設置background-image為url或者漸變圖像時體現出來,表現為圖像從哪個位置開始繪制。實際上這個屬性是可以對應background-position的:background-origin:padding-box就可以對應到background-position: 0 0background-origin:border-box;對應background-position: -10px -10px;(如果設置border-width: 10px;border-style不是none);background-origin:content-box;對應background-position: 10px 10px;(如果設置padding: 10px;)。

另外,在簡寫background中,background-originbackground-clip同時使用時,background-origin是排在左邊的,說明有順序要求,如:background:url('luoxiaohei.png') content-box padding-box;這時background-origincontent-boxbackground-clippadding-box
而如果設置一個值,則兩者都是這個值,如:background: url('luoxiaohei.png') border-box;這時background-originbackground-clip均為border-box

4.background-size的初始值是auto,也就是自適應對應寬高。(這里用url加載的圖片做舉例)在水平和垂直方向都未設置時,即兩者都是auto,則背景圖的尺寸就是加載的圖片的實際尺寸;如果有一個設置長度或者百分比(也就是設置了寬度),另一個不設置(還是初始值auto),則圖片的高度也會隨著寬度等比縮放。

如果設置的是長度值(如以px為單位的),圖片的實際寬高就是長度值指定的;當然如果只設置一個值,則第二個值為auto,即高度會根據第一個值(高度)的設置而等比縮放。

如果設置的是百分比,計算則要根據background-origin的設置來確定:
background-origin:content-box;時,background-size的百分比計算以內容區的寬/高為基數;
background-origin:padding-box時,百分比計算以邊框的內邊界以內的區域(包括padding區和內容區)的寬/高為基數;
background-origin:border-box;時,百分比計算以邊框的外邊界以內的區域(包括border區、padding區好內容區)的寬/高為基數。
測試代碼可以去我的Github找[1]

flex

flex作為CSS3新增的屬性,還一直在修改。目前要使用的話,要注意其簡寫屬性時的特殊情況。

flex-grow||flex-shrink||flex-basis

flex-grow初始值為0,表現為不拉伸;flex-shrink初始值為1,表現為按1份的比例收縮;flex-basis初始值為auto,表現為跟隨子項內容寬/高。
flex作用在彈性項(flex item)上。這個簡寫屬性的特殊屬性值,對應的分寫屬性值需要特別小心:
1.flex: initial;等價于flex: 0 1 auto;,也等價于flex: 0 auto;,全是分寫屬性的初始值;
2.flex: auto;等價于flex: 1 1 auto;。從屬性聲明可以看出其意思就是表示彈性項可以自有拉伸和收縮;
3.flex: none;等價于flex: 0 0 auto;。從屬性聲明可以看出其意思就是表示彈性項必能拉伸和收縮。
4.flex: 1;基本等價于flex: 1 0 0;。這個要特別小心了不是flex: 1 0 auto;。我做過檢驗,可以去我的segmentfault查看[2]

補充

其他重要的簡寫屬性,以后遇到了再補充...


  1. github ?

  2. segmentfault ?

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 選擇qi:是表達式 標簽選擇器 類選擇器 屬性選擇器 繼承屬性: color,font,text-align,li...
    wzhiq896閱讀 1,806評論 0 2
  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 13,814評論 1 92
  • 移動開發基本知識點 一.使用rem作為單位 html { font-size: 100px; } @media(m...
    橫沖直撞666閱讀 3,519評論 0 6
  • 選擇qi:是表達式 標簽選擇器 類選擇器 屬性選擇器 繼承屬性: color,font,text-align,li...
    love2013閱讀 2,339評論 0 11
  • 聽蔣勛老師的《孤獨六講》,講到孤獨,深有體會。身愈處喧囂,心愈覺隔離。孤獨并不包含貶義,在我看來。很多時候它已成為...
    清和qinghe閱讀 217評論 6 4