摘要:如果頁(yè)面上的鏈接很多或者對(duì)跳轉(zhuǎn)頁(yè)面的協(xié)議有要求,使用屬性選擇器配合偽元素對(duì)鏈接的協(xié)議進(jìn)行提示也不失為一種好方法。
CSS 屬性選擇器,可以通過(guò)已經(jīng)存在的屬性名或?qū)傩灾灯ヅ湓亍?/p>
屬性選擇器是在 CSS2 中引入的并且在 CSS3 中得到了很好拓展。本文將會(huì)比較全面的介紹屬性選擇器,盡可能的去挖掘這個(gè)選擇器在不同場(chǎng)景下的不同用法。
簡(jiǎn)單的語(yǔ)法介紹[attr]:該選擇器選擇包含 attr 屬性的所有元素,不論 attr 的值為何。
[attr=val]:該選擇器僅選擇 attr 屬性被賦值為 val 的所有元素。
[attr~=val]:該選擇器僅選擇具有 attr 屬性的元素,而且要求 val 值是 attr 值包含的被空格分隔的取值列表里中的一個(gè)。
子串值(Substring value)屬性選擇器,下面幾個(gè)屬于 CSS3 新增語(yǔ)法,也被稱為“偽正則選擇器”,因?yàn)樗鼈兲峁╊愃?regular expression 的靈活匹配方式。
[attr|=val] : 選擇attr屬性的值是 val 或值以 val- 開(kāi)頭的元素(注意,這里的 “-” 不是一個(gè)錯(cuò)誤,這是用來(lái)處理語(yǔ)言編碼的)。
[attr^=val] : 選擇attr屬性的值以 val 開(kāi)頭(包括 val)的元素。
[attr$=val] : 選擇attr屬性的值以 val 結(jié)尾(包括 val)的元素。
[attr*=val] : 選擇attr屬性的值中包含子字符串 val 的元素(一個(gè)子字符串就是一個(gè)字符串的一部分而已,例如,”cat“ 是 字符串 ”caterpillar“ 的子字符串
CSS 屬性選擇器的最基本用法屬性選擇器最基本的用法,就是通過(guò)元素的屬性值去選擇 DOM 元素。像這樣,將選中所有帶 href 屬性的DOM 元素:
[href] { color: red; }
CodePen Demo -- 屬性選擇器基本用法
復(fù)雜一點(diǎn)點(diǎn)的用法 層疊選擇div [href]{ ... }多條件復(fù)合選擇
選擇一個(gè) img 標(biāo)簽,它含有 title 屬性,并且包含類名為 logo 的元素。
img[title][class~=logo]{ ... }偽正則寫法
i 參數(shù)
忽略類名的大小寫限制,選擇包含 class 類名包含子字符串為 text,Text,TeXt... 等情況的 p 元素。
這里的 i 的含義就是正則里面參數(shù) i 的含義,ignore,忽略大小寫的意思。
p[class*="text" i] { ... }
所以上面的選擇器可以選中類似這樣的目標(biāo)元素:
g 參數(shù)
與正則表達(dá)式不一樣,參數(shù) g 在這里表示大小寫敏感(case-sensitively)。然而,這個(gè)屬性當(dāng)前仍未納入標(biāo)準(zhǔn),支持的瀏覽器不多。
CodePen Demo -- 屬性選擇器的偽正則用法
配合 :not() 偽類還有一種比較常用的場(chǎng)景就是搭配:not() 偽類,完成一些判斷檢測(cè)性的功能。譬如下面這個(gè)選擇器,就可以選取所有沒(méi)有 [href] 屬性的 a 標(biāo)簽,添加一個(gè)紅色邊框。
a:not([href]){ border: 1px solid red; }
當(dāng)然,復(fù)雜一點(diǎn),我們可以搭配不僅僅一個(gè) :not()偽類,像是這樣,可以同時(shí)多個(gè)配合使用,選擇一個(gè) href, target, rel 屬性都沒(méi)有的 a 標(biāo)簽:
a:not([href]):not([target]):not([rel]){ border: 1px solid blue; }
CodePen Demo -- 屬性選擇器配合 :not 偽類
重寫行內(nèi)樣式?甚至乎,如果有這種場(chǎng)景,我們還可以覆蓋掉行內(nèi)樣式,像這樣:
xxxxxx
我們可以使用屬性選擇器強(qiáng)制覆蓋掉上述樣式:
[style*="color: red"] { color: blue !important; }組合拳用法,搭配偽元素提升用戶體驗(yàn)
當(dāng)然,屬性選擇器不一定只是單單的進(jìn)行標(biāo)簽的選擇。
配合上偽元素,我們可以實(shí)現(xiàn)很多有助提升用戶體驗(yàn)的功能。
角標(biāo)功能這里有一個(gè)小知識(shí)點(diǎn),偽元素的 content 屬性,通過(guò) attr(xxx),可以讀取到對(duì)應(yīng) DOM 元素標(biāo)簽名為 xxx 的屬性的值。
所以,配合屬性選擇器,我們可以很容易的實(shí)現(xiàn)一些角標(biāo)功能:
Message
div { position: relative; width: 200px; height: 64px; } div::before { content: attr(count); ... }
這里右上角的數(shù)字 5 提示角標(biāo),就是使用屬性選擇器配合偽元素實(shí)現(xiàn),可以適應(yīng)各種長(zhǎng)度,以及中英文,能夠節(jié)省一些標(biāo)簽。CodePen Demo -- 屬性選擇器實(shí)現(xiàn)角標(biāo)功能
屬性選擇器配合偽元素實(shí)現(xiàn)類 title 功能我們都知道,如果給一個(gè)圖片添加一個(gè) title 屬性,當(dāng) hover 到圖片上面的時(shí),會(huì)展示 title 屬性里面附加的內(nèi)容,類似這樣:
這里不一定是 img 標(biāo)簽,其他標(biāo)簽添加 title 屬性都能有類似的效果。但是這里會(huì)有兩個(gè)問(wèn)題:
響應(yīng)太慢,通常鼠標(biāo) hover 上去要隔 1s 左右才會(huì)出現(xiàn)這個(gè) title 框
框體結(jié)構(gòu)無(wú)法自定義,彈出框的樣式無(wú)法自定義
所以這里,如果我們希望有一些自己能夠控制樣式的可快速響應(yīng)的浮層,可以自定義一個(gè)類 title 屬性,我們把它稱作 popTitle,那么可以這樣操作:
這是一段描述性文字
這是一段描述性文字
p[popTitle]:hover::before { content: attr(popTitle); position: absolute; color: red; border: 1px solid #000; ... }
對(duì)比一下,第一個(gè)是原生自帶的 title 屬性,下面兩個(gè)是使用屬性選擇器配合偽元素模擬的提示:
瀏覽器自帶的 title 屬性延遲響應(yīng)是添加一層防抖保護(hù),避免頻繁觸發(fā),這里也可以通過(guò)對(duì)偽元素添加一個(gè)100毫秒級(jí)的 transition-delay 實(shí)現(xiàn)延遲展示。
CodePen Demo -- 屬性選擇器配合偽元素實(shí)現(xiàn)類 title 功能
商品展示提示效果好,上面的運(yùn)用實(shí)例我們?cè)偻卣挂幌拢紤]如何更好的運(yùn)用到實(shí)際業(yè)務(wù)中,其實(shí)也是有很多用武之地的。譬如說(shuō),通過(guò)屬性選擇器給圖片添加標(biāo)簽,類似一些電商網(wǎng)站會(huì)用到的一個(gè)效果。
我們希望給圖片添加一些標(biāo)簽,在 hover 圖片的時(shí)候展示出來(lái)。
當(dāng)然,CSS 中,諸如 、、,這幾個(gè)標(biāo)簽是不支持偽元素的。
所以這里我們輸出 DOM 的時(shí)候,給 img 的父元素帶上部分圖片描述標(biāo)簽。通過(guò) CSS 去控制這些標(biāo)簽的展示:
[desc1]::before, [desc2]::after { position: absolute; opacity: 0; } [desc1]::before { content: attr(desc1); } [desc2]::after { content: attr(desc2); } [desc1]:hover::before, [desc2]:hover::after{ opacity: 1; }
看看效果:
CodePen Demo -- 通過(guò)屬性選擇器給圖片添加標(biāo)簽
屬性選擇器配合偽元素實(shí)現(xiàn)下載提示我們知道,HTML5 對(duì)標(biāo)簽新增了一個(gè) download 屬性,此屬性指示瀏覽器下載 URL 而不是導(dǎo)航到它。
那么,我們可以利用屬性選擇器對(duì)所有帶此類標(biāo)簽的元素進(jìn)行提示。像這樣:
logo
[download] { position: relative; color: hotpink; } [download]:hover::before { content: "點(diǎn)擊可下載此資源!"; position: absolute; ... }
當(dāng)我們 hover 到這個(gè)鏈接的時(shí)候,就會(huì)這樣,提示用戶,這是一個(gè)可以下載的按鈕:
CodePen Demo -- 屬性選擇器配合偽元素做下載提示
屬性選擇器配合偽元素對(duì)鏈接的協(xié)議進(jìn)行提示(http/https)現(xiàn)在大部分網(wǎng)站不是切了 https 就是走在切 https 的路上。如果頁(yè)面上的鏈接很多或者對(duì)跳轉(zhuǎn)頁(yè)面的協(xié)議有要求,使用屬性選擇器配合偽元素對(duì)鏈接的協(xié)議進(jìn)行提示也不失為一種好方法。
a[href^="http:"]:hover::before { content: "這是一個(gè)http鏈接"; ... } a[href^="https:"]:hover::before { content: "這是一個(gè)https鏈接"; }
CodePen Demo -- 屬性選擇器配合偽元素對(duì)鏈接的協(xié)議進(jìn)行提示(http/https)
當(dāng)然,偽元素的內(nèi)容不一定是純文字的,為了給用戶更好的體驗(yàn),圖或者圖片加文字也是可以的。
譬如我們可以形象化地給 https 鏈接站點(diǎn)再加一個(gè)小綠鎖,符合用戶的一些常規(guī)認(rèn)知。
這里我將小綠鎖的圖片使用 base64 嵌入到偽元素當(dāng)中,簡(jiǎn)單的使用 text-indent 控制圖文的排布:
a[href^="https:"]:hover::before { content: ""; padding-left: 16px; background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAYAAABWdVznAAAACXBIWXMAAA7EAAAOxAGVKw4bAAAAb0lEQVQoz2NkQAJc5aIc//7962VgYIiDCi1iYmIq/tb5+gdMDROyBqhiGWYmJlVmJiZVBgYGGagYdsBRKvyZu1xUAsbnLheV4CgV/oxbQ4nwf0JiTAwkAkaIU4QaGf4z1uFX+b/pR/e7epJtGJEaAKDXHzEJ3KYmAAAAAElFTkSuQmCC"); ... }
這里只是一個(gè)非常小的 Demo,實(shí)際情況是大部分用戶并不了解這個(gè)小綠鎖的含義,所以實(shí)際使用應(yīng)該搭配文字輔助提示。
CodePen Demo -- 屬性選擇器配合偽元素對(duì)https協(xié)議進(jìn)行圖文提示
屬性選擇器對(duì)文件類型的處理也可以對(duì)一些可下載資源進(jìn)行視覺(jué)上 icon 的提示。
a[href$=".doc" i]::before { content: "doc"; background: #a9c4f5; } a[href$=".ppt" i]::before { content: "ppt"; background: #f8e94f; } a[href$=".pdf" i]::before { content: "pdf"; background: #fb807a; } a[href$=".mp3" i]::before { content: "mp3"; background: #cb5cf5; } a[href$=".avi" i]::before { content: "avi"; background: #5f8ffc; }
CodePen Demo -- 屬性選擇器選擇文件名后綴
屬性選擇器對(duì) input 類型的處理屬性選擇器其實(shí)對(duì) input 類型的元素是一個(gè)很好的幫手,因?yàn)?input 常用,且經(jīng)常搭配很多不同功能的屬性值。
只不過(guò),由于 input 類型無(wú)法添加偽元素。所以搭配屬性選擇器更多的通過(guò)屬性的各種狀態(tài)改變自身的樣式。
簡(jiǎn)單舉個(gè)例子,譬如:
input[type=text][disabled] { border: 1px solid #aaa; background: #ccc; }
這里,我們選擇了 type=text 并且擁有 disabled 屬性的 input 元素,將它的背景色和邊框色設(shè)置為灰色。給與用戶更好的視覺(jué)提示。
值得注意的點(diǎn) 注意選擇器優(yōu)先級(jí) ,.class 與 [class=xxx] 是否等價(jià)考慮這個(gè)問(wèn)題,下面兩個(gè)選擇器是否等值?
.header { color: red; } [class~="header"] { color: blue; }上述兩個(gè)選擇器,作用完全一致。然而,如果是下面這種情況,兩者就不一樣了:
#header{ color: red; } [id="header"] { color: blue; }這里,ID 選擇器#header比屬性選擇器[id="header"]的權(quán)重更高,雖然兩者能夠選擇同樣的元素,但是兩者并不完全等價(jià)。
是否需要引號(hào)?考慮下面三種情況,是否一致?
[class="header"]{ ... } [class="header"]{ ... } [class=header]{ ... }事實(shí)上,從 HTML2 開(kāi)始,不添加引號(hào)的寫法就已經(jīng)得到支持,所以上述三種寫法都是正確的。
然而,能夠不使用引號(hào)也是有限制的,再看看下面這種寫法:
a[href=bar] { ... } a[href^=http://] {... }第二個(gè)選擇器是個(gè)無(wú)效選擇器,:// 不引起來(lái)的話會(huì)識(shí)別錯(cuò)誤,必須使用引號(hào)引起來(lái)像這樣a[href^="http://"] ,這里具體的原因可以看看這篇文章:Unquoted attribute value validator。
所以保險(xiǎn)起見(jiàn),建議都加上引號(hào)。
CSS 語(yǔ)義化編寫”具有語(yǔ)義的HTML”原則是現(xiàn)代、專業(yè)前端開(kāi)發(fā)的一個(gè)基礎(chǔ)。當(dāng)然,我們經(jīng)常談?wù)摰降亩际?HTML 語(yǔ)義化。
那么,CSS 需要語(yǔ)義化嗎?CSS 有語(yǔ)義化嗎?例如上述的例子,使用特定的類名或者 id 選擇器皆可完成。那么使用屬性選擇器的理由是什么?
我的理解是,屬性(attribute)本身已經(jīng)具有一定的語(yǔ)義,表達(dá)了元素的某些特征或者功能,利用屬性選取元素再進(jìn)行對(duì)該屬性值的特定操作,一定程度上也可以輔助提升代碼的語(yǔ)義化。至少的提升了 CSS 代碼的可讀性。但是 CSS 是否需要語(yǔ)義化這個(gè)問(wèn)題就見(jiàn)仁見(jiàn)智了。
最后這里有幾篇文章還涵蓋了很多其他方面使用,可以對(duì)比觀看:
Semantic CSS With Intelligent Selectors
Splicing HTML’s DNA With CSS Attribute Selectors
更多精彩 CSS 技術(shù)文章匯總在我的 Github -- iCSS ,持續(xù)更新,歡迎點(diǎn)個(gè) star 訂閱收藏。
好了,本文到此結(jié)束,希望對(duì)你有幫助 :)
如果還有什么疑問(wèn)或者建議,可以多多交流,原創(chuàng)文章,文筆有限,才疏學(xué)淺,文中若有不正之處,萬(wàn)望告知。
最后,新開(kāi)通的公眾號(hào)求關(guān)注,形式希望是更短的篇幅,質(zhì)量更高一些的技巧類文章,包括但不局限于 CSS:
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/114870.html
相關(guān)文章
CSS選擇器
摘要:優(yōu)先級(jí)相同,與元素近的選擇器生效。使用建議建議說(shuō)明避免將通用選擇器作為通用選擇器。避免選擇器用標(biāo)簽。避免使用子選擇器。后代選擇器是開(kāi)銷最最最最大的。 看了一下最近寫的css代碼,發(fā)現(xiàn)基本只用到了id選擇器(js里)、后代選擇器和類選擇器(因?yàn)槁?tīng)大牛推薦使用類選擇器,然后就開(kāi)始大篇幅使用。。。)。所以想深入學(xué)習(xí)一下css選擇器和css的效率優(yōu)化,先記錄所學(xué)的一部分,以備后續(xù)補(bǔ)充。 選擇器...
你對(duì)CSS權(quán)重真的足夠了解嗎?
摘要:如果兩個(gè)權(quán)重不同的選擇器作用在同一元素上,權(quán)重值高的規(guī)則生效選擇器可能會(huì)包含一個(gè)或者多個(gè)與權(quán)重相關(guān)的計(jì)算點(diǎn),若經(jīng)過(guò)權(quán)重值計(jì)算得到的權(quán)重值越大,則認(rèn)為這個(gè)選擇器的權(quán)重高。 前言 css權(quán)重很多人都聽(tīng)過(guò),也了解一些,但是很多人對(duì)具體的規(guī)則或者說(shuō)再深如一些關(guān)于css權(quán)重的問(wèn)題,可能會(huì)不那么清楚。日常開(kāi)發(fā)中,或多或少都會(huì)遇到css規(guī)則不生效的問(wèn)題,為了讓我們能夠減少調(diào)試css規(guī)則的時(shí)間,深刻理...
瀏覽器顯示及交互背后的原理
摘要:瀏覽器顯示及交互背后的原理引子因?yàn)楣P者愛(ài)編程的光頭強(qiáng)近期在寫一本關(guān)于小程序入門的書籍。不基于瀏覽器背后的運(yùn)行原理,是很難說(shuō)清楚虛擬被引入的真正原因和最大好處的。它是瀏覽器的核心部分。 瀏覽器顯示及交互背后的原理 引子 因?yàn)楣P者(愛(ài)編程的光頭強(qiáng))近期在寫一本關(guān)于小程序入門的書籍。其中有一章是介紹虛擬DOM的,它是位于Javascript和真正DOM之間的一層緩存層。為什么引入它,為什么它...
瀏覽器顯示及交互背后的原理
摘要:瀏覽器顯示及交互背后的原理引子因?yàn)楣P者愛(ài)編程的光頭強(qiáng)近期在寫一本關(guān)于小程序入門的書籍。不基于瀏覽器背后的運(yùn)行原理,是很難說(shuō)清楚虛擬被引入的真正原因和最大好處的。它是瀏覽器的核心部分。 瀏覽器顯示及交互背后的原理 引子 因?yàn)楣P者(愛(ài)編程的光頭強(qiáng))近期在寫一本關(guān)于小程序入門的書籍。其中有一章是介紹虛擬DOM的,它是位于Javascript和真正DOM之間的一層緩存層。為什么引入它,為什么它...
360前端星學(xué)習(xí)筆記-深入css(2)
摘要:課程一繼承某些元素會(huì)自動(dòng)繼承其父元素的計(jì)算值舉例上述代碼,標(biāo)簽里的就會(huì)繼承父元素的,為。顯示繼承給設(shè)置顯示繼承根元素下所有元素除獨(dú)自設(shè)置如的都是。二初始值當(dāng)向上繼承到頂點(diǎn)還是沒(méi)找到值的話,就需要初始值了。 課程ppt 一、css繼承 1.1 某些元素會(huì)自動(dòng)繼承其父元素的計(jì)算值 舉例: This is a test of inherit. p { color: #666; ...
發(fā)表評(píng)論
0條評(píng)論
閱讀 2620·2021-10-08 10:04
閱讀 2740·2021-09-06 15:02
閱讀 817·2019-08-30 13:50
閱讀 1553·2019-08-30 13:21
閱讀 2592·2019-08-30 11:15
閱讀 2115·2019-08-29 17:19
閱讀 1583·2019-08-26 13:55
閱讀 1264·2019-08-26 10:15