如何才能高效的進行CSS編碼?_CSS教程
教程Tag:暫無Tag,歡迎添加,賺取U幣!
在前面的文章中,我們提到了用什么軟件來編寫CSS文件。今天我們來看一些介紹:如何才能高效的進行CSS編碼?
CSS 被吹捧的好處之一就是它能減小頁面大小,由此縮短下載時間,不僅僅是首頁的載入,還包括樣式表被緩存以后,后續(xù)頁面的載入也被加快了的那部分時間。這沒錯,但首頁載入時間的縮短幾乎看不出來,這是因為 CSS 代碼往往過于冗長了。
好吧,現(xiàn)在一切都不同了。學點高效地進行 CSS 編碼的技巧吧,讓你把樣式表馬上裁減到最小為止。自然,你可能看不到什么驚人的改變,但對于大站來說,微小的字節(jié)減少也很重要。
有很多地方可以減少代碼的長度,包括 簡記屬性 (shorthand properties), 多重聲明 (multiple declarations),默認值 (default values), 繼續(xù) (inheritance),和空白 (white space)。
簡記屬性
Zeroing page margins 提到了一組這樣的簡記屬性,但對于此還有更多的。
通常簡記屬性包括:
上述項目是鏈接至 W3C CSS 2 規(guī)范 的相關章節(jié)的。
例如, font 屬性 是用于同時設置 font-style, font-variant, font-weight, font-size, line-height, 和 font-family 的簡記屬性。當然,它們并非全都必須寫在簡記屬性中。一旦在簡記屬性中忽略了其中某個,那些缺失的屬性都將被設置為它們的 初始值,就像 W3C 規(guī)范 中 font property 一節(jié)提到的那樣。若需要控制很多和字體相關的屬性,使用這個簡記屬性就可以省下樣式表中的大量字節(jié)了。
background 和 list-style 屬性也是如此�,F(xiàn)在還剩下關于 CSS 盒 (box) 模型 四邊的那些屬性和一點沒法歸類的雜碎了。
盒側邊的簡記屬性
任何塊級 (block level) 元素 (像 div,表格,列表,段落等) 的四邊都有 邊白 (margin),邊界 (border),和 補白 (padding),都可以分別設置不同的寬度。對于邊界 (border) 來說,還能給每邊分配不同的 border-style 和 border-color 。若要一條條地顯式地指明所有這些屬性,代碼就會變得很冗長。使用簡記規(guī)則的意義正在于此:徹底地減少這樣負擔。
“鐘面”
當需要指定這三類“盒側”屬性之一,而且各側的情況又是一樣的時候,使用簡記屬性最基本的功能就行了:
注重:要讓邊界顯示出來,還必須設置 border-style 屬性,否則單有 border-width 邊界是顯示不出來的。既可以直接通過 border-style 來設置它,也可以通過 border 屬性。
然而很有可能某一側需要一個不同的值,這時 CSS 的“鐘面”特性就上臺了。把此處的盒子想象為一個鐘面,當指針指向 12 點時,表示盒子的正上方,這就是簡記屬性中第一個值的含義;下一個是 3 點,這是盒子的右側;接下來是 6 點,表示盒子的下方;最后呢是 9 點,盒子的左側。
讓我們看看這個例子吧。在頁面中我們需要一個 10px 上邊白,5px 右邊白, 3px 下邊白,無左邊白的盒子。則 margin 簡記屬性應該這么寫:
在屬性的聲明中,幾個值必須也只能用空格來分隔。而且只要那個值不是零,就必須給它指定單位。
為什么零寬度的邊白就不需要指定單位了呢?因為零個任何單位 (px, em, %, 等等) 的值也就等于任意其他單位的值。
改進的鐘面
當某些值重復時,這些“盒側”屬性還能壓榨得更短。前面提到過,若各側都一樣,可以只指定一個,讓它應用到全部。而一旦頂部和底部的樣式是一致的,左側和右側卻是另一種,margin 的代碼可以這么寫:
這行代碼把頂部和底部的邊白設置為 10px,兩側設為 5px。最后一個技巧是這樣的:若頂部和底部的不同,兩側的卻是一樣的,比如上邊白 10px,左右邊白 5px,下邊白 20px,我們可以這么寫:
這些縮寫完全是根據(jù)給出值的數(shù)目和順序決定的�?偨Y起來,一個值 = 所有各側;兩個值 = 上下一種,兩側另一種;三個值 = 上側一種,左右同一種,下側一種;當然還有四個值 = 按照順時針。好了,現(xiàn)在不那么難記住了吧?
邊界 (border) 的一些區(qū)別
同樣的鐘面簡記模型也可以用于 border 簡記屬性 和 padding。 border-width , border-color , border-style , 與 padding 也采用和 margin 一樣的方式工作。然而處理 border 屬性時卻有點不同。 border 屬性是同時給盒子的各側設置 border-width, border-style, 及 border-color 屬性的。
假如所有四側的樣式都一樣,那當然不會有什么問題�?扇f一他們不同呢?我們還得回去用那些老式的 border-top, border-right 們?沒錯,是可以。但幸好我們還有更有效率一點的方法。
考慮我們這個盒子的各個邊界有同樣的 style 和 color,但寬度不同的情況,最有效的方法是,先像往常一樣用 border 簡記法來定義好 border-width, border-style, 和 border-color;然后再設置一次 border-width 屬性,覆蓋上面設置的寬度:
假如所有的邊界屬性 (width、style 和 color) 都各側不同,那上面的方法恐怕就沒什么用了,但通常不會碰到這么怪異的情況。假如變化的屬性僅僅是 border-style 或者 border-color 的話,上述的方法改改就可以像 border-width 的情況那樣用了。
下面我們看看在另一種情形下書寫高效的 CSS 會帶來什么改變。
多重聲明
考慮我們有 6 個采用絕對定位的 div (比如 Dreamweaver 里的層),且它們的其他屬性都一樣,只不過在頁面中的位置不同。因為它們的位置不同,自然應該有不同的 ID 或者是 class,但剩下的屬性還是一樣的。
一個 (所見即所得的) 布局編輯器恐怕給每個 ID 都各自寫一套屬性,包括字體的規(guī)則、文本的規(guī)則、位置的定義等等�?梢槐楸榈亟o這些 div 重復完全一樣的規(guī)則未免笨了點,不是么?那這樣就可以把這些規(guī)則減到最短了:
列出所有類似的這些 div 的 ID,用 , 和一個空格分隔,下面的規(guī)則塊會被應用到所有這些 ID 上。顯然這樣的規(guī)則假如給每個 ID 都重復一遍,代碼就膨脹得多了。這恐怕是最常用也最有效的縮短樣式表方法了。
注重:注重最后一個 ID 選擇符 并沒有 跟著一個逗號。(若多了逗號) 有些瀏覽器中可能還能看到那些 div,另一些就有可能把這樣的樣式表視為錯誤而不顯示任何一個 div 了。
默認值
許多 CSS 屬性都有它們的默認值,假如這個屬性沒被定義取代,它們就將應用于 HTML 元素上。比如說每個補白屬性中, padding-top , padding-right , padding-bottom , 和 padding-left 的初始值都是 0 。因此假如某個元素不需要任何的補白,自然就可以不設置補白的那些屬性了。
注重: 那些簡記屬性——比如我們先前討論過的—— 里面,或者其本身都沒有什么默認的值。究竟簡記屬性其實只是獨立屬性的一種重現(xiàn)而已,所以假如硬說它們有默認值的話,采用的也是獨立屬性的那些默認值。盡管 CSS 規(guī)范的 Property Index 一節(jié)中規(guī)定的許多默認值都是 none 或 0 ,瀏覽器們卻往往給不同的屬性設置一些不同的默認值。
例:Opera 瀏覽器給 body 元素設置了 8px 的補白。h1-h6 標題和段落,默認都有非零的邊白。列表和列表子項中用到的默認邊白和補白,每個瀏覽器都有所不同。
繼續(xù)
另一個避免寫出冗余代碼的方法是,了解哪些屬于父元素的屬性會由子元素繼續(xù)下來。會被繼續(xù)的屬性只有很少一些,而且其中大部分是不常用的,比如 voice-family 。所以列個能繼續(xù)的常用屬性的表,其實是很短的,下面就是按字母順序排出的:
在某些老式瀏覽器中,繼續(xù)功能可能有些問題,然而大部分現(xiàn)代瀏覽器在這方面都處理得很正確。記住上面這個列表,可以讓你少寫點多余的代碼。當然了,假如你想看看完整的列表,還是參考 CSS 2 Property Index。
空白
并非指的是 CSS 的 white-space 屬性,這個屬性早有確定的值了。我們說的是樣式表本身含有的那些空白�?瞻壮S糜趽Q行字符,和在一行里面用來改進可讀性的空格。盡管把它們都刪除可能會剩下個把字節(jié),但好處究竟有限。
要害是,假如把它們都刪除了,CSS 文件就會變得非常難讀,更難修改。要是你真的打算這么做,不妨創(chuàng)建一個主 CSS 文件,再根據(jù)它生成一個刪除了所有空白的副本,修改的時候只修改主文件,根據(jù)主文件重新生成一次副本就行了。
請注重,CSS 編碼中需要一些空白,刪除那些必要的會導致你未曾預料的問題。假如 W3C 規(guī)范中用了 "space separated" 這樣的語句,那么空格就不可省略。常見的像簡記屬性中分隔值的那些空格,還有 下降合并符 (descendant combinator),或者稱為下降選擇符,就是一個空格。所以說不到非用不可的時候,刪除空白這樣的方法還是少用。
最后
你現(xiàn)在學會了好幾種讓你的樣式表更高效的方法,益處是在這些技巧下,不僅下載時間被減少了,而且清楚、易于理解、更改的代碼隨之而來。就算你用排版工具來編輯樣式表,也可以在最后用這些方法將其改定為高效的樣子。
CSS 被吹捧的好處之一就是它能減小頁面大小,由此縮短下載時間,不僅僅是首頁的載入,還包括樣式表被緩存以后,后續(xù)頁面的載入也被加快了的那部分時間。這沒錯,但首頁載入時間的縮短幾乎看不出來,這是因為 CSS 代碼往往過于冗長了。
好吧,現(xiàn)在一切都不同了。學點高效地進行 CSS 編碼的技巧吧,讓你把樣式表馬上裁減到最小為止。自然,你可能看不到什么驚人的改變,但對于大站來說,微小的字節(jié)減少也很重要。
有很多地方可以減少代碼的長度,包括 簡記屬性 (shorthand properties), 多重聲明 (multiple declarations),默認值 (default values), 繼續(xù) (inheritance),和空白 (white space)。
簡記屬性
Zeroing page margins 提到了一組這樣的簡記屬性,但對于此還有更多的。
通常簡記屬性包括:
示例代碼 [www.hl5o.cn]
font (控制 "font-size", "font-weight", "line-height", 等等) background (控制元素的背景,放置位置,重復次數(shù),等等)
list-style (設置列表元素前邊那個“原點”的屬性)
margin (定義 box 各側的邊緣空白 (margin) 寬度)
border (定義 box 邊界 (border) 的屬性 —— 有很多和邊界有關的簡記屬性) padding (定義 box 各側的補白 (padding) 寬度)
list-style (設置列表元素前邊那個“原點”的屬性)
margin (定義 box 各側的邊緣空白 (margin) 寬度)
border (定義 box 邊界 (border) 的屬性 —— 有很多和邊界有關的簡記屬性) padding (定義 box 各側的補白 (padding) 寬度)
上述項目是鏈接至 W3C CSS 2 規(guī)范 的相關章節(jié)的。
例如, font 屬性 是用于同時設置 font-style, font-variant, font-weight, font-size, line-height, 和 font-family 的簡記屬性。當然,它們并非全都必須寫在簡記屬性中。一旦在簡記屬性中忽略了其中某個,那些缺失的屬性都將被設置為它們的 初始值,就像 W3C 規(guī)范 中 font property 一節(jié)提到的那樣。若需要控制很多和字體相關的屬性,使用這個簡記屬性就可以省下樣式表中的大量字節(jié)了。
background 和 list-style 屬性也是如此�,F(xiàn)在還剩下關于 CSS 盒 (box) 模型 四邊的那些屬性和一點沒法歸類的雜碎了。
盒側邊的簡記屬性
任何塊級 (block level) 元素 (像 div,表格,列表,段落等) 的四邊都有 邊白 (margin),邊界 (border),和 補白 (padding),都可以分別設置不同的寬度。對于邊界 (border) 來說,還能給每邊分配不同的 border-style 和 border-color 。若要一條條地顯式地指明所有這些屬性,代碼就會變得很冗長。使用簡記規(guī)則的意義正在于此:徹底地減少這樣負擔。
“鐘面”
當需要指定這三類“盒側”屬性之一,而且各側的情況又是一樣的時候,使用簡記屬性最基本的功能就行了:
示例代碼 [www.hl5o.cn]
margin: 5px;border-width: 5px;padding: 5px;
注重:要讓邊界顯示出來,還必須設置 border-style 屬性,否則單有 border-width 邊界是顯示不出來的。既可以直接通過 border-style 來設置它,也可以通過 border 屬性。
然而很有可能某一側需要一個不同的值,這時 CSS 的“鐘面”特性就上臺了。把此處的盒子想象為一個鐘面,當指針指向 12 點時,表示盒子的正上方,這就是簡記屬性中第一個值的含義;下一個是 3 點,這是盒子的右側;接下來是 6 點,表示盒子的下方;最后呢是 9 點,盒子的左側。
讓我們看看這個例子吧。在頁面中我們需要一個 10px 上邊白,5px 右邊白, 3px 下邊白,無左邊白的盒子。則 margin 簡記屬性應該這么寫:
示例代碼 [www.hl5o.cn]
margin: 10px 5px 3px 0;
在屬性的聲明中,幾個值必須也只能用空格來分隔。而且只要那個值不是零,就必須給它指定單位。
為什么零寬度的邊白就不需要指定單位了呢?因為零個任何單位 (px, em, %, 等等) 的值也就等于任意其他單位的值。
改進的鐘面
當某些值重復時,這些“盒側”屬性還能壓榨得更短。前面提到過,若各側都一樣,可以只指定一個,讓它應用到全部。而一旦頂部和底部的樣式是一致的,左側和右側卻是另一種,margin 的代碼可以這么寫:
示例代碼 [www.hl5o.cn]
margin: 10px 5px;
這行代碼把頂部和底部的邊白設置為 10px,兩側設為 5px。最后一個技巧是這樣的:若頂部和底部的不同,兩側的卻是一樣的,比如上邊白 10px,左右邊白 5px,下邊白 20px,我們可以這么寫:
示例代碼 [www.hl5o.cn]
margin: 10px 5px 20px;
這些縮寫完全是根據(jù)給出值的數(shù)目和順序決定的�?偨Y起來,一個值 = 所有各側;兩個值 = 上下一種,兩側另一種;三個值 = 上側一種,左右同一種,下側一種;當然還有四個值 = 按照順時針。好了,現(xiàn)在不那么難記住了吧?
邊界 (border) 的一些區(qū)別
同樣的鐘面簡記模型也可以用于 border 簡記屬性 和 padding。 border-width , border-color , border-style , 與 padding 也采用和 margin 一樣的方式工作。然而處理 border 屬性時卻有點不同。 border 屬性是同時給盒子的各側設置 border-width, border-style, 及 border-color 屬性的。
假如所有四側的樣式都一樣,那當然不會有什么問題�?扇f一他們不同呢?我們還得回去用那些老式的 border-top, border-right 們?沒錯,是可以。但幸好我們還有更有效率一點的方法。
考慮我們這個盒子的各個邊界有同樣的 style 和 color,但寬度不同的情況,最有效的方法是,先像往常一樣用 border 簡記法來定義好 border-width, border-style, 和 border-color;然后再設置一次 border-width 屬性,覆蓋上面設置的寬度:
示例代碼 [www.hl5o.cn]
border: 10px solid red;
border-width: 10px 5px 3px 0;
border-width: 10px 5px 3px 0;
假如所有的邊界屬性 (width、style 和 color) 都各側不同,那上面的方法恐怕就沒什么用了,但通常不會碰到這么怪異的情況。假如變化的屬性僅僅是 border-style 或者 border-color 的話,上述的方法改改就可以像 border-width 的情況那樣用了。
下面我們看看在另一種情形下書寫高效的 CSS 會帶來什么改變。
多重聲明
考慮我們有 6 個采用絕對定位的 div (比如 Dreamweaver 里的層),且它們的其他屬性都一樣,只不過在頁面中的位置不同。因為它們的位置不同,自然應該有不同的 ID 或者是 class,但剩下的屬性還是一樣的。
一個 (所見即所得的) 布局編輯器恐怕給每個 ID 都各自寫一套屬性,包括字體的規(guī)則、文本的規(guī)則、位置的定義等等�?梢槐楸榈亟o這些 div 重復完全一樣的規(guī)則未免笨了點,不是么?那這樣就可以把這些規(guī)則減到最短了:
示例代碼 [www.hl5o.cn]
#first {left: 0;}
#second {left: 100px;}
#third {left: 200px;}
#fourth {left: 300px;}
#fifth {left: 400px;}
#sixth {left: 500px;}
#first, #second, #third, #fourth, #fifth, #sixth {
position: absolute;
top: 0;
width: 75px;
font-size: .9em;
font-weight: bold;
text-align: center;
line-height: 1.4em;
background-color: silver;
color: navy;
padding: 5px;
border: 1px solid navy;
}
#second {left: 100px;}
#third {left: 200px;}
#fourth {left: 300px;}
#fifth {left: 400px;}
#sixth {left: 500px;}
#first, #second, #third, #fourth, #fifth, #sixth {
position: absolute;
top: 0;
width: 75px;
font-size: .9em;
font-weight: bold;
text-align: center;
line-height: 1.4em;
background-color: silver;
color: navy;
padding: 5px;
border: 1px solid navy;
}
列出所有類似的這些 div 的 ID,用 , 和一個空格分隔,下面的規(guī)則塊會被應用到所有這些 ID 上。顯然這樣的規(guī)則假如給每個 ID 都重復一遍,代碼就膨脹得多了。這恐怕是最常用也最有效的縮短樣式表方法了。
注重:注重最后一個 ID 選擇符 并沒有 跟著一個逗號。(若多了逗號) 有些瀏覽器中可能還能看到那些 div,另一些就有可能把這樣的樣式表視為錯誤而不顯示任何一個 div 了。
默認值
許多 CSS 屬性都有它們的默認值,假如這個屬性沒被定義取代,它們就將應用于 HTML 元素上。比如說每個補白屬性中, padding-top , padding-right , padding-bottom , 和 padding-left 的初始值都是 0 。因此假如某個元素不需要任何的補白,自然就可以不設置補白的那些屬性了。
注重: 那些簡記屬性——比如我們先前討論過的—— 里面,或者其本身都沒有什么默認的值。究竟簡記屬性其實只是獨立屬性的一種重現(xiàn)而已,所以假如硬說它們有默認值的話,采用的也是獨立屬性的那些默認值。盡管 CSS 規(guī)范的 Property Index 一節(jié)中規(guī)定的許多默認值都是 none 或 0 ,瀏覽器們卻往往給不同的屬性設置一些不同的默認值。
例:Opera 瀏覽器給 body 元素設置了 8px 的補白。h1-h6 標題和段落,默認都有非零的邊白。列表和列表子項中用到的默認邊白和補白,每個瀏覽器都有所不同。
繼續(xù)
另一個避免寫出冗余代碼的方法是,了解哪些屬于父元素的屬性會由子元素繼續(xù)下來。會被繼續(xù)的屬性只有很少一些,而且其中大部分是不常用的,比如 voice-family 。所以列個能繼續(xù)的常用屬性的表,其實是很短的,下面就是按字母順序排出的:
示例代碼 [www.hl5o.cn]
color
font (及其相關屬性)
letter-spacing
line-height
list-style (及其相關屬性)
text-align
text-indent
text-transform
white-space
word-spacing
font (及其相關屬性)
letter-spacing
line-height
list-style (及其相關屬性)
text-align
text-indent
text-transform
white-space
word-spacing
在某些老式瀏覽器中,繼續(xù)功能可能有些問題,然而大部分現(xiàn)代瀏覽器在這方面都處理得很正確。記住上面這個列表,可以讓你少寫點多余的代碼。當然了,假如你想看看完整的列表,還是參考 CSS 2 Property Index。
空白
并非指的是 CSS 的 white-space 屬性,這個屬性早有確定的值了。我們說的是樣式表本身含有的那些空白�?瞻壮S糜趽Q行字符,和在一行里面用來改進可讀性的空格。盡管把它們都刪除可能會剩下個把字節(jié),但好處究竟有限。
要害是,假如把它們都刪除了,CSS 文件就會變得非常難讀,更難修改。要是你真的打算這么做,不妨創(chuàng)建一個主 CSS 文件,再根據(jù)它生成一個刪除了所有空白的副本,修改的時候只修改主文件,根據(jù)主文件重新生成一次副本就行了。
請注重,CSS 編碼中需要一些空白,刪除那些必要的會導致你未曾預料的問題。假如 W3C 規(guī)范中用了 "space separated" 這樣的語句,那么空格就不可省略。常見的像簡記屬性中分隔值的那些空格,還有 下降合并符 (descendant combinator),或者稱為下降選擇符,就是一個空格。所以說不到非用不可的時候,刪除空白這樣的方法還是少用。
最后
你現(xiàn)在學會了好幾種讓你的樣式表更高效的方法,益處是在這些技巧下,不僅下載時間被減少了,而且清楚、易于理解、更改的代碼隨之而來。就算你用排版工具來編輯樣式表,也可以在最后用這些方法將其改定為高效的樣子。
相關CSS教程:
- 相關鏈接:
- 教程說明:
CSS教程-如何才能高效的進行CSS編碼?
。