【譯】用CSS屬性選擇器來拼接HTML的DNA

原文連接:www.smashingmagazine.com/2018/10/att…css

CSS屬性選擇器很是神奇,它們能夠幫你避免添加數不勝數的類名,從另外一方面來指出你代碼裏的一些問題。可是你們不用慌,雖然屬性選擇器複雜且強大,可是很易於學習和使用。在這篇文章,咱們將討論它們是如何運行起來的,再教你們一些使用方面的技巧。html

通常咱們最廣泛的使用方法是將HTML屬性放進一個方括號中,稱之爲屬性選擇器。例如:web

[href] {
    color: chartreuse;
}
複製代碼

任何具備href屬性且沒有更具體的選擇器的html元素如今都會變成黃綠色。屬性選擇器的特性和類選擇器一致瀏覽器

可是你可使用屬性選擇器作更多的事情。就像你的DNA同樣,它們具備嵌入式的邏輯,可幫助您選擇各類屬性組合和值。 它們不只能夠精確的匹配標籤,類或id選擇器,並且能夠匹配屬性中的任何屬性甚至字符串值。安全

屬性選擇

屬性選擇器能夠獨立存在或更具體一點,好比咱們須要選擇具備title屬性的全部div標籤。app

div[title]
複製代碼

也能夠經過下面操做來選擇具備title屬性的div的子元素:框架

div [title]
複製代碼

須要明確的是,中間的空格表明着是後臺選擇器,即選擇具備該屬性的元素的子元素。咱們也能夠更精確一點,來選擇想要的屬性值:異步

div[title="dna"]
複製代碼

大多數狀況下,屬性選擇器不須要引號,但我會使用它們,由於我相信它能夠提供可讀性並確保具備良好的兼容性async

若是你想從通過空格分割後的列表裏選擇具備"dna"字符的屬性值,好比「my beautiful dna」或「mutating dna is fun!」,能夠在等號前添加一個波浪號`~`:ide

div[title~="dna"]
複製代碼

您能夠選擇「dontblamemeblamemydna」或「his-stupidity-is-from-upbringing-not-dna」之類的標題,而後使用美圓符號`$`來匹配title的結尾:

[title$="dna"]
複製代碼

要匹配屬性值的前面,例如「dnamutants」或「dna-splicing-for-all」的標題,就用插入符號`^`。

[title^="dna"]
複製代碼

若是你想徹底匹配一個值開頭的完整單詞,可使用管道符來作。好比你不想選擇一個「genealogy」的title,但仍然想選擇「gene」和「gene-data」:

[title|="gene"]
複製代碼

還有一個匹配任何子字符串的模糊搜索屬性運算符`*`:

[title*="dna"]
複製代碼

最後要知道的是,您能夠添加一個標誌,讓屬性搜索不區分大小寫。 在結束方括號以前添加`i`:

[title*="DNA" i]
複製代碼

使這些屬性選擇器更增強大的緣由是它們是可堆疊的 —— 容許您選擇具備多個匹配因子的元素。

好比你須要找到a標籤,它有一個title屬性,而且有一個以「genes」結尾的class類,該如何寫呢?

a[title][class$="genes"]
複製代碼

咱們不只能夠選擇HTML元素的屬性,還可使用僞「科學」(即僞元素和內容聲明)來打印出文本:

<span class="joke" title="Gene Editing!">What’s the first thing a biotech journalist does after finishing the first draft of an article?</span>
複製代碼
.joke:hover:after {
   content: "Answer:" attr(title);
   display: block;
}
複製代碼

上面的代碼在鼠標懸停時將顯示一串自定義的字符串。

如今咱們已經看到了如何使用屬性選擇器進行選擇,讓咱們看看一些用例。我把它們分爲兩類:通常使用技巧診斷

通常使用技巧

輸入類型的設置

您能夠不一樣地設置輸入類型,例如電子郵件與電話:

input[type="email"] {
   color: papayawhip;
}
input[type="tel"] {
   color: thistle;
}
複製代碼

顯示手機號碼連接

您能夠隱藏特定尺寸的電話號碼並顯示電話連接,以便在電話上輕鬆撥打電話:

span.phone {
   display: none;
}
a[href^="tel"] {
   display: block;
}
複製代碼

內部連接vs外部連接,安全連接vs非安全連接

您能夠區別對待內部和外部連接,並將安全連接設置爲與不安全連接不一樣:

a[href^="http"]{
   color: bisque;
}
a:not([href^="http"]) {
  color: darksalmon;
}
 
a[href^="http://"]:after {
   content: url(unlock-icon.svg);
}
a[href^="https://"]:after {
   content: url(lock-icon.svg);
}
複製代碼

下載圖標

HTML5給咱們的一個屬性是「下載」,它告訴瀏覽器,你猜對了,下載該文件而不是試圖打開它。這對於您但願人們訪問但不但願它們當即打開的PDF和DOC很是有用。它還使得連續下載大量文件的工做流程更加容易。下載屬性的缺點是沒有默認的視覺效果將其與更傳統的連接區分開來。一般這是你想要的,但若是不是,你能夠作相似下面的事情:

a[download]:after { 
   content: url(download-arrow.svg);
}
複製代碼

您還可使用不一樣的圖標(如PDF與DOCX與ODF等)來傳達文件類型:

a[href$="pdf"]:after {
   content: url(pdf-icon.svg);
}
a[href$="docx"]:after {
   content: url(docx-icon.svg);
}
a[href$="odf"]:after {
   content: url(open-office-icon.svg);
}
複製代碼

您還能夠經過堆疊屬性選擇器確保這些圖標僅在可下載連接上:

a[download][href$="pdf"]:after {
   content: url(pdf-icon.svg);
}
複製代碼

覆蓋或從新使用已廢棄/棄用的代碼

咱們都遇到了過期代碼的舊網站,在HTML5以前,您可能須要覆蓋甚至從新應用做爲屬性實現的樣式:

<div bgcolor="#000000" color="#FFFFFF">Old, holey genes</div>
 
div[bgcolor="#000000"] { /*override*/
   background-color: #222222 !important;
}
div[color="#FFFFFF"] { /*reapply*/
   color: #FFFFFF;
}
複製代碼

顯示文件類型

默認狀況下,文件類型輸入標籤的可接受文件列表是不可見的。一般,咱們使用僞元素來公開它們,雖然你不能在大多數輸入標籤上(或者在Firefox或Edge中)使用僞元素,可是你能夠在文件輸入上使用它們:

<input type="file" accept="pdf,doc,docx">
 
[accept]:after {
   content: "Acceptable file types: " attr(accept);
}
複製代碼

html手風琴菜單

detailssummary標籤是一種只用HTML作擴展/手風琴菜單的方法,details包括了summary標籤和手風琴打開時要展現的內容。點擊summary會展開details標籤並添加open屬性,咱們能夠經過open屬性輕鬆地爲打開的details標籤設置樣式:

<details>
  <summary>List of Genes</summary>
    Roddenberry
    Hackman
    Wilder
    Kelly
    Luen Yang
    Simmons
</details>
複製代碼
details[open] {
   background-color: hotpink;
}
複製代碼

打印連接

a[href]:after {
   content: " (" attr(href) ") ";
}
複製代碼

自定義工具

使用屬性選擇器建立自定義工具提示既有趣又簡單:

[title] {
  position: relative;
  display: block;
}
[title]:hover:after {
  content: attr(title);
  color: hotpink;
  background-color: slateblue;
  display: block;
  padding: .225em .35em;
  position: absolute;
  right: -5px;
  bottom: -5px;
}
複製代碼

診斷

這些選項用於幫助咱們在構建過程當中或在嘗試修復問題時在本地識別問題。將這些內容放在咱們的生產網站上會使用戶產生錯誤。

沒有controls屬性的audio

我不常用音頻標籤,可是當我使用它時,我常常忘記包含controls屬性。 結果:沒有顯示任何內容。若是您在Firefox中工做,若是您隱藏了音頻元素,或者語法或其餘一些問題阻止它出現(僅適用於Firefox),此代碼能夠幫助您解決問題:

audio:not([controls]) {
  width: 100px;
  height: 20px;
  background-color: chartreuse;
  display: block;
}
複製代碼

沒有alt替代文字

沒有alt屬性的圖片是可訪問性的噩夢,只需查看頁面就很難找到它們,但若是添加它們,它們就會彈出來(當頁面圖片加載失敗時,alt文字能夠更好的解釋圖片的做用):

img:not([alt]) { /* no alt attribute */ 
  outline: 2em solid chartreuse; 
}
img[alt=""] { /* alt attribute is blank */ 
  outline: 2em solid cadetblue; 
}
複製代碼

異步Javascript文件

web頁面能夠是內容管理系統和插件,框架和代碼的集合,Ted 在度假時寫道,肯定哪些JavaScript異步加載以及哪些不加載能夠幫助您專一於提升頁面性能:

script[src]:not([async]) {
  display: block;
  width: 100%;
  height: 1em;
  background-color: red;
}
script:after {
  content: attr(src);
}
複製代碼

Javascript事件

您還能夠突出顯示具備JavaScript事件屬性的元素,我在這裏舉例OnMouseOver屬性,但它適用於任何JavaScript事件屬性:

[OnMouseOver] {
   color: burlywood;
}
[OnMouseOver]:after {
   content: "JS: " attr(OnMouseOver);
}
複製代碼
相關文章
相關標籤/搜索