摘要:如果你并不是一個特別有經驗的程序員,我相信你未必知道屬性除了能用在文本顯示,還可以用作其它地方。說實話,估計這個值很少人會使用它,但你要知道確實可以使用這樣的一個值,如果以前不知道它,那么,現在,在有些罕見的地方,你也許就會變得聰明一點了。
雖然CSS并不是一種很復雜的技術,但就算你是一個使用CSS多年的高手,仍然會有很多CSS用法/屬性/屬性值你從來沒使用過,甚至從來沒聽說過。
1.CSS的color屬性并非只能用于文本顯示對于CSS的color屬性,相信所有Web開發人員都使用過。如果你并不是一個特別有經驗的程序員,我相信你未必知道color屬性除了能用在文本顯示,還可以用作其它地方。
你可以先看一下下面的演示:
HTML代碼
CSS代碼
body { color: yellow; background: #444; font-size: 20px; font-family: Arial, sans-serif; text-align: center; } ul { border: solid 2px; text-align: left; } ol { text-align: left; } hr { border-color: inherit; }
http://jsfiddle.net/c0501uL5/3/embedded/result/
請注意,上面的代碼里只使用了一個color屬性,就是在body元素上,設置成了yellow。但是,你也看到了,所有這個頁面上的東西都變成了黃色,包括:
無法顯示的圖片的alt文字
list元素的邊框
無序list元素前面的小點
有序list元素前面的數字
還有hr元素
有趣的是,這個hr元素,缺省情況下它并不從body上繼承color的屬性,但我使用border-color: inherit強制讓它繼承。這是個很詭異的特征。
在CSS規范里是這樣說的:
這個屬性聲明了元素文本內容的前景色(foreground color)。除此之外,它的值還被用于其它地方間接的引用….比如,其它可以接受顏色值的屬性。
我無法想象出還有什么地方的屬性能用“前景色”來描述,如果你知道,請在評論里告訴我。
2.CSS里的visibility屬性有個collapse屬性值:collapse對于CSS里的visibility屬性,相信你用過不下幾百次。大多時候,你會把它的值設置成visible(這是所有頁面元素的缺省值),或者是hidden。后者相當于display: none,但仍然占用頁面空間。
其實visibility可以有第三種值,就是collapse。當一個元素的visibility屬性被設置成collapse值后,對于一般的元素,它的表現跟hidden是一樣的。但例外的是,如果這個元素是table相關的元素,例如table行,table group,table列,table column group,它的表現卻跟display: none一樣,也就是說,它們占用的空間也會釋放。
但遺憾的是,各種瀏覽器對collapse值的處理方式不一樣。看一下下面的演示:
HTML代碼
Fruits | Vegetables | Rocks |
---|---|---|
Apple | Celery | Granite |
Orange | Cabbage | Flint |
CSS代碼
body { text-align: center; padding-top: 20px; font-family: Arial, sans-serif; } table { border-collapse: separate; border-spacing: 5px; border: solid 1px black; width: 500px; margin: 0 auto; } th, td { text-align: center; border: solid 1px black; padding: 10px; } .vc { visibility: collapse; } .vh { visibility: hidden; } button { margin-top: 5px; }
Javascript代碼
var btns = document.getElementsByTagName("button"), rows = document.getElementsByTagName("tr"); btns[0].addEventListener("click", function () { rows[1].className = "vc"; }, false); btns[1].addEventListener("click", function () { rows[1].className = "vh"; }, false); btns[2].addEventListener("click", function () { rows[1].className = ""; }, false);
演示
http://jsfiddle.net/c0501uL5/4/embedded/result/
CSS-Tricks的Almanac建議說不要使用這個值,因為瀏覽器的不統一。
據我的觀察:
在谷歌瀏覽器里,使用collapse值和使用hidden值沒有什么區別。 (See this bug report and comments)
在火狐瀏覽器、Opera和IE11里,使用collapse值的效果就如它的字面意思:table的行會消失,它的下面一行會補充它的位置。
說實話,估計這個值很少人會使用它,但你要知道確實可以使用這樣的一個值,如果以前不知道它,那么,現在,在有些罕見的地方,你也許就會變得聰明一點了。
3.CSS的background簡寫方式里新增了新的屬性值在CSS2.1里,background屬性的簡寫方式包含五種屬性值 – background-color, background-image, background-repeat, background-attachment, and background-position。從CSS3開始,又增加了3個新的屬性值,加起來一共8個。下面是按順序分別代表的意思:
background: [background-color] [background-image] [background-repeat] [background-attachment] [background-position] / [ background-size] [background-origin] [background-clip];
注意里面的反斜杠,它更font和border-radius里簡寫方式使用的反斜杠的用法相似。反斜杠可以在支持這種寫法的瀏覽器里在position后面接著寫background-size。
除此之外,你開可以增加另外兩個描述它的屬性值: background-origin 和 background-clip.
它的語法用起來像下面這個樣子:
.example { background: aquamarine url(img.png) no-repeat scroll center center / 50% content-box content-box; }
你可以用下面的演示檢測你的瀏覽器是否支持這種寫法:
http://jsfiddle.net/c0501uL5/5/embedded/result/
關于瀏覽器的支持情況,大概所有的現代瀏覽器都支持這些新屬性值,但對于一些非常老舊的瀏覽器(IE6/7/8),最好在代碼里提供一些萬一不支持的補救機制。
4.CSS的clip屬性只在絕對定位的元素上才會生效之前說到了background-clip,你可能會想到clip屬性。它的用法是下面這個樣子:
.example { clip: rect(110px, 160px, 170px, 60px); }
它的作用是按指定的尺寸、規定的大小裁剪元素。很多簡單,但唯一你需要注意的事情是,clip只會在絕對定位的元素上生效。所有,你必須這樣做:
.example { position: absolute; clip: rect(110px, 160px, 170px, 60px); }
在下面的演示中,你可以看到當元素在絕對定位/相對定位的切換中表現出來的效果:
http://jsfiddle.net/c0501uL5/6/embedded/result/
但是,你也可以將元素的position設置成position: fixed,因為,根據css官方規范,fixed的元素也屬于‘absolutely positioned’元素。
5.元素豎向的百分比設定是相對于容器的寬度,而不是高度這是一個很讓人困惑的CSS特征,我之前也談到過它。我們大家都知道,當按百分比設定一個元素的寬度時,它是相對于父容器的寬度計算的,但是,對于一些表示豎向距離的屬性,例如padding-top,padding-bottom,margin-top,margin-bottom等,當按百分比設定它們時,依據的也是父容器的寬度,而不是高度。
下面是一個實例演示,你可以調整容器的寬度,但你會發現,黃塊塊的padding-bottom的距離也會隨之寬度而變大或變小。
HTML代碼
CSS代碼
body { font-family: Arial, sans-serif; padding-top: 30px; text-align: center; } .wrapper { width: 400px; margin: 0 auto; border: solid 1px black; } .box { width: 100px; height: 100px; background: gold; margin-left: auto; margin-right: auto; padding-top: 10%; padding-bottom: 10%; margin-bottom: 5%; } .range { display: block; margin: 20px auto; } output { text-align: center; display: block; font-weight: bold; padding-bottom: 20px; } output span { font-weight: normal; }實例演示
http://jsfiddle.net/c0501uL5/7/embedded/result/
上面的代碼中,我們對內部子元素聲明了3個豎向的距離,都是百分比形式。當移動滑塊時,我們的js代碼只需修改了容器的寬度。但是,這個這三個屬性高度都跟隨著變化,可以看出,它們的百分比計算是基于容器的寬度,而不是高度的。
6.border屬性比你想象的要復雜我們很多人都用過這樣的寫法:
.example { border: solid 1px black; }
這里的border屬性的用法實際上是一種簡寫的形式,它分別設置了border-style, border-width, 和border-color — 用一句代碼表示它們三個。
但不要忘記,border-style, border-width, 和border-color也都有自己的簡寫形式。所以,border-width可以寫成這樣:
.example { border-width: 2px 5px 1px 0; }
這樣,四個邊的寬度被一次設定。border-color 和 border-style 屬性也可以這樣做。下面的這個實例演示就是用的這種寫法:
HTML代碼
CSS代碼
body { font-family: Arial, sans-serif; } .box { width: 150px; height: 150px; margin: 20px auto; border-color: peachpuff chartreuse thistle firebrick; border-style: solid dashed dotted double; border-width: 10px 3px 1px 8px; } p { text-align: center; }演示
http://jsfiddle.net/c0501uL5/8/embedded/result/
其實,這些每個屬性還可以繼續細化,被拆分成border-left-style, border-top-width, border-bottom-color….
但是,你無法用border的簡寫分別對四個邊設置不同的值,只能分開來設置。所以,border是一個簡寫里還有簡寫的屬性。
7.text-decoration屬性變成了屬性簡寫我相信有些小知識會讓你大吃一驚。
跟著最新的CSS規范,text-decoration現在的寫法是這樣的:
a { text-decoration: overline aqua wavy; }text-decoration屬性現在需要用三種屬性值來表示了:text-decoration-line, text-decoration-color, and text-decoration-style.
但不幸的是,目前只有火狐瀏覽器實現了對這些新屬性的支持。
你可以用火狐瀏覽器試一試下面的演示:
HTML代碼
IT"S LIKE WATER, PEOPLE(You should see a wavy line on top. Currently works only in Firefox)
CSS代碼
body { padding: 30px; text-align: center; font-family: Arial, sans-serif; } a, a:visited { color: blue; background: aqua; -moz-text-decoration-color: aqua; -moz-text-decoration-line: overline; -moz-text-decoration-style: wavy; text-decoration-color: aqua; text-decoration-line: overline; text-decoration-style: wavy; }演示
http://jsfiddle.net/c0501uL5/9/embedded/result/
在這演示中,我們沒有使用簡寫形式,而是分開描述每個屬性。這是可以更好的保證瀏覽器的向后兼容,使那些目前不支持這種寫法的瀏覽器也不受影響。
8.border-width屬性可以使用預定義常量值也許對與你來說這并不是一個什么新鮮信息。除了可以使用標準寬度值(例如5px或1em)外,border-width屬性可以接受預定義的常量值:medium, thin, 和 thick
事實上,如果你不給border-width屬性賦值,那它的缺省值是“medium”。下面的演示就是用了預定義常量值:
HTML代碼
CSS代碼
body { font-family: Arial, sans-serif; text-align: center; } .example { width: 100px; height: 100px; margin: 20px auto; background: aqua; border: solid thick red; }演示
http://jsfiddle.net/c0501uL5/10/embedded/result/
在瀏覽器使用這些預定義常量值時,CSS規范里并沒有規定都應該是什么寬度,但從我的觀察看,它們的值分別是 1px, 3px, 和 5px.
9.為什么沒有人使用border-image之前我曾經寫過一篇關于CSS的border-image屬性的文章。現在幾乎所有的現代瀏覽器都支持這個屬性——除了IE10及以下IE版本。
看起來這是一個非常漂亮的CSS功能,它可以讓你用圖片修飾元素的邊框。下面是一個實例演示,你可以拖拽調整里面的方塊的大小,看看有什么邊框圖案的變化。
HTML代碼
<上面的方塊使用了圖片描邊。在這個方塊的右下角,有一個可以調整這個方塊大小的小三角,點住它,拖動它調整方塊大小,看看有什么效果。.
Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo.
CSS代碼
body { font-family: Arial, sans-serif; text-align: center; } .bi { border: 45px solid transparent; -webkit-border-image: url(http://www.webhek.com/wordpress/wp-content/uploads/2014/07/bg-pawprints-all.jpg) 45 round; -moz-border-image: url(http://www.webhek.com/wordpress/wp-content/uploads/2014/07/bg-pawprints-all.jpg) 45 round; border-image: url(http://www.webhek.com/wordpress/wp-content/uploads/2014/07/bg-pawprints-all.jpg) 45 round; font-family: Arial, Helvetica, sans-serif; color: #222; width: 500px; margin: 30px auto 30px auto; overflow: hidden; resize: both; }演示
http://jsfiddle.net/c0501uL5/11/embedded/result/
但不幸的是,這么好的一個功能,卻沒有看到多少人使用它,也許是我的眼界太窄。如果你在哪看到過有人使用border-image屬性,或你在真正項目中使用了它,請留言告訴我。
10.你知道table里的empty-cells屬性嗎?css里的empty-cells屬性是所有瀏覽器都支持的,甚至包括IE8,它的用法是下面這個樣子:
table { empty-cells: hide; }估計你從語義上已經猜出它的作用了。它是為HTML table服務的。它會告訴瀏覽器,當一個table單元格里沒有東西時,就隱藏它。下面的演示里,你可以點擊里面按鈕,它會切換empty-cells的屬性值,看看table的顯示有什么變化。
HTML代碼
Fruits Vegetables Rocks Celery Granite Orange Flint CSS代碼
body { text-align: center; padding-top: 20px; font-family: Arial, sans-serif; } table { border: solid 1px black; border-collapse: separate; border-spacing: 5px; width: 500px; margin: 0 auto; empty-cells: hide; background: lightblue; } th, td { text-align: center; border: solid 1px black; padding: 10px; } button { margin-top: 20px; }js代碼
var b = document.getElementById("b"), t = document.getElementById("table"); b.onclick = function () { if (this.getAttribute("data-ec") === "hide") { t.style.emptyCells = "show"; this.setAttribute("data-ec", "show"); } else { t.style.emptyCells = "hide"; this.setAttribute("data-ec", "hide"); } };演示
http://jsfiddle.net/c0501uL5/12/embedded/result/
在上面的演示中,我為能讓單元格的邊框顯示出來,在單元格的邊框間添加了空隙。有時候這個屬性不會有任何視覺效果,因為你必須讓你里面有可見的東西。
11.font-style的oblique屬性值對與css的font-style屬性,我估計大家每次見到的都是使用“normal”或 “italic”兩個屬性值。但事實上,你還可以讓它賦值為“oblique”。請看下面的演示:
HTML代碼
Oblique Text
Italic Text
CSS代碼
h1 { font-weight: normal; font-family: Georgia, serif; font-style: oblique; text-align: center; font-size: 50px; } h1:nth-child(2) { font-style: italic; } p { font-family: Arial, sans-serif; text-align: center; }演示
http://jsfiddle.net/c0501uL5/13/embedded/result/
這是什么意思?為什么“oblique”和斜體”italic”的效果是一樣的?
CSS規范中是這樣描述“oblique”的:
“…讓一種字體標識為斜體(oblique),如果沒有這種格式,就使用italic字體。”
這里描述所用的“oblique”和“italic”都是傾斜的意思。“oblique”在維基百科里的解釋就是一種排版術語,就是一種傾斜的文字,但不是斜體。
因為“oblique”對于font-style來說是一種合法的屬性值,它可和italic進行互換,除非真有一種字體只提供了oblique體而沒有提供斜體。
但我似乎從來沒有聽說過哪種字形提供過oblique字體,也許我錯了。研究發現,一種字庫好像不能同時提供斜體和oblique兩種字體,因為oblique基本上是一種模仿的斜體,而不是真正的斜體。
所以,如果我沒有猜錯的話,如果一種字庫里沒有提供斜體字,那當使用CSS的font-style: italic時,瀏覽器實際上是按font-style: oblique顯示的。
12.word-wrap和overflow-wrap是等效的word-wrap并不是一個很常用的CSS屬性,但在特定的環境中確實非常有用的。我們經常使用的一個例子是讓頁面中顯示一個長url時換行,而不是撐破頁面,下面是一個例子。
HTML代碼
supercalifragilisticexpialidocious
CSS代碼
body { font-family: Arial, sans-serif; text-align: center; } .p { font-size: 24px; text-align: center; width: 200px; margin: 20px auto; border: solid 1px black; min-height: 60px; word-wrap: break-word; } button { display: block; margin: 0 auto; }JS代碼
var p = document.getElementById("p"), b = document.getElementById("b"); b.onclick = function () { if (this.getAttribute("data-ww") === "break-word") { p.style.wordWrap = "normal"; this.setAttribute("data-ww", "normal"); } else { p.style.wordWrap = "break-word"; this.setAttribute("data-ww", "break-word"); } };演示
http://jsfiddle.net/c0501uL5/14/embedded/result/
因為這個屬性最初是由微軟發明的,所以,所有的瀏覽器都支持這個屬性。
盡管有所有的瀏覽器都支持,但W3C決定要用overflow-wrap替換word-wrap,我想可能是他們認為word-wrap用詞不當。overflow-wrap跟word-wrap具有相同的屬性值,但現在,word-wrap被當作overflow-wrap的備選寫法。
雖然已經有不少的瀏覽器支持overflow-wrap這種寫法,但看起來沒必要使用overflow-wrap來讓老的瀏覽器不支持。所有的瀏覽器都會繼續支持word-wrap這種寫法。
這其中有多少是以前不知道的?不知道你從這篇博客里學到了多少知識?我希望它對你有些用處。非常有經驗的Web程序員可能會知道其中的大部分,但未必全部。而如果你是新手,想必收益頗豐。
轉自 WEB 駭客-12個你未必知道的CSS小知識
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/111005.html
相關文章
2017文章總結
摘要:歡迎來我的個人站點性能優化其他優化瀏覽器關鍵渲染路徑開啟性能優化之旅高性能滾動及頁面渲染優化理論寫法對壓縮率的影響唯快不破應用的個優化步驟進階鵝廠大神用直出實現網頁瞬開緩存網頁性能管理詳解寫給后端程序員的緩存原理介紹年底補課緩存機制優化動 歡迎來我的個人站點 性能優化 其他 優化瀏覽器關鍵渲染路徑 - 開啟性能優化之旅 高性能滾動 scroll 及頁面渲染優化 理論 | HTML寫法...
發表評論
0條評論
閱讀 3710·2023-04-25 22:43
閱讀 3706·2021-09-06 15:15
閱讀 1332·2019-08-30 15:54
閱讀 3542·2019-08-30 14:20
閱讀 2884·2019-08-29 17:16
閱讀 3117·2019-08-29 15:28
閱讀 3397·2019-08-29 11:08
閱讀 1071·2019-08-28 18:05