眾所周知,css的三大特性分別是 繼承性,層疊性,和優先級。
那么這里就詳細說一下css中width的繼承性及其特殊情況。
繼承性概念詳解:css的繼承性指的被包在內部的標簽擁有外部標簽的樣式性,子元素可以繼承父元素的屬性。但也不是所有的css屬性都有繼承性的。
常見的擁有繼承性的屬性以 text- 、 font- 、line- 開頭的屬性較為常用。其中也有例外如a標簽的字體顏色是不繼承的,它有它自己的默認顏色-藍色,下划線等自帶樣式,h1~h6的字體大小是不繼承的,跟a標簽一樣都是有自帶默認值,除非單獨為其設置樣式 才可以改變。
下面就來詳細說一下width屬性的“繼承”關系。
大家在寫代碼過程中,是不是經常遇到 個一個父div設置了一個width值 如.father {width:200px}; 其子元素div只設置一個高度就會有寬高了。
正常場景下:
<style> .father { width:200px; height:200px; background-color:green; } .son { height:100px; background-color:red; } </style> <body> <div class="father"> <div class="son"></div> </div> </body>
效果圖:
特殊場景一:
那么如果子元素是一個內聯元素,或內聯塊元素呢?會是什么效果?
<style> .father { width:200px; height:200px; background-color:green; } .son { display:inline-block; height:100px; background-color:red; } </style> <body> <div class="father"> <!-- <div class="son"></div> --> <a href="#" class="son"></a> </div> </body>
你會發現只有一個綠色背景,紅色子元素並沒有顯示出來。這表明只有塊元素才可以默認“繼承”其父元素的width.(項目中就遇到一個類似的坑,所以寫此筆記記錄一下)。
特殊場景二:
如果子元素是定位元素或浮動元素,其“繼承性”還正常么?下面就用代碼實驗一下。
.father { width:200px; height:200px; background-color:green; } .son { /* position:absolute; */ float:left; height:100px; background-color:red; } </style> <body> <div class="father"> <!-- <div class="son"></div> --> <div class="son">我是子元素</div> </div> </body>
實驗結果發現,.son的元素寬度只是其字撐開的那么寬,並沒有“繼承”其父元素的寬度。可見,浮動元素和定位元素也是不默認(不自動)“繼承”其父元素寬度的。
當我們遇到這三種情況的時候,就需要為這些元素單獨設置一下width。width的單位有固定單位和相對單位,你可以把它設置稱一個固定值(200px),也可以把它設置為一個百分數(100%)。
那么問題又來了,百分數是一個相對單位,它的基准是什么呢?是相對於誰的百分比呢?
場景一中,其就是默認相對於其父元素.father的寬度。
場景二中,float的子元素其width 百分數也是始終相對於其父元素.father而言, 但定位的子元素就比較特殊了:
position為absolute的子元素:
(1) 如果.father是一個static的元素,則.son的寬100%是基於body說的。跟body的寬度一樣大。
(2) 但是如果.father也是一個定位的元素,設置了relative或absolut或fixed,則.son的width100%就是相對於.father而言的。否則就是相對於離其最近的一個擁有定位元素的父元素而言。
position為fixed的子元素:
其width的100%是相對於body而言。
position為relative的子元素:
不管直接其父元素是否為定位元素,其width100%始終是相對於其直接父元素而言的。
總結:
1.當符合css默認“繼承”的情況下(子元素必須是塊級元素且無定位或浮動),是不需要寫width屬性,就可以默認“繼承”的。
否則就要特殊聲明一下width屬性。
2.當使用width:100%的時候 也要注意其基准點到底是誰:
(1)對於使用position:relative的子元素或浮動的子元素,其基准點始終是基於其直接父元素而言的,跟其父元素是否有定位無關。
(2)對於絕對定位position:absolute的子元素,其基准點是相對於離其最近的一層定位父元素而言。如果其所有父級元素均無定位,則是相對於body而言。
(3)對於使用position:fixed的子元素,其基准點就是body。跟父元素無關。
如果還有其他特殊情況,歡迎大家評論指出哦。我會再做補充上去。