文章爲csslint中文版譯文, 點擊原文可查看英文版,如遇到翻譯錯誤或錯別字啥的,請留言指出~
規則列表以下
像.foo.bar
這樣的相鄰類,也能夠稱之爲類鏈。在CSS規範中容許使用,但在IE6即更早版本中可能就很差使了。IE僅會命中.bar
選擇器,也就是說你的選擇器不會按你的套路出牌,埋下游覽器樣式兼容性問題的種子。(不用IE6的 放心大膽的使用吧)css
一般來講,基於單類來定義一個樣式要比多類定義更好。能夠瞅瞅想一想下面的例子:html
.foo { font-weight: bold; } .bar { padding: 10px; } .foo.bar { color: red; }
選擇器.foo.bar
的規則,能夠用一個新類進行重寫:git
.foo { font-weight: bold; } .bar { padding: 10px; } .baz { color: red; }
那麼這個新類 baz
必須添加至原有的HTML元素上。這樣更利於維護,由於.baz
規則,此刻就能夠被複用了,而.foo.bar
規則只能被用在前一種固有的狀況下。github
規則 ID: adjoining-classes
web
此規則意在指出 使用相鄰類時,在IE6即更早版本時會出現匹配失敗的狀況。express
如下例子將會出現警告:bootstrap
.foo.bar { border: 1px solid black; } .first .abc.def { color: red; }
如下例子將不會出現警告:網絡
/* 兩個類中間有空格 */ .foo .bar { border: 1px solid black; }
盒子模型是CSS當中最常誤解的內容之一。"盒子模型 (Box model)"會參考一系列盒子屬性來最終肯定元素的顯示。盒子的最裏層爲 內容。內容被內邊距包裹,內邊距以外再由邊框包裹。盒子最終的寬高也就由以上的屬性相互影響,是否是有些小困惑。來,看下面的例子:app
.mybox { border: 1px solid black; padding: 5px; width: 100px; }
新手可能會以爲擁有mybox
類的元素寬度爲100像素。但實際上呢,寬度是112像素,這是由於盒子模型默認爲內容盒子,寬度最終由 內容、內邊距、邊框相加而得。若是開發人員不清楚盒子模型,那對此例子的寬度就會不一致。框架
經過將box-sizing
屬性值設置爲border-box
,可使絕大多數遊覽器遵循 寬高是 元素自己的全尺寸,例子以下:
.mybox { box-sizing: border-box; border: 1px solid black; padding: 5px; width: 100px; }
如今,這個擁有mybox
類的元素,實際寬度就爲100像素了,內邊距與邊框 將佔據其中的空間,剩下的88像素將是內容的寬度。
規則 ID: box-model
此規則 意在消除潛在的盒子模型大小問題。所以,規則將在如下狀況出現警告:
1.width
被與border
,border-left
,border-right
,padding
,padding-left
,padding-right
屬性同時使用時
2.height
被與border
,border-top
,border-bottom
,padding
,padding-top
,padding-bottom
屬性同時使用時
若是box-sizing
屬性已指定,則假定你已很是清楚盒子模型的規則,以上的狀況,此規則將不會出現警告。
如下的例子將會出現警告:
/* width and border */ .mybox { border: 1px solid black; width: 100px; } /* height and padding */ .mybox { height: 100px; padding: 10px; }
如下的例子將 不會 出現警告:
/* width and border with box-sizing */ .mybox { box-sizing: border-box; border: 1px solid black; width: 100px; } /* width and border-top */ .mybox { border-top: 1px solid black; width: 100px; } /* height and border-top of none */ .mybox { border-top: none; height: 100px; }
CSS的box-sizing
屬性用來定義 邊框,內邊距,是如何相互影響寬度和高度的。此屬性默認值爲content-box
,意思是 寬和高是由元素內容自己決定,而後 內邊距與邊框 再將內容包裹上。請看如下例子:
.mybox { border: 1px solid black; padding: 5px; width: 100px; }
這個盒子的實際寬度爲112像素。這是由於內容將佔據100像素的寬度,而後內容兩側分別加上5像素的內邊距,接着兩側再加上1像素的邊框。
當你將box-sizing
的屬性值改變至border-box
時,計算方式則不一樣了:
.mybox { box-sizing: border-box; border: 1px solid black; padding: 5px; width: 100px; }
此盒子的實際寬度爲100像素而其中供內容的可用空間爲88像素(100-5px[左]內邊距-5px[右]內邊距-1px[左]邊框-1px[右]邊框)。大多數狀況下認爲border-box
的設置更加合乎邏輯,也更像寬高屬性表達的含義。
可是呢可是呢,在使用box-sizing
時會有個小小的問題,也就是IE6 IE7是不支持box-sizing
這個屬性的。所以會展現出不一樣於盒子模型設置屬性的效果。
規則 ID: box-sizing
此規則在box-sizing
屬性使用時會出現警告。其含義即 提示開發者 此屬性在IE6 IE7或更早期的遊覽器上得不到支持。
如下示例將會出現警告:
.mybox { box-sizing: border-box; } .mybox { box-sizing: content-box; }
當使用@font-face
來跨遊覽器聲明 多字體類型時,你會發如今老版IE中出現404錯誤,這是由於老版IE在解析字體聲明時的缺陷(BUG)。來~ 舉個例子:
@font-face { font-family: 'MyFontFamily'; src: url('myfont-webfont.eot') format('embedded-opentype'), url('myfont-webfont.woff') format('woff'), url('myfont-webfont.ttf') format('truetype'), url('myfont-webfont.svg#svgFontName') format('svg'); }
在IE6,7和8上將會出現404錯誤。解決辦法是在第一個字體連接後加上 ? (問號),接下來 IE 會把 餘下的屬性值看做查詢字符串。如下爲正確示例:
@font-face { font-family: 'MyFontFamily'; src: url('myfont-webfont.eot?#iefix') format('embedded-opentype'), url('myfont-webfont.woff') format('woff'), url('myfont-webfont.ttf') format('truetype'), url('myfont-webfont.svg#svgFontName') format('svg'); }
規則 ID: bulletproof-font-face
此規則意在防止 在IE8及早期遊覽器上 由於解析字體連接的BUG而產生的404錯誤。
如下示例會出現警告:
@font-face { font-family: 'MyFontFamily'; /* First web font is missing query string */ src: url('myfont-webfont.eot') format('embedded-opentype'), url('myfont-webfont.woff') format('woff'), url('myfont-webfont.ttf') format('truetype'), url('myfont-webfont.svg#svgFontName') format('svg'); }
如下示例將 不會 出現警告:
@font-face { font-family: 'MyFontFamily'; src: url('myfont-webfont.eot?#iefix') format('embedded-opentype'), url('myfont-webfont.woff') format('woff'), url('myfont-webfont.ttf') format('truetype'), url('myfont-webfont.svg#svgFontName') format('svg'); }
此規則要求 第一個字體聲明爲 帶查詢字符串的 .eot文件,但不會檢測餘下的字體連接(假定你已有了.eot文件,這就無所謂了)
實驗性的CSS屬性,一般須要添加遊覽器前綴,方能實現其效果。固然,等到標準的最終統一與創建就不須要再添加前綴了。許多CSS3屬性對應都有多種前綴,包括 Firefox(-moz
),Safari/Chrome(-webkit
),Opera(-o
),和 Internet Explorer(-ms
)。由於前綴過多,咱們在使用新屬性時就很容易忘記 添加遊覽器前綴。
如下屬性建議追加多內核前綴:
animation
animation-delay
animation-direction
animation-duration
animation-fill-mode
animation-iteration-count
animation-name
animation-play-state
animation-timing-function
appearance
border-end
border-end-color
border-end-style
border-end-width
border-image
border-radius
border-start
border-start-color
border-start-style
border-start-width
box-align
box-direction
box-flex
box-lines
box-ordinal-group
box-orient
box-pack
box-sizing
box-shadow
column-count
column-gap
column-rule
column-rule-color
column-rule-style
column-rule-width
column-width
hyphens
line-break
margin-end
margin-start
marquee-speed
marquee-style
padding-end
padding-start
tab-size
text-size-adjust
transform
transform-origin
transition
transition-delay
transition-duration
transition-property
transition-timing-function
user-modify
user-select
word-break
writing-mode
若是想讓你的CSS效果跨遊覽器支持,那麼給新CSS屬性增長對應的遊覽器前綴就很是重要了。
規則 ID: compatible-vendor-prefixes
此規則將在 缺失遊覽器前綴的屬性時 出現警告。支持的屬性已在上方列表中羅列。
如下示例將會出現警告:
/* Missing -moz, -ms, and -o */ .mybox { -webkit-transform: translate(50px, 100px); } /* Missing -webkit */ .mybox { -moz-border-radius: 5px; }
空規則即 不包含任意屬性(沒有定義樣式屬性) ,以下:
.foo { }
許多時候呢,空規則的出現是由於 重構了樣式而忘記刪除冗餘代碼形成的。消除空規則 縮小了樣式文件大小 與 精簡了待遊覽器處理的樣式信息。
規則 ID: empty-rules
此規則 在CSS樣式中發現爲空規則時 出現警告。如下示例將會出現警告:
.mybox { } .mybox { } .mybox { /* a comment */ } .mybox { /* a comment */ }
儘管你能夠在CSS中定義任意的組合規則,可是呢,其中有些規則會由於 元素設置了display
屬性,而忽略你所設置的規則。這會致使你的CSS文件中出現髒代碼,同時也誤解了規則理應如何運轉的。
當 display:inline
時, width
,height
,margin-top
,margin-bottom
,和float
屬性的設置 將不會起到做用,由於 內聯(inline)元素不是一個規則的盒子模型,也就無從設置這些屬性。而 margin-left
和margin-right
依舊能起效是爲了保證 縮進 的目的,其它的外邊距(margin) 設置則起不到效果。float
屬性有時會用做修復 IE6 double-margin bug.
其它基於display
的情形有:
display:inline-block
不該與 float
同時使用。display:block
不該與 vertical-align
同時使用。display:table-*
不該與 margin' 或
float` 同時使用。移除這些會被忽略或有問題的屬性,能減少文件體積從而改善性能。
規則 ID: display-property-grouping
此規則 將標識出 與display
屬性同時使用 而不起效的屬性。其目的是使CSS文件更精簡,更清晰而無多餘代碼。所以,檢測出如下代碼時,提示警告:
display:inline
與 width
,height
,margin
,margin-top
,margin-bottom
,float
。display:inline-block
與 float
同時使用。display:block
與 vertical-align
同時使用。display:table-*
與 margin' 或
float` 同時使用。如下示例將提示警告:
/* inline with height */ .mybox { display: inline; height: 25px; } /* inline-block with float */ .mybox { display: inline-block; float: left; } /* table-cell and margin */ .mybox { display: table-cell; margin: 10px; }
如下示例將 不會 提示警告:
/* inline with margin-left */ .mybox { display: inline; margin-left: 10px; } /* table and margin */ .mybox { display: table; margin-bottom: 10px; }
儘量的使用較少的代碼來完成功能,是高性能的準則之一。所以,同個URLS連接地址在CSS中只出現一次最好。若是你有多個樣式類 須要使用同一背景圖片,那麼最好聲明一個 包含此圖片地址的通用樣式類,接着 添加至須要使用的元素之上。請看下面代碼:
.heart-icon { background: url(sprite.png) -16px 0 no-repeat; } .task-icon { background: url(sprite.png) -32px 0 no-repeat; }
在兩個類中重複定義了背景圖片地址。這是你本不須要的冗餘代碼,同時呢,當你修改了圖片文件名,也增長了忘記同時修改文件中兩處圖片地址的可能性。一種解決方式爲,抽取一個圖片地址類(做爲複用類),而後將此類添加至原有HTML元素上。以下:
.icons { background: url(sprite.png) no-repeat; } .heart-icon { background-position: -16px 0; } .task-icon { background-position: -32px 0; }
這裏,icons
類指明瞭背景圖片,其它類則指明背景圖片的位置。
規則 ID: duplicate-background-images
此規則意在 確保同一連接地址不會在樣式層疊表中重複。
如下示例將會提示警告:
/* multiple instances of the same URL */ .heart-icon { background: url(sprite.png) -16px 0 no-repeat; } .task-icon { background: url(sprite.png) -32px 0 no-repeat; }
如下示例將 不會提示警告:
/* single instance of URL */ .icons { background: url(sprite.png) no-repeat; } .heart-icon { background-position: -16px 0; } .task-icon { background-position: -32px 0; }
在早先網頁開發中,相同的CSS屬性出現了兩次則毫無疑問是有問題的,特別是 若是有兩個不一樣的值,以下:
.mybox { width: 100px; width: 120px; }
任何人看到此處的代碼都清楚的知道是錯誤的。可是最近呢,複用屬性能夠用來解決 高低版遊覽器對CSS屬性的支持度狀況。舉個例子,部分遊覽器支持RGBA色彩,而其它的則不行,那麼出現如下的示例,就十分正常合理了:
.mybox { background: #fff; background: rgba(255, 255, 255, 0.5); }
此處重複很明顯是有意爲之。開發者想在支持RGBA的遊覽器上使用其效果,而不支持的遊覽器則使用傳統的純色。
規則 ID: duplicate-properties
此規則 意在找出重複定義的CSS屬性代碼。警告將出如今:
如下示例將會提示警告:
/* properties with the same value */ .mybox { border: 1px solid black; border: 1px solid black; } /* properties separated by another property */ .mybox { border: 1px solid black; color: green; border: 1px solid red; }
如下示例將 不會提示警告:
/* one after another with different values */ .mybox { border: 1px solid black; border: 1px solid red; }
剛開始時,有三種方式來指定顏色:使用16進制,、使用3或6位字符串、使用顏色名稱 如 red
或 rgb()
。但在CSS3中,新增了幾種顏色定義的形式,包括 rgba()
,hsl()
,hsla()
。這些新的顏色格式 顯著提高了開發者使用色彩的靈活可塑性,同時使得那些老版遊覽器看上去更糟了。
這個規則源於 遊覽器的CSS解析器 會略過不識別的名稱或值。像IE8或更早的這類老版遊覽器,不識別 rgba()
,hsl()
,hsla()
,其結果就是會忽略定義的屬性。請看以下代碼:
.box { background: #000; color: rgba(100, 100, 200, 0.5); }
支持此格式的遊覽器將正常解析此CSS代碼。但不支持的遊覽器,因不能解析rgba的值而徹底忽略此color
的屬性。也就意味着color
的實際值將繼承至上下文環境,也可能最終值爲黑色(與背景色一致)。爲防止此狀況,就須要使用十六進制顏色值、顏色名稱或rga()格式來設定一個備用色彩,以下:
.box { background: #000; color: blue; color: rgba(100, 100, 200, 0.5); }
備用色彩 需要在 新顏色格式的前方定義,以確保 老版遊覽器能正常解析並使用,新版遊覽器也能繼續執行新的顏色格式。
規則 ID: fallback-colors
此規則 意在確保在全部的遊覽器上都能顯示合適的顏色。爲此,將在以下情形 提示警告:
color
屬性使用rgba()
,hsl()
,hsla()
顏色值時,在前處 未使用針對老版遊覽器的color
顏色格式。background
屬性使用rgba()
,hsl()
,hsla()
顏色值時,在前處 未使用針對老版遊覽器的background
顏色格式。background-color
屬性使用rgba()
,hsl()
,hsla()
顏色值時,在前處 未使用針對老版遊覽器的background-color
顏色格式。如下示例將會提示警告:
/* missing fallback color */ .mybox { color: rgba(100, 200, 100, 0.5); } /* missing fallback color */ .mybox { background-color: hsla(100, 50%, 100%, 0.5); } /* missing fallback color */ .mybox { background: hsla(100, 50%, 100%, 0.5) url(foo.png); } /* fallback color should be before */ .mybox { background-color: hsl(100, 50%, 100%); background-color: green; }
如下示例將 不會提示警告:
/* fallback color before newer format */ .mybox { color: red; color: rgba(255, 0, 0, 0.5); }
float
屬性 是CSS中實現多列布局 廣受歡迎的方式。在項目中,愈來愈多的float
元素被用來建立不一樣的 頁面佈局或站點佈局。若是此時改變佈局,則會使得CSS代碼十分脆弱,難以維護。
一般,使用不少的float
意味 你的項目將得益於網格系統。CSS網格系統使用CSS類來實現標準的多列布局,一些熱門的網格系統有:
使用以上其中一種網格系統,將極大的減小你須要編寫的CSS代碼。
規則 ID: floats
此規則 意在監察使用float
次數從而減小代碼複雜度。當float
出現 超過10次時,將提示警告。使用float頻率超過10次,意味着代碼中有許多 多列布局的定義,那麼經過引用網格系統框架,將更利於你的代碼維護。
網絡字體愈來愈流行,@font-face
使用頻率也隨之增長。可是,當字體文件過大,以及部分遊覽器在下載字體文件時,會阻塞渲染,就帶來了顯示性能的隱患。出於這個緣由,CSSlint將在樣式表中監測 出現超過 5次 網絡字體引用時,提示警告。
一個利於維護的站點,一般都有通用的字體集。這些字體大小,每每定義在一個表明其含義的抽象類當中,以便運用到站點的各個使用場景。若是未抽取出公用類,會致使開發者頻繁的使用font-size
,來使元素大小按預期顯示。這就帶來了一個問題,當設計的字體大小改變後,咱們須要改變樣式中全部設計的字體大小。而抽取出類時,只用改變類中定義的大小便可作到全局調整。
你能夠建立一些標準字體大小類,如:
.small { font-size: 8px; } .medium { font-size: 11px; } .large { font-size: 14px; }
在你的項目中使用以上類,能確保字體大小始終保持一致性,也限制了font-size
在CSS文件中出現的次數。此時,只須要改變一處字體大小的設置,就可實現以前須要修改多處的效果。
規則 ID:font-sizes
此規則意在強調 把過多字體大小的定義,轉而至 統必定義爲一個類的好處。規則 在使用 font-size
超過10次時 提示警告。
截止2011年12月份,CSS漸變的標準定義還未定稿,也就是說 想跨遊覽器實現色彩漸變,須要使用不少不一樣的遊覽器前綴。到如今爲止,CSS漸變 有五種 不一樣的遊覽器前綴。
-ms-linear-gradient
and -ms-radial-gradient
for Internet Explorer 10+-moz-linear-gradient
and -moz-radial-gradient
for Firefox 3.6+-o-linear-gradient
and -o-radial-gradient
for Opera 11.10+-webkit-linear-gradient
and -webkit-radial-gradient
for Safari 5+ and Chrome-webkit-gradient
for Safari 4+ and Chrome (aka "Old WebKit")想跨遊覽器實現一個簡單的雙色漸變,需要代碼以下:
background: -moz-linear-gradient(top, #1e5799 0%, #7db9e8 100%); /* FF3.6+ */ background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#1e5799), color-stop(100%,#7db9e8)); /* Chrome,Safari4+ */ background: -webkit-linear-gradient(top, #1e5799 0%,#7db9e8 100%); /* Chrome10+,Safari5.1+ */ background: -o-linear-gradient(top, #1e5799 0%,#7db9e8 100%); /* Opera 11.10+ */ background: -ms-linear-gradient(top, #1e5799 0%,#7db9e8 100%); /* IE10+ */
在如此多的前綴裏,編碼中很容易忘記 少編寫其中的一種或多個漸變前綴。
規則 ID: gradients
此規則在 使用漸變時 只定義部分遊覽器前綴 而未定義全部遊覽器前綴時,提示警告。
如下示例將提示警告:
/* Missing -moz, -ms, and -o */ .mybox { background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#1e5799), color-stop(100%,#7db9e8)); background: -webkit-linear-gradient(top, #1e5799 0%,#7db9e8 100%); } /* Missing old and new -webkit */ .mybox { background: -moz-linear-gradient(top, #1e5799 0%, #7db9e8 100%); background: -o-linear-gradient(top, #1e5799 0%,#7db9e8 100%); background: -ms-linear-gradient(top, #1e5799 0%,#7db9e8 100%); }
如下示例 不會提示警告:
.mybox { background: -moz-linear-gradient(top, #1e5799 0%, #7db9e8 100%); background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#1e5799), color-stop(100%,#7db9e8)); background: -webkit-linear-gradient(top, #1e5799 0%,#7db9e8 100%); background: -o-linear-gradient(top, #1e5799 0%,#7db9e8 100%); background: -ms-linear-gradient(top, #1e5799 0%,#7db9e8 100%); }
一直以來,開發者對 ID選擇器 感情甚好、情有獨鍾。可是呢,ID選擇器也多多少少有些反作用:它徹底是惟一的,所以不能複用。你可在頁面中,對全部元素都使用ID選擇器,但所以,你會失去CSS其它方面帶來的諸多益處。
CSS的好處之一就是可在多處 複用樣式規則。當你開始使用ID選擇器時,就不經意間將樣式侷限在了單個元素上。假設你的代碼以下:
#header a { color: black; }
這個樣式只會在ID爲header
下的a標籤 起效。但假設如今,你想在頁面中的另一個章節也使用一樣的樣式,估計你只能從新再定義一個類來實現效果,以下:
#header a, .callout a { color: black; }
一旦你明白此處的含義,你怕是隻會使用類定義而不會聲明ID選擇器了。
.callout a { color: black; }
最終,你可能將不在須要,也不想再使用ID選擇器,而使用 類選擇器 取代其效果。棄用ID選擇器後,你將解鎖釋放CSS複用的最大能力。
規則 ID: ids
此規則意在 提示 不使用ID選擇器從而提升代碼複用和可維護性。任何一處的ID選擇器 將提示 警告。
如下示例將 提示警告:
#mybox { display: block; } .mybox #go { color: red; }
@import
命令用於在CSS文件中 引用其它的CSS文件,例子以下:
@import url(more.css); @import url(andmore.css); a { color: black; }
此代碼在開始位置 引用了另外兩個樣式表。當遊覽器解析此代碼時,會在每一個@import
後開始下載指定的文件,而 中止執行後面的代碼。也就是說 在@import
指定的文件未下載完成前,遊覽器不會同時下載其它的樣式文件,總而失去了 並行下載CSS的優點。
有兩種替代@import
的方式:
<link>
標籤來引入你須要的CSS樣式。<link>
引入是支持並行下載的。規則 ID: import
此規則 在使用@import
時 提示警告。
如下示例將提示警告:
@import url(foo.css);
!important
註釋使用在 人爲指定強調 的屬性上。這每每意味着 這個待強調的特殊屬性 已在整個CSS文件中失控(選擇器不能正常工做),亦或 須要重構代碼了。!important
在CSS中出現的次數越多,越突顯出 開發者在頁面樣式上的很多問題。
規則 ID: important
此規則意在 確保代碼的特指度工做正常。爲此,一旦出現 !important
將提示警告。
如下示例將提示警告:
.mybox { color: red !important; }
可供CSS使用的屬性變得愈來愈多,那麼 在不檢測屬性名稱是否正確時,咱們就很容易將其拼寫錯誤。
規則 ID: known-properties
此規則將檢查每一個使用的屬性名稱 以確保其是已知的屬性。支持檢查的屬性 是CSS解析器中的一部分,規則使用CSS解析器的信息來驗證 屬性 是否爲已知。支持檢查的屬性 將隨CSS的開發完善而須要更新,雖然如今不是最終版,但畢竟是個避免錯誤的 好的開始。此規則就是在出現拼寫錯誤時 提示警告。
全部遊覽器前綴屬性 (以 - 開始) 將被忽略,由於前綴 會添加至 遊覽器各自版本的屬性上,而這些屬性沒有一個參考標準。此規則將不一樣於傳統的CSS驗證,傳統的CSS驗證在 遊覽器前綴屬性出現時 也會提示警告。
此規則不只會檢查 屬性名稱,也會檢查屬性 對應的值是否與其匹配。但如今,只能檢查大部分而不是全部的屬性對應的值 的合法性。
如下示例將提示警告:
/* clr isn't a known property */ a { clr: red; } /* 'foo' isn't a valid color */ a { color: foo; }
如下示例將 不提示警告:
/* -moz- is a vendor prefix, so ignore */ a { -moz-foo: bar; }
outline
屬性用於在元素的四周定義邊框。不一樣於border
屬性,outline
不會改變元素的大小與佈局。正因如此,遊覽器經常使用outline
來突出 激活狀態的元素。當元素被選中爲焦點時,在IE和火狐(Firefox)遊覽器中,outline
所渲染的元素 是單像素的點狀線條。
焦點輪廓,能直觀的提醒用戶當前頁面得到焦點的元素,所以 在輔助提示上的重要性不言而喻。對於純鍵盤用戶而言,若是當前焦點元素沒有明顯的視效指明,就幾乎不可能追蹤到頁面中所選的元素。不幸的是,默認樣式下的焦點輪廓,顏值有些低,不美觀,以致 在代碼中將其移除了,以下:
a { outline: none; }
或
a { outline: 0; }
以上兩種方式都將移除元素的外輪廓,即使在元素得到焦點時,外輪廓也不會出現。這對於 輔助提示 是不友好的。
固然,你能夠給用戶提供 自定義焦點效果,從而替換默認的點狀邊框。爲此,移除掉outline
,添加對應的改善效果,就很人性化很合理了。那麼,好的解決方式之一就是使用 :focus
來提供新的樣式 的同時,重設outline
,例子以下:
a:focus { border: 1px solid red; outline: none; }
規則 ID: outline-none
此規則意在 確保純鍵盤用戶 得到焦點提示。爲此,規則發現如下狀況 提示警告:
outline: none
或 outline: 0
在選擇器中使用,但未指定 :focus
outline: none
或 outline: 0
在選擇器中使用,雖指定:focus
但其未定義 替換屬性如下示例將 提示警告:
/* no :focus */ a { outline: none; } /* no :focus */ a { outline: 0; } /* :focus but missing a replacement treatment */ a:focus { outline: 0; }
如下示例 不會提示警告:
/* :focus with outline: 0 and provides replacement treatment */ a:focus { border: 1px solid red; outline: 0; }
編寫如li.active
選擇器是沒必要要的,除非 不一樣的元素名稱,在使用相同類名下 須要展現不一樣的樣式。多數狀況下,在選擇器中移除元素名稱更爲穩當,不只減少了CSS文件的體積,同時也提高了選擇器的性能(不須再次匹配元素)。
移除元素名稱也同時下降了CSS與HTML的耦合度,容許你改變元素使用的樣式類,而不須要更新CSS樣式文件。
規則 ID: overqualified-elements
此規則意在 移除冗餘沒必要的選擇器總而減小數據大小。爲此,警告出如今 元素名稱與類名同時使用時(如 li.active
)。若是,兩個不一樣的元素使用了相同的類名(如 li.active
p.active
) 將 不會提示警告。
如下示例 提示警告:
div.mybox { color: red; } .mybox li.active { background: red; }
如下示例將 不提示警告:
/* Two different elements in different rules with the same class */ li.active { color: red; } p.active { color: green; }
標題元素(h1
-h6
) 應定義爲頂級樣式 且 不能在頁面其它區域 定義其特定樣式。標題樣式 應以面向對象的思惟來考慮設計,而且 在整個站點中的展現效果應當保持一直。這種方式容許在站點中複用你的樣式 從而利於站點的統一展現,健壯代碼與維護。舉個例子,如下代碼爲 過分定義標題:
.foo h1 { font-size: 110%; }
規則 ID: qualified-headings
此規則意在 找出 定義了標題的規則,所以 警告將出如今 樣式規則裏將 標題元素 做爲最後一個選擇器。
如下示例 提示警告:
/* qualified heading */ .box h3 { font-weight: normal; } /* qualified heading */ .item:hover h3 { font-weight: bold; }
如下示例 不提示警告:
/* Not qualified */ h3 { font-weight: normal; }
CSS3增長了複雜的屬性選擇器 使得咱們能夠根據表達式來匹配 屬性值。這系列的選擇器有着性能的影響,表達式匹配與簡單的類名匹配相比 速度要慢。在諸多場景裏,是使用一個不肯定值的選擇器 仍是 簡單的給元素增長一個類名選擇器 還在討論中。這裏有幾種須要注意的屬性選擇器。
如屬性選擇器僅包含屬性自己,則此屬性選擇器實際上沒有性能問題。舉個例子,如下選擇器 僅匹配 <a>
元素定義了href
屬性:
//OK a[href] { color: red; }
此屬性選擇器能正常使用 而且 也不會形成任何性能問題。
如屬性選擇器使用肯定的值做爲匹配條件,則此屬性選擇器也是沒問題的。舉個例子,如下選擇器 僅匹配<a>
元素的rel
屬性值爲 "external" :
//OK a[rel=external] { color: blue; }
除以上兩種狀況,其它條件下使用屬性選擇器會形成性能問題。各屬性選擇器都有着相似的基本格式,在元素名稱後使用方括號,與等號組合成的標識符,來進行表達式匹配。
包含
第一類"問題"選擇器是 包涵選擇器。選擇器使用 *=
來匹配 屬性值中包涵給定的字符串 元素。工做原理相似與JavaScript中indexOf()
方法,只要檢索的值出如今屬性值的任意位置便可,例子以下:
a[href*=yahoo.com] { color: green; }
此選擇器匹配 任何<a>
元素的href
屬性值中 有字符串 "yahoo.com"的條件。以下示例將匹配此條件:
<a href="http://www.yahoo.com/">Yahoo!</a> <a href="http://www.google.com/redirect=www.yahoo.com">Redirect to Yahoo!</a> <a href="http://login.yahoo.com/">Login to Yahoo!</a>
注意 沒必要擔憂字符串兩邊是否有空格,由於只作部分匹配。
開始爲
接着須要"避免使用"的選擇器是 開始爲匹配。選擇器使用^=
操做符來匹配 屬性值以給定的字符串開頭 元素。例子以下:
a[rel^=ext] { color: red; }
此規則將匹配以下示例:
<a href="http://www.example.com" rel="external">Example</a> <a rel="extra">Extra! Extra!</a> <a rel="extreme">Extreme</a>
全部的選擇器只關注 字符串"ext"是否在rel
屬性值的起始位置。
結尾爲
接着須要"避免使用"的選擇器是 結尾爲匹配。選擇器使用$=
操做符來匹配 屬性值以給定的字符串結尾 元素。例子以下:
a[href$=.html] { color: blue; }
此規則匹配全部 <a>
元素 以 其href
屬性值爲.html
結尾的條件。如下示例將匹配:
<a href="index.html">Home</a> <a href="http://www.example.com/example.html">Example</a>
單詞匹配
檢查被空格間隔開的屬性值,是更爲複雜的選擇器。選擇器使用 ~=
操做符 來匹配 屬性值必須包涵給定的單詞,換句話說,屬性值匹配給定單詞的同時,屬性值自己還須被空格所間隔開。示例以下:
a[rel~=external] { color: red; }
此規則將匹配以下例子:
<a href="http://www.example.com" rel="external">Example</a> <a href="http://www.example.com" rel="external me">Example</a> <a href="http://www.example.com" rel="reference external">Example</a> <a href="http://www.example.com" rel="friend external me">Example</a>
包涵破折號
最後一個"問題"選擇器是 檢查屬性值中的字符串中是否被破折號分隔。|=
用來找字符串的內部是否有xxx-yyy-zzz
格式的字符串,例子以下:
a[data-info|=name] { color: red; }
它將匹配以下示例:
<a data-info="name-address-phone">Info</a> <a data-info="address-name-phone">Info</a> <a data-info="address-phone-name">Info</a>
性能問題
以上全部這些複雜的屬性選擇器 都須經過一遍又一遍的計算來匹配對應屬性值,從而確保最終的顯示效果正確。爲此,CSS須要開銷更多的時間,來計算整個頁面的顯示效果。
規則 ID:regex-selectors
此規則意在 標識出 存在影響性能問題的潛在選擇器。爲此,規則在發現選擇器使用 *=
,|=
,^=
,$=
,~=
提示警告。
如下示例 提示警告:
.mybox[class~=xxx]{ color: red; } .mybox[class^=xxx]{ color: red; } .mybox[class|=xxx]{ color: red; } .mybox[class$=xxx]{ color: red; } .mybox[class*=xxx]{ color: red; }
如下示例 不會提示警告:
.mybox[class=xxx]{ color: red; } .mybox[class]{ color: red; }
有時我們編寫一條規則時,使用簡寫來代替多屬性定義會更好,例如:
.mybox { margin-left: 10px; margin-right: 10px; margin-top: 20px; margin-bottom: 30px; }
此四屬性能夠組合成一個margin
屬性,以下:
.mybox { margin: 20px 10px 30px; }
使用簡寫屬性能夠幫助減小CSS體積的大小。
規則 ID: shorthand
此規則意在 檢索出可簡寫的屬性來減小文件體積。所以,在以下示例中 提示警告:
margin-left
,margin-right
,margin-top
,margin-bottom
在同一規則中使用時。padding-left
,padding-right
,padding-top
,padding-bottom
在同一規則中使用的。如下示例 提示警告:
.mybox { margin-left: 10px; margin-right: 10px; margin-top: 20px; margin-bottom: 30px; } .mybox { padding-left: 10px; padding-right: 10px; padding-top: 20px; padding-bottom: 30px; }
如下示例 不提示警告:
/* only two margin properties*/ .mybox { margin-left: 10px; margin-right: 10px; } /* only two padding properties */ .mybox { padding-right: 10px; padding-top: 20px; }
星號前綴是有名(也可能無名)的技巧,僅用來在IE8之前的版本上指定CSS屬性。經過在屬性名前加上星號,老版IE遊覽器解析時,將當此星號不存在,而其它遊覽器則直接忽略此屬性。例子以下:
.mybox { border: 1px solid black; padding: 5px; width: 100px; *width: 200px; }
在此示例中,IE7及更早版本會將*width
屬性看成width
解析,所以實際值爲200px
;其它遊覽器則忽略跳過此屬性,使用的實際值爲100px
。
星號前綴是依賴老版IE的CSS解析器缺陷,也所以,並不建議使用它。
規則 ID: star-property-hack
此規則意在 消除在CSS中使用星號前綴.所以,在發現屬性名前使用星號時提示警告。
如下示例 提示警告:
.mybox { border: 1px solid black; *width: 100px; }
文本負縮進一般看成輔助的目的,來隱藏在屏幕上的文字。使用場景之一就是做爲圖像替換技術,使用文本負縮進,可確保屏幕閱讀器在文本沒有顯示在屏幕中時也能讀取其數據。使用visibility:hidden
或display:none
會使得屏幕閱讀器略過文本信息,所以,運用文本負縮進被視爲更好的輔助處理方式。
此技巧一般使用很大的負單位數值,如-999px
或-9999px
,以下:
.mybox { background: url(bg.png) no-repeat; text-indent: -9999px; }
此帶有技巧性的縮進容許 背景圖片展現給普通遊覽用戶的同時,也確保了屏幕閱讀器能順利解析內聯的文本信息。
當文本負縮進使用在橫向視圖頁面時,會引發必定的麻煩,由於會出現一個很長的橫向滾動條。此問題能夠經過添加direction:ltr
來解決,以下:
.mybox { background: url(bg.png) no-repeat; direction: ltr; text-indent: -9999px; }
關於文本負縮進是否會影響頁面搜索排名,出現了各類不一樣的聲音。 Anecdotal accounts 以爲Google會把文本負縮進看成垃圾廣告技術來處理,可是這並未獲得驗證。
規則 ID: text-indent
此規則意在 找出CSS代碼中使用text-indent
的潛在問題。警告出如今 text-indent
的值爲-99
或相似(如,-100
,-999
),而沒有使用direction:ltr
時。數值的單位不會考慮在其中,由於px
,em
或其它單位 會看做等同。
如下示例 提示警告:
/* missing direction */ .mybox { text-indent: -999px; } /* missing direction */ .mybox { text-indent: -999em; } /* direction is rtl */ .mybox { direction: rtl; text-indent: -999em; }
如下示例 不會提示警告:
/* direction used */ .mybox { direction: ltr; text-indent: -999em; } /* Not obviously used to hide text */ .mybox { text-indent: -1em; }
下劃線前綴 是僅對IE7之前版本的遊覽器執行CSS屬性的一種技術手段。經過在屬性名前添加下劃線,老版IE遊覽器將省略下劃線,而其它遊覽器則直接忽略此屬性。示例以下:
.mybox { border: 1px solid black; padding: 5px; width: 100px; _width: 200px; }
在這個例子中,IE6及之前遊覽器把_width
屬性 當width
看待,因此實際寬度爲200px
;其它遊覽器則跳過此屬性,於是實際值爲100px
。
下劃線前綴是依賴IE遊覽器,CSS解析的缺陷 實現其效果,正因如此,非特殊狀況並不推薦使用。
規則 ID: underscore-property-hack
此規則意在 消除在CSS中使用下劃線前綴。所以,在屬性名前出現下劃線 將提示警告:
.mybox { border: 1px solid black; _width: 100px; }
面相對象CSS (OOCSS) 要求定義可重用的對象,以確保在站點的任何位置使用時,都有着相同的顯示效果。標題元素 (h1 - h6) 應看成爲內建對象考慮,使其無論在何處使用均爲一樣的顯示效果。所以,每一個標題元素,因當只被規則定義一次。多處規則定義相同的標題顯示效果,會使其很難使用,由於 標題樣式會由於上下文環境不一致而出現不一樣展現效果。
規則 ID:unique-headings
此規則意在 標識出重複定義標題元素的聲明。所以,警告出如今 對同一標題 定義了多個規則時。
如下示例提示警告:
/* Two rules for h3 */ h3 { font-weight: normal; } .box h3 { font-weight: bold; }
如下示例 不提示警告:
/* :hover doesn't count */ h3 { font-weight: normal; } h3:hover { font-weight: bold; }
通用選擇器 (*
) 匹配全部元素。儘管每次都能很方便的選擇一組元素,但若是將其做爲選擇器的核心部分(選擇器位置的最右側) 則會形成性能問題。舉個例子,以下的規則形式應該避免使用:
.mybox * { background: #fff; color: #000; background: rgba(255, 255, 255, 0.5); }
遊覽器按照從右至左的順序解析選擇器,所以這個規則將首先匹配文檔中的全部元素。而後,逐一檢測這些元素是否匹配下級規則,便是否擁有祖先樣式mybox
。若是包涵 *
的選擇器越複雜,其解析的時間越久。正是由於此緣由,推薦在使用 通用選擇器時,避免將其放置選擇器的最右側。
規則 ID: universal-selector
此規則意在 標示出 由於使用通用選擇器而引發緩慢的樣式規則。所以,在發現通用選擇器 出如今 選擇器的最右側時 提示警告。
如下示例提示警告:
* { color: red; } .selected * { color: red; }
如下示例 不提示警告:
/* universal selector is not key */ .selected * a { color: red; }
未定義屬性選擇器,如 [type=text]
,首先匹配全部元素,而後檢查各屬性。這意味着 未定義選擇器 和 通用選擇器(*
)同樣都有着相同性能特色。和通用選擇器類似,未定義屬性選擇器做爲 選擇器的核心部分(選擇器最右側)時,會形成性能問題。舉個例子,以下規則定義 應當避免使用:
.mybox [type=text] { background: #fff; color: #000; background: rgba(255, 255, 255, 0.5); }
遊覽器以 從右至左的方式解析選擇器,於是,此規則首先匹配文檔中的全部元素,而後逐一檢查對應屬性。以後,再檢查這些元素是否匹配下一級條件,便是否有祖先樣式類 mybox
。包涵未定義屬性選擇器的規則越複雜,判斷的時間開銷越久。正因如此,在使用 未定義屬性選擇器時,應避免將其放置最右側。
規則 ID: unqualified-attributes
此規則意在 標示出 因使用未定義屬性選擇器而形成解析緩慢的規則。所以,在未定義屬性選擇器出如今規則最右側時,提示警告。
如下示例提示警告:
[type=text] { color: red; } .selected [type=text] { color: red; }
如下示例 不提示警告:
/* unqualified attribute selector is not key */ .selected [type=text] a { color: red; }
遊覽器前綴屬性是 各遊覽器提供商在標準樣式還未建成時,提供實驗性 新增CSS功能,而建立的。其容許開發者和遊覽器提供商在以後 新增屬性還未肯定定稿時,發現潛在的缺陷和跨遊覽器兼容性問題。標準版屬性一般(但也不老是)與遊覽器前綴版,有着相同的名字和語構,若是有兩種或以上相同的遊覽器前綴屬性 語構類似,則標準版屬性與其語構保持一致。
當使用遊覽器前綴屬性 如-moz-border-radius
,你應當同時編寫標準屬性,以保障從此的兼容性。標準屬性編寫應在 遊覽器前綴屬性以後,以確保 標準屬性能被遊覽器識別使用到,以下:
.mybox { -moz-border-radius: 5px; border-radius: 5px; }
將標準屬性放置遊覽器前綴屬性以後 是確保一旦標準屬性徹底實行時,你的CSS代碼能正常運轉的最好方式(接着,你就可找個喝茶的時間,把以往的遊覽器前綴屬性給刪除)。
規則 ID: vendor-prefix
此規則意在確保 不論什麼時候使用遊覽器前綴屬性時,與其匹配的標準屬性均同時編碼。所以,規則在如下條件時,提示警告:
如下示例 提示警告:
/* missing standard property */ .mybox { -moz-border-radius: 5px; } /* standard property should come after vendor-prefixed property */ .mybox { border-radius: 5px; -webkit-border-radius: 5px; }
如下示例 不提示警告:
/* both vendor-prefix and standard property */ .mybox { -moz-border-radius: 5px; border-radius: 5px; }
在任何場景下,不管是長度單位仍是百分比,使用 0
值而不指定單位,都是容許且正常運行的。在 0px
,0em
,0%
,或其它 0值單位之間,均無任何差異。單位在這裏並不重要,由於值自己 都會是 零。CSS容許我們省略 零值的單位,並依舊視爲合法的CSS。
推薦 移除全部長度爲 零後面的單位;由於在遊覽器中規定的單位並不會起效,因此在安心移除的同時,還減少了文件體積。
規則 ID: zero-units
此規則意在 標示出 長度爲零 且帶有單位的情形。所以,在發現 0
後跟隨了單位或百分比時,提示警告。
如下示例 提示警告:
.mybox { margin: 0px; } .mybox { width: 0%; } .mybox { padding: 10px 0px; }
如下示例 不提示警告:
.mybox { margin: 0; } .mybox { padding: 10px 0; }