CSS簡介概述-CSS權威指南
第一章:CSS和文件
1.1 Web樣式簡介
-
1994年,正值Web開始廣泛流行開來,CSS的第一個提案發布了。那時,瀏覽器為使用者提供了各種樣式的定製功能,而文件編寫人員卻做不到這一點。文件編寫人員只能把內容標記成一個個段落、一級級標題、一塊塊預排格式文字,或者一些其他型別的元素。如果使用者願意,可以把一級標題設為粉紅色的小字,而把六級標題設為紅色的大字
-
CSS就是在這樣的背景下誕生的。它的目的就是提供一個簡單的宣告式樣式語言,而且具有一定的靈活性,能為文件編寫人員和使用者提供等同的樣式化功能。文件編寫人員和使用者都有話語權,不過最終的決策權在使用者手裡
-
草案制定的速度很快,到1996年年末,CSS1完成了
-
CSS2規範於1998年年初定案。隨後,CSS工作組立即投身CSS3的制定工作,以及CSS2的修訂工作(制定CSS2.1)
-
與以往不同的是,CSS3由多個(理論上)獨立的模組構成,而不是單獨的一個臃腫的規範。CSS3分成了多個模組的根本原因是各模組可以獨立演進。尤其是重要的(或受眾廣的)模組可以按照W3C的規劃向前推進,而不必受其他模組拖累
-
截至2012年年初,有三個CSS3模組(CSS Color Level3、CSS Selectors Level3、CSS Namespaces)變成了全力推薦狀態,而有七個模組處於候選狀態,還有七個模組處在不同的草案狀態。如果採用以前的機制,要等其他部分完成才能在一份完成的規範中釋出顏色、選擇符和名稱空間的新條款。得益於模組化,我們無需再等待
-
但是,這樣也有缺點,即“CSS規範”不能涵蓋一切
1.2 元素
元素(element)是文件結構的根基。文件中的每個元素都對文件的表現起一定作用
置換元素:指用來置換元素內容的部分不由文件內容直接表示。最常見的置換元素要數 img
,它的內容由文件之外的影象檔案替換
非置換元素:即元素的內容由使用者代理(通常是瀏覽器)在元素自身生成的框中顯示
塊級元素:預設生成一個填滿父級元素內容區域的框,旁邊不能有其他元素。也就是說,塊級元素在元素框的前後都“斷行”
行內元素:在一行文字內生成元素框,不打斷所在的行。行內元素不在自身所在的元素框的前後“斷行”,因此可以出現在另一個元素的內容中,且不影響所在的元素
1.3 把CSS應用到HTML上
1️⃣ link標籤
<style rel="stylesheet" type="text/css" href="sheet.css" media="all">
link標籤位置:link標籤必須放在head元素內,不能放在其他元素中。Web瀏覽器遇到link標籤時,會查詢並載入指定的樣式表,使用樣式表中的樣式渲染HTML文件
link標籤屬性:
- rel屬性:rel是“relation”關係的簡稱。這裡指定的關係是stylesheet
- type屬性:type屬性值始終為"text/css",說明通過link標籤載入的資料型別。這樣Web瀏覽器才知道載入的樣式表是CSS樣式表,然後確定如何處理載入的資料
- href屬性:它的值是樣式表的URL,可以是絕對地址,也可以是相對地址,具體由需求而定。另外,副檔名不是必須的,但是如果檔名不以“.css”結尾,即使在link元素中把type屬性值設為“text/css”,有些瀏覽器也不會將其識別為包含樣式表的檔案
- media屬性:它的值是一個或多個媒體描述符,指明媒體的型別和具有的功能,多個媒體描述符以逗號分開
注意:
- 外部樣式表不能包含任何文件標記,只能有CSS規則和CSS註釋
- 如果外部樣式表中有標記,可能導致部分或全部樣式失效
補充——樣式表分類:
候選樣式表:把rel屬性的值設為“alternate stylesheet” ;僅當用戶自己選擇,文件才會使用候選樣式表渲染
首選樣式表:為rel屬性的“stylesheet”的link元素設定title標題屬性;顯示文件時預設使用,而選擇候選樣式表之後,首選樣式表就不使用了
永久樣式表:把rel屬性的值設為“stylesheet”;始終用於顯示文件,這通常正是文件編寫人員想要的行為
2️⃣ style元素
<style type="text/css">
……
</style>
- style元素可以直接包含應用到文件上的樣式,也可以通過@import指令引入外部樣式表
- 開始和結束style標籤之間的樣式稱為文件樣式表或嵌入式樣式表
- style元素應該始終設定type屬性,對CSS文件來說,正確的值是“text/css”
- style元素也有media屬性
3️⃣ @import指令
@import url(sheet.css) all;
- Web瀏覽器遇到@import指令時會載入外部樣式表,使用其中的樣式渲染HTML文件
- @import指令在style元素內部,而且必須放在其他CSS規則前面,否則不會起作用
- 一個文件中可以有多個@import語句
- @import指令也可以顯示匯入的樣式表應用於何種媒體,方法實在樣式表的URL後面提供媒體描述符
4️⃣ HTTP連結
為文件關聯CSS還有一種鮮為人知的方式:使用HTTP首部
在Apache中,若想使用這種方式,可以在 .htaccess 檔案中引用CSS檔案。這樣設定之後,支援這種方式的瀏覽器[1]在載入受此.htaccess檔案管理的文件時便會使用指定的樣式表,就像通過link元素連結的樣式表一樣。
Header add Link "</ul/testing.css>;rel=stylesheet;type=text/css"
此外,還可以在伺服器的 httpd.conf 檔案中新增等效的規則,這樣可以更高效。在支援這樣方式的瀏覽器中[1:1],這樣做的效果與前面一樣,唯一的區別就是設定所在的檔案不同。
<Directory /path/to /public/html/directory>
Header add Link "</ul/testing.css>;rel=stylesheet;type=text/css"
</Directory>
5️⃣ 行內樣式
-
如果只想為單個元素提供少量樣式,不值得動用嵌入式樣式表或外部樣式表,可以利用HTML元素的style屬性設定行內樣式
-
除了body元素之外的標籤,所有HTML標籤都能設定style屬性
-
style屬性的值只能是一系列規則宣告,而不能包含整個樣式表。因此,不能在style屬性中使用@import指令,也不能有完整的規則
-
通常不建議使用style屬性
1.4 樣式表中的內容
1️⃣ 標記
樣式表中不能有標記,不過HTML註解標記除外(歷史原因)
2️⃣ 規則的結構
- 一個樣式表由一系列規則構成
- 一個規則由選擇符和宣告塊構成
- 一個宣告塊由一個或多個宣告組成
- 一個宣告包含一個屬性和對應的值
宣告的格式是固定的:
- 先是屬性,然後是冒號,後面再跟上值和分號
- 冒號和分號後面可以有零個或多個空白
- 值幾乎都是一個關鍵字或以空格分隔的多個關鍵字
- 如果宣告中的屬性或值有誤,整個規則都將被忽略
- 屬性的值可以是多個關鍵字,關鍵字之間通常以空格分隔,有時則使用斜線(/)或逗號
3️⃣ 廠商字首
廠商字首:瀏覽器廠商通過它標記實驗性或專屬(或二者兼具)的屬性、值或其他內容
字首 | 廠商 |
---|---|
-epub- | 國際數字出版論壇定製的ePub格式 |
-moz- | 基於Mozilla的瀏覽器(如Firefox) |
-ms- | 微軟Internet Explorer |
-o- | 基於Opera的瀏覽器 |
-webkit- | 基於Webkit的瀏覽器(如Safari和Chrome) |
4️⃣ 處理空白
-
CSS對規則之間的空白基本沒有嚴格要求,對規則內部的空白也沒有嚴格要求
-
一般來說,CSS對待空白的方式跟HTML差不多:解析時,連續的空白會合併成一個空白
5️⃣ CSS註釋
/* CSS註釋內容 */
CSS註釋不能巢狀
1.5 媒體查詢
1️⃣ 媒體查詢用法
媒體查詢可以在下述幾個地方使用:
- link元素的media屬性
- style元素的media屬性
- @import宣告的媒體描述符部分
- @media宣告的媒體描述符部分
媒體查詢可以是簡單的媒體型別,也可以是複雜的媒體型別和特性的組合
一個樣式表中可以有任意多個@media塊,而且每一個都有自己的一套媒體描述符;如果願意,可以把所有規則都放在一個@media塊裡
一個媒體描述符包含一個媒體型別和一個或多個媒體特性列表,其中特性描述符要放在圓括號中;如果沒有媒體型別,那就應用到所有媒體上
2️⃣ 簡單的媒體查詢
一個樣式表中可以有任意多個@media塊,而且每一個都有自己的一套媒體描述符;如果願意,可以把所有規則都放在一個@media塊裡
@media all {
h1 { color: maroon; }
body { background: yellow; }
}
3️⃣ 媒體型別
-
媒體查詢最基本的形式就是媒體型別,由CSS2引入
-
媒體型別就是指明不同媒體的標註
媒體型別 | 說明 |
---|---|
all | 用於所有展示媒體 |
為有視力的使用者列印文件時使用,也在預覽列印效果時使用 | |
screen | 在螢幕媒體(如桌面電腦的顯示器)上展示文件時使用 在桌面計算機上執行的所有Web瀏覽器都是螢幕媒體使用者代理 |
projection | 能以幻燈片的形式展示文件 |
4️⃣ 媒體描述符
<link href="print-color.css" type="text/css" media="print and (color),screen and (color-depth:8)" rel="stylesheet">
@import url(print-color.css) print and (color),screen and (color-depth:8);
@media all and (min-resolution: 96dpi) {……}
@media (min-resolution: 96dpi) {……}
-
可以通過一個逗號分隔的列表,列出多個查詢
-
一般情況下,媒體特性描述符的格式類似於CSS中的一對屬性和值。二者之間最大的區別是,特性描述符可以不指定值。因此,任何彩色媒體都符合(color)指定的條件,任何色深為16位的彩色媒體都符合(color:16)指定的條件。其實不指定值時,是在做判斷,比如說(color)的意思是“這個媒體是彩色的嗎?”
多個特性描述符之間使用邏輯關鍵字連結
- and: 連線的兩個或多個媒體特性必須同時滿足條件,整個查詢得到的結果才是真值。例如:(color) and (orientation: landscape) and (min-device-width: 800px)表示三個條件都要滿足:當媒體環境是彩色的、橫向放著、而且裝置的螢幕寬至少為800畫素,才會應用樣式表
- not:對整個查詢取反。假如所有條件都為真,那樣式表不會應用到文件上。例如:not (color) and (orientation: landscape) and (min-device-width: 800px)表示三個條件都滿足時,整個語句得到的結果與之相反。因此,當媒體環境是彩色的、橫向放著,而且裝置的螢幕寬度至少為800畫素,樣式表不會應用到文件上。除此之外的情況下,都將應用樣式表
- only:在不支援媒體查詢的舊瀏覽器中隱藏樣式表。例如:如果想在所有媒體中應用一個樣式表,但是隻在支援媒體查詢的瀏覽器中應用,可以這樣寫:
@import url(new.css) only all;
在支援媒體查詢的瀏覽器中,only關鍵字被忽略,樣式表會應用到文件上。而在不支援媒體查詢的瀏覽器中,媒體型別為only all,而這是無效的,因此不會應用樣式表。注意:only關鍵字只能在媒體查詢的開頭
5️⃣ 媒體特性描述符和值的型別
媒體特性描述符:
此外,還有兩種新增的值:
<ratio>
<resolution>
1.6 特性查詢
-
特性查詢:根據使用者代理是否支援特定的CSS屬性及其值來應用一段樣式
-
特性查詢可以巢狀,其實還可以巢狀在媒體查詢中,而且反過來巢狀也可以
-
與媒體查詢一樣,特性查詢也支援使用邏輯運算子
-
特性查詢中既要寫屬性也要寫值。因為,瀏覽器可能支援某個屬性,但不支援它的全部取值
案例一:假設想在使用者代理支援color屬性時,為元素設定顏色
/* 如果能識別並處理color:black這樣的屬性和值組合,那就應用這段樣式;否則,跳過這段樣式如果使用者代理不支援@supports,整段樣式都會跳過*/@supports (color:black) { body { color: black; } h1 { color: purple; } h2 { color: navy; }}
案例二:巢狀查詢
/* 使用彈性盒佈局編寫針對螢幕和印刷媒體的樣式,可以把媒體查詢塊放在@supports(display:flex)塊裡 */@supports (display: flex) { @media screen { /* 針對螢幕媒體的彈性盒樣式 */ } @media print { /* 針對印刷媒體的彈性盒樣式 */ }}/* 反過來,也可以在實現響應式設計的媒體查詢塊中新增@supports()塊 */@media screen and (max-width: 30em) { @supports (display:flex) { /* 針對小屏的彈性盒樣式 */ }}@media screen and (min-width: 30em) { @supports (display:flex) { /* 針對大屏的彈性盒樣式 */ }}
案例三:假如想在使用者代理同時支援柵格佈局和CSS形狀時應用一段樣式
@supports (display:grid) and (shape-outside:circle()) { /* 柵格和形狀樣式 */}
本文來自部落格園,作者:不二橘子醬,轉載請註明原文連結:https://www.cnblogs.com/feeder/p/15017034.html