CSS篇主要從CSS兼容、CSS3新特性、CSS選擇器、高頻屬性、高頻佈局、高頻知識點、性能優化等方面進行概括。如對HTML知識點感興趣,可移步至:知識整理之HTML篇css
CSS Hack
就是針對不一樣的瀏覽器或不一樣版本瀏覽器寫特定的CSS
樣式達到讓瀏覽器兼容的過程。 CSS Hack
常見的有三種形式:CSS屬性Hack、CSS選擇符Hack以及IE條件註釋Hack。html
color: red; /* 全部瀏覽器識別 */
_color: red; /* 僅IE6 瀏覽器識別 */
-color: red; /* 僅IE6 瀏覽器識別 */
*color: red; /* 僅IE六、IE7 瀏覽器識別 */
+color: red; /* 僅IE六、IE7 瀏覽器識別 */
*+color: red; /* 僅IE六、IE7 瀏覽器識別 */
#color: red; /* 僅IE六、IE7 瀏覽器識別 */
color: red\0; /* 僅IE8-IE10 瀏覽器識別 */
color: red\9\0; /* 僅IE九、IE10 瀏覽器識別 */
color: red!important; /* 僅IE6 瀏覽器不支持 */
複製代碼
*html #demo { color: red; } /* 僅IE6 瀏覽器識別 */
*+html #demo { color: red; } /* 僅IE六、IE7 瀏覽器識別 */
body:nth-of-type(1) #demo { color: red; } /* IE9+、FF3.5+、Chrome、Safari、Opera 能夠識別 */
head:first-child+body #demo { color: red; } /* IE7+、FF、Chrome、Safari、Opera 能夠識別 */
:root #demo { color: red9; } /* 僅IE9 識別 */
複製代碼
<!--[if IE]>此處內容只有IE可見<![endif]-->
<!--[if IE6]>此處內容只有IE6.0可見<![endif]-->
<!--[if !IE 7]>此處內容只有IE7不能識別,其餘版本都能識別,固然要在IE5以上。<![endif]-->
<!--[if gt IE 6]> IE6以上版本可識別,IE6沒法識別 <![endif]-->
<!--[if gte IE 7]> IE7以及IE7以上版本可識別 <![endif]-->
<!--[if lt IE 7]> 低於IE7的版本才能識別,IE7沒法識別。 <![endif]-->
<!--[if lte IE 7]> IE7以及IE7如下版本可識別<![endif]-->
<!--[if !IE]>此處內容只有非IE可見<![endif]-->
複製代碼
padding
和margin
不一樣問題症狀:經常使用標籤,不加樣式控制的狀況下,各自的margin
、padding
差別較大。 解決方案:css3
* {
margin: 0;
padding: 0;
}
```
備註:這個是最多見的也是最易解決的一個瀏覽器兼容性問題,幾乎全部的CSS文件開頭都會用通配符*來設置各個標籤的`margin`、`padding`是0。
### 塊屬性標籤float後,又有橫行的margin狀況下,在IE6顯示margin比設置的大
問題症狀:常見症狀是IE6中後面的一塊被頂到下一行。
解決方案:在float的標籤樣式中設置
````css
#demo { display: inline }
複製代碼
問題症狀:IE六、7和遨遊裏這個標籤的高度不受控制,超出本身設置的高度。 解決方案:給超出高度的標籤設置git
#demo { overflow: hidden; }
/* 或者 */
#demo { line-height: 8px; } /* 假設標籤高度爲9px */
複製代碼
問題症狀:IE6裏的間距比超過設置的間距 解決方案:github
#demo {
display: block;
display: inline;
display: table;
}
複製代碼
備註:行內屬性標籤,爲了設置寬高,咱們須要設置display:block;
(除了input標籤比較特殊)。在用float佈局
並有橫向的margin
後,在IE6下,他就具備了塊屬性float後的橫向margin的bug
。不過由於它自己就是行內屬性標籤,因此咱們再加上display:inline
的話,它的高寬就不可設了。這時候咱們還須要在display:inline
後面加入display:talbe
。web
問題症狀:幾個img標籤放在一塊兒的時候,有些瀏覽器會有默認的間距,加了問題一中提到的通配符也不起做用
。 解決方案:express
img { float: left; }
複製代碼
備註:由於img
標籤是行內屬性標籤,因此只要不超出容器寬度,img
標籤都會排在一行裏,可是部分瀏覽器的img
標籤之間會有個間距。去掉這個間距使用float是正道。segmentfault
解決方案:api
#demo {
opacity: 0.5;
filter: alpha(opacity=50);
filter: progid:DXImageTransform.Microsoft.Alpha(style = 0, opacity = 50);
-moz-opacity: 0.5;
-khtml-opacity: 0.5;
}
複製代碼
類型: 基礎選擇器、組合選擇器、熟悉選擇器、僞類、僞元素瀏覽器
基礎選擇器包含:通用選擇器、元素選擇器、類選擇器、id選擇器
組合選擇器包含:多元素選擇器、後代選擇器、子元素選擇器、毗鄰選擇器、相鄰選擇器
:
開頭,冒號後面是僞類的名稱和包含在圓括號中的可選參數。a
連接的:link
、:actived
等,這些信息不存在DOM樹結構中,只能經過css選擇器來獲取。:nth-child(odd)
實現選擇偶數行設置背景色,若是不是用僞類,而是用JavaScript
來設置就複雜得多。經過僞類實現了常規CSS
沒法實現的邏輯。::
開頭,而後是僞元素的名稱。::
是爲了和僞類(CSS2中並無區別)作區分。考慮兼容性CSS2
中已存在的僞元素仍可使用單引號:
語法。可是CSS3
中新增的僞元素必須以使用::
。選擇器的優先級分爲兩種:1. 選擇器在同一級別時。2. 選擇器在不一樣級別時。
!important
,會覆蓋任意位置定義的樣式。做爲style
屬性寫在元素內的樣式。id
選擇器class
選擇器同一級別的選擇器,後聲明的會覆蓋以前聲明的。
style=''
。權值爲1000。id
選擇器,如#content
,權值爲0100。.content
、:link
、[type=text]
等,權值爲0010。!important
(權重),它沒有特殊性值,但它的優先級是最高的,爲了方便記憶,能夠認爲它的特殊性值爲1,0,0,0,0。font
、font-family
、font-weight
、font-size
、font-style
、font-variant
、font-stretch
、font-size-adjust
lowercase
(僅小寫字母)、uppercase
(僅大寫字母)、capitalize
(文本中的每一個單詞以大寫字母開頭)ltr
(默認,從左到右)、rtl
(從右到左)CSS盒子模型:由四個屬性組成的外邊距(margin)、內邊距(padding)、邊界(border)、內容區(width和height)
/* 標準盒模型 */
box-sizing: content-box;
/* IE盒模型 */
box-sizing: border-box;
/* 繼承父元素 */
box-sizing: inherit;
複製代碼
屬性值以下: position
: static | relative | absoulte | fixed | sticky | inherit
默認值。沒有定位,遵循常規流(忽略 top
, bottom
, left
, right
或者 z-index
聲明)。
相對定位,相對於其正常位置進行定位,遵循常規流。而且設置top
,right
,bottom
,left
這4個屬性進行偏移時,不會影響常規流中的任何元素。
絕對定位,脫離常規流。此時偏移屬性參照的是離自身最近的定位祖先元素,若是沒有定位的祖先元素,則一直回溯到body元素。 盒子的偏移位置不影響常規流中的任何元素,其margin不與其餘任何margin摺疊(觸發BFC)。
固定定位,脫離常規流。與absolute一致,但偏移定位是以窗口爲參考。當出現滾動條時,對象不會隨着滾動。
粘性定位,該定位基於用戶滾動的位置。 在常態時,它的行爲就像 position:relative
,遵循常規流。 當頁面滾動超出目標區域時,它的表現就像 position:fixed
,它會固定在目標位置, 脫離常規流。
從父元素繼承 position 屬性的值。
display: none | block | inline-block | table | inline-table | flex | inline-flex | grid | inline-grid | inherit
display: table-captoion | table-cell | table-row | table-row-group | table-column | table-column-group | table-header-group | table-footer-group
此元素會做爲一個表格標題顯示(相似 )
此元素會做爲一個或多個行的分組來顯示(相似 )
此元素會做爲一個或多個行的分組來顯示(相似 )
此元素會做爲一個表格單元格顯示(相似 和 )
此元素會做爲一個表格行顯示(相似 )
此元素會做爲一個或多個行的分組來顯示(相似 )
此元素會做爲一個單元格列顯示(相似 )
此元素會做爲一個或多個列的分組來顯示(相似 )
display: list-item | run-in
此元素會做爲列表顯示
此元素會根據上下文做爲塊級元素或內聯元素顯示
二者都能讓元素不可見。區別在於:
display: none;
,會讓元素徹底從渲染樹中消失,渲染時不佔據任何空間。visibility: hidden;
,元素仍存在渲染樹中,渲染時仍佔據空間,只是內容不可見。display: none;
是非繼承屬性,子孫節點消失是因爲元素從渲染樹中消失形成,經過改變子孫節點的display屬性沒法改變顯示狀態。visibility: hidden;
是繼承屬性,子孫節點消失是因爲繼承hidden屬性,經過設置visible
屬性可讓子孫節點顯示。display
屬性一般會引發文檔重排。修改visibility
屬性只會形成元素的重繪。display: none;
元素內容,可是會讀取visibibity: hidden;
元素內容。visibility: hidden;
該屬性隱藏元素,單元素在文檔流中仍佔據空間。display: none;
元素不可見,而且在文檔流中不佔據空間。opacity: 0;
CSS3屬性,設置0可讓元素透明。filter: blur(0);
CSS3屬性,將一個元素的模糊度設置爲0,從而讓元素消失「」在頁面上。position: absolute;
設置left值負值定位,使元素在可視範圍內。transform: scale(0);
將元素設置無限縮小,元素不可見,元素所在位置被保留。height: 0;
將元素高度設置爲0,並消除邊框。<div hidden="hidden"></div>
HTML5屬性,效果與display: hidden;同樣。但這個屬性用於記錄一個元素的狀態。BFC
(Block Formatting Context)即「塊級格式化上下文」。常規流(也稱標準流、普通流)是一個文檔在被顯示時最多見的佈局形態。一個框在常規流中必須屬於一個格式化上下文,你能夠把BFC想象成一個大箱子,箱子外邊的元素將不與箱子內的元素產生做用。BFC
是W3C CSS 2.1 規範中的一個概念,它決定了元素如何對其內容進行定位,以及與其餘元素的關係和相互做用。當涉及到可視化佈局的時候,Block Formatting Context提供了一個環境,HTML元素在這個環境中按照必定規則進行佈局。一個環境中的元素不會影響到其它環境中的佈局。好比浮動元素會造成BFC,浮動元素內部子元素的主要受該浮動元素影響,兩個浮動元素之間是互不影響的。也能夠說BFC就是一個做用範圍。FOUC:Flash of Unstyled Content,簡稱爲FOUC
,文檔樣式短暫失效(又稱瀏覽器樣式閃爍)。 若是使用import
方法對CSS
進行導入,會致使某些頁面在Windows 下的Internet Explorer出現一些奇怪的現象:以無樣式顯示頁面內容的瞬間閃爍。這種現象稱之爲文檔樣式短暫失效(Flash of Unstyled Content)
,簡稱爲FOUC
。
import
方法導入樣式表html
加載,當加載到此樣式表時,頁面將中止以前的渲染。此樣式表被下載和解析後,將從新渲染頁面,也就出現了短暫的花屏現象。link
標籤將樣式表放在文檔head
中外邊距重疊: margin-collapse
垂直相鄰的兩個盒子(多是兄弟關係也多是祖先關係)的外邊距能夠結合成一個單獨的外邊距。 這種合併外邊距的方式被稱爲摺疊,結合而成的外邊距稱爲摺疊外邊距。更詳細介紹可移步至:CSS 框模型( Box module )
<div style="width:50px; height:50px; margin-bottom:50px; background-color: red;">A</div> <!-- 重點: margin-bottom:50px; -->
<div style="width:50px; height:50px; margin-top:100px; background-color: green;">B</div> <!-- 重點: margin-top:100px; -->
複製代碼
在 margin
都是正數的狀況下,取其中 margin 較大的值爲最終 margin 值 示意圖:
<div style="width:50px; height:50px; margin-bottom:-75px; background-color: red;">A</div> <!-- 重點: margin-bottom:-75px; -->
<div style="width:50px; height:50px; margin-top:-50px; background-color: green;">B</div> <!-- 重點: margin-top:-50px; -->
複製代碼
在 margin
都是負值的時候,取的是其中絕對值較大的,而後從零開始,負向位移 示意圖:
<div style="width:50px; height:50px; margin-bottom:-50px; background-color: red;">A</div> <!-- 重點: margin-bottom:-50px; -->
<div style="width:50px; height:50px; margin-top:100px; background-color: green;">B</div> <!-- 重點: margin-top:100px; -->
複製代碼
在margin
中有正值有負值的時候,要從全部負值中選出絕對值最大的,全部正值中選擇絕對值最大的,兩者相加。此例的結果即爲: 100px + (-50)px =50px; 示意圖:
<div style="margin:50px 0; background-color:red; width:50px; height:50px;">
<div style="margin:-60px 0;">
<div style="margin:150px 0;">A</div>
</div>
</div>
<div style="margin:-100px 0; background-color:green; width:50px; height:50px;">
<div style="margin:-120px 0;">
<div style="margin:200px 0;">B</div>
</div>
</div>
複製代碼
請注意,多個 margin 相鄰摺疊成一個 margin,因此計算的時候,應該取全部相關的值一塊兒計算,而不能分開分步來算。 以上例子中,A 和 B 之間的 margin 摺疊產生的 margin,是6個相鄰 margin 摺疊的結果。將其 margin 值分爲兩組:
正值:50px,150px,200px 負值:-60px,-100px,-120px 根據有正有負時的計算規則,正值的最大值爲 200px,負值中絕對值最大的是 -120px,因此,最終摺疊後的 margin 應該是 200 + (-120) = 80px。
另外,要注意,自身的margin-botom
和margin-top
相鄰時也會發生重疊,只有當自身內容爲空,垂直方向上border
,padding
,均爲0時,自身的margin-top
與margin-bottom
纔會相鄰。 示例:
<div style="border:1px solid red; width:100px;">
<div style="margin-top: 100px;margin-bottom: 50px;"></div>
</div>
複製代碼
以上代碼運行後,咱們講獲得的是紅色邊框的正方形,方框的寬高都應該是 100px,高度不該該是 150px。 示意圖:
外邊距的重疊只產生在普通流文檔的垂直外邊距之間,避免塊級元素之間產生雙倍邊距的問題。
inline-block
元素、絕對定位元素的 margin
不會和垂直方向上其餘元素的 margin
摺疊浮動元素的 margin
在垂直方向上也不會發生 margin
摺疊,即便和它相鄰的子元素也不會。
<div style="margin-bottom:50px; width:50px; height:50px; background-color:green;">A</div>
<div style="margin-top:50px; width:100px; height:100px; background-color:green; float:left;">
<div style="margin-top:50px; background-color:gold;">B</div>
</div>
複製代碼
示意圖:
兩個綠色的塊兒之間,相距100px,而若 B 和它的浮動包含塊發生 margin 摺疊的話,金色的條應該位於綠色塊的最上方,顯然,沒有發生摺疊。以 「overflow : hidden
」 的元素爲例:
<div style="margin-top:50px; width:100px; height:100px; background-color:green; overflow:hidden;">
<div style="margin-top:50px; background-color:gold;">B</div>
</div>
複製代碼
若 B 和它的 "overflow:hidden
" 包含塊發生 margin
摺疊的話,金色的條應該位於綠色塊的最上方,不然,沒有發生。 示意圖:
非IE瀏覽器下,容器不設高度且子元素浮動時,容器高度不能被內容撐開。 此時,內容會溢出到容器外面而影響佈局。這種現象被稱爲浮動(溢出)。
若是一個元素要浮動,那麼它的父元素必定要有高度。高度的盒子,才能關住浮動。能夠經過直接給父元素設置height,實際應用中咱們不大可能給全部的盒子加高度,不只麻煩,而且不能適應頁面的快速變化;另一種,父容器的高度能夠經過內容撐開(好比img圖片),實際當中此方法用的比較多。
在最後一個子元素新添加最後一個冗餘元素,而後將其設置clear:both,這樣就能夠清除浮動。這裏強調一點,即在父級元素末尾添加的元素必須是一個塊級元素,不然沒法撐起父級元素高度。
<style> #wrap{ border: 1px solid; } #inner{ float: left; width: 200px; height: 200px; background: pink; } </style>
<div id="wrap">
<div id="inner"></div>
<div style="clear: both;"></div>
</div>
複製代碼
上面那種辦法當然能夠清除浮動,可是咱們不想在頁面中添加這些沒有意義的冗餘元素,此時如何清除浮動嗎? 結合 :after 僞元素和 IEhack ,能夠完美兼容當前主流的各大瀏覽器,這裏的 IEhack 指的是觸發 hasLayout。
<style> #wrap { border: 1px solid; } #inner { float: left; width: 200px; height: 200px; background: pink; } .clearfix { *zoom: 1; } /*ie6 7 不支持僞元素*/ .clearfix:after { content: ''; display: block; clear: both; height: 0; line-height: 0; visibility: hidden; /*容許瀏覽器渲染它,可是不顯示出來*/ } </style>
<div id="wrap" class="clearfix">
<div id="inner"></div>
</div>
複製代碼
這種方案讓父容器造成了BFC(塊級格式上下文),而BFC能夠包含浮動,一般用來解決浮動父元素高度坍塌的問題。
hasLayout
,清除浮動。zoom
屬性是IE瀏覽器
的專有屬性,它能夠設置或檢索對象的縮放比例。解決ie下比較奇葩的bug。譬如外邊距(margin)的重疊,浮動清除,觸發ie的haslayout屬性等。zoom
的值以後,所設置的元素就會就會擴大或者縮小,高度寬度就會從新計算了,這裏一旦改變zoom
值時其實也會發生從新渲染,運用這個原理,也就解決了ie下子元素浮動時候父元素不隨着自動擴大的問題。zoom
屬是IE瀏覽器
的專有屬性,火狐和老版本的webkit核心的瀏覽器都不支持這個屬性。然而,zoom
如今已經被逐步標準化,出如今CSS 3.0
規範草案中。scale
進行縮放。@import
是CSS
提供的語法規則,只有導入CSS的做用。link
是HTML提供的標籤,不只能夠加載 CSS
文件,還能夠定義 RSS
、rel
鏈接屬性等。
@import
是CSS2.1的語法,只有在IE5+
才能識別;link
標籤做爲HTML
元素,不存在兼容性問題。
加載頁面時,link
標籤引入的CSS
能被並行加載;@import
引入的CSS
將在頁面加載完畢後才加載。
能夠經過JS操做DOM,插入link
標籤來改變樣式;而沒法經過JS添加@import
方式來引入樣式。
link
引入的樣式權重大於@import
引入的樣式。
px
,是相對長度單位,它是相對於顯示器屏幕分辨率而言的。 優缺點:比較穩定和精確,但在瀏覽器中放大或縮放瀏覽頁面時會出現頁面混亂的狀況。
em
,是相對長度單位,em
是相對於父元素來設計字體大小的。若是當前對行內文本的字體尺寸未被人爲設置,則相對於瀏覽器的默認字體尺寸。 優缺點:em
的值並非固定的,它會繼承父級元素的字體大小。
px
和em
的之間的相互轉換:任意瀏覽器的默認字體高都是16px。全部未經調整的瀏覽器都符合:1em=16px。那麼,12px=0.75em,10px=0.625em。 爲了使用方便,用em
時,咱們一般在CSS
中的body
選擇器中聲明font-size=62.5%(使em值變爲:16px*62.5%=10px),以後,你只須要將你使用的px值除以10,便可獲得em值,如:12px=1.2em,10px=1em。
rem是CSS3
新增的一個相對單位,rem
是相對單位,是相對HTML
根元素。 這個單位可謂集相對大小和絕對大小的優勢於一身,經過它既能夠作到只修改根元素就成比例地調整全部字體大小,又能夠避免字體大小逐層複合的連鎖反應。 目前,除了IE8
及更早版本外,全部瀏覽器均已支持rem
。
二者都是經過重置樣式,保持瀏覽器樣式的一致性。區別在於:
css reset
經過爲幾乎全部的元素施加默認樣式,強行使得元素有相同的視覺效果。相比之下,normailze.css
保持了許多磨人的瀏覽器樣式。這就意味着你不用再爲全部公共的排版元素從新設置樣式。當一個元素在不一樣的瀏覽器中有不一樣的默認值時,normalize.css
會力求讓這些樣式保持一致並儘量與現代標準符合。
它修復了常見的桌面端與移動端瀏覽器的bug。這每每超出了reset所能作到的範圍。關於這一點,normalize.css
修復的問題包含了HTML5
元素的顯示設置、預格式化文字的font-size
問題、在IE9
中SVG
的溢出、許多出如今各瀏覽器和操做系統中的與表單相關的bug。
使用reset css
最讓人困擾的地方莫過於在瀏覽器調試工具中大段大段的繼承鏈,在normalize.css
中就不會有這樣的問題,由於在咱們的準則中對多選擇器的使用是很是謹慎的,咱們僅會有目的地對目標元素設置樣式。
這個項目已經被拆分爲多個相關卻又獨立的部分,這使得你可以很容易也很清楚地知道哪些元素被設置了特定的值。所以這能讓你本身選擇性地移除掉某些永遠不會用到的部分(好比表單的通常化)。
normalize.css
的代碼基於詳細而全面的跨瀏覽器研究與測試。這個文件中擁有詳細的代碼說明並在Github Wiki中有進一步的說明。這意味着你能夠找到每一行代碼具體完成了什麼工做、爲何要寫這句代碼、瀏覽器之間的差別,而且你能夠更容易的進行本身的測試。
將多個小圖標he拼接到一張圖片裏,經過background-position
和元素尺寸調節須要顯示的背景圖案。
CSS繼承
,減小代碼體積@import
引入CSS
,建議使用link
, 由於後者在頁面加載時一塊兒加載,前者是等待頁面加載完成以後再進行加載CSS sprite
,減小圖片體積的同時,減小HTTP
請求CSS選擇符
是從右到左進行匹配的。當使用後代選擇器的時候,瀏覽器會遍歷全部子元素來肯定是不是指定的元素等等
css reset
,能夠選擇normolize.cssCSS express
0
時,不加單位(優化)0.**
時,能夠省略小數點前的0
(優化)css
文件放在頁面最上面css
代碼定義到獨立css
文件中這部分涉及內容較多,請移步至瀏覽器的迴流和重繪及其優化方式