【譯】使用這些 CSS 屬性選擇器來提高前端開發效率!

前端小智發表於2019-05-07

譯者:前端小智

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

屬性選擇器非常神奇。它們可以使你擺脫棘手的問題,幫助你避免新增類,並指出程式碼中的一些問題。但是不要擔心,雖然屬性選擇器非常複雜和強大,但是它們很容易學習和使用。在本文中,我們將討論它們是如何執行的,並給出一些如何使用它們的想法。

通常將 HTML 屬性放在方括號中,稱為屬性選擇器,如下:

[href] {
   color: red;
}
複製程式碼

這樣任何具有href屬性的且沒有更特定選擇器的元素的文字顏色都會是紅色的。屬性選擇器的特性與類相同。

:更多關於籠匹配的CSS特異性,你可以閱讀CSS特性:你應該知道的事情,或者如果你喜歡星球大戰:CSS特性戰爭

但是你可以使用屬性選擇器做得更多。就像你的 DNA 一樣,它們有內在的邏輯來幫助你選擇各種屬性組合和值。它們可以匹配屬性中的任何屬性,甚至字串值,而不是像標籤、類或id選擇器那樣精確匹配。

屬性選擇器

屬性選擇器可以獨立存在,更具體地說,如果需要選擇所有具有title屬性的div標籤,可以這麼做:

div[title]
複製程式碼

但你也可以通過以下操作選擇具有 title 屬性的 div 的子元素

div [title]
複製程式碼

需要說明的是,它們之間沒有空格意味著屬性位於相同的元素上(就像元素和類之間沒有空格一樣),而它們之間的空格意味著後代選擇器,即選擇具有該屬性的元素的子元素。

你可以更精細地選擇具體屬性值的屬性。

div[title="dna"]
複製程式碼

上面選擇了所有具有確切名稱dna的div,雖然有選擇器演算法可以處理每種情況(以及更多),但這裡不會選擇**“dna is awesome”“dnamutation”**的標題。

注意:在大多數情況下,屬性選擇器中不需要引號,但是我使用它們,因為我相信它可以提高清程式碼的可讀性,並確保邊界用例能夠正常工作。

如果你想選擇 title 包含 dna的元素,如 “my beautiful dna” 或者 “mutating dna is fun!” ,可以使用波浪號(~)。

div[title~="dna"]
複製程式碼

如果你想匹配以 dna 結尾的 title,如  “dontblamemeblamemydna” 或 “his-stupidity-is-from-upbringing-not-dna” ,剛可以使用$標誌符:

[title$="dna"]
複製程式碼

如果你想匹配以 dna 開頭的 title,如  “dnamutants” 或 “dna-splicing-for-all” ,剛可以使用^標誌符:

[title^="dna"]
複製程式碼

雖然精確匹配是有幫助的,但它可能選擇太緊,並且^符號匹配可能太寬而無法滿足你的需要。 例如,可能不想選擇 “genealogy” 的標題,但仍然選擇“gene”和“gene-data”。 管道特徵(|)就是這樣,屬性中必須是完整且唯一的單詞,或者以-分隔開。

[title|="gene"]
複製程式碼

最後,還有一個匹配任何子字串的模糊搜尋屬性操作符,屬性中做字串拆分,只要能拆出來dna這個詞就行:

[title*="dna"]
複製程式碼

使這些屬性選擇器更加強大的是,它們是可堆疊的,允許你選擇具有多個匹配因子的元素。

如果你需要找到一個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;
}
複製程式碼

上面的程式碼在滑鼠懸停時將顯示一串自定義的字串。

最後要知道的是,您可以新增一個標誌,讓屬性搜尋不區分大小寫。 在結束方括號之前新增i

[title*="DNA" i]
複製程式碼

因此它會匹配dna, DNA, dnA等。

現在我們已經看到了如何使用屬性選擇器進行選擇,讓我們看看一些用例。 我將它們分為兩類:一般用途診斷

一般用途

####輸入型別樣式的設定

你可以對輸入型別使用不同的樣式,例如電子郵件和電話。

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 給我們的一個屬性是“下載”,它告訴瀏覽器,你猜對了,下載該檔案而不是試圖開啟它。這對於你希望人們訪問但不希望它們立即開啟的 PDFDOC 非常有用。它還使得連續下載大量檔案的工作流程更加容易。下載屬性的缺點是沒有預設的視覺效果將其與更傳統的連結區分開來。通常這是你想要的,但如果不是,你可以做類似下面的事情:

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;
}
複製程式碼

重寫特定的內聯樣式

有時候你會遇到一些內聯樣式,這些樣式會影響佈局,但這些內聯樣式我們又沒修改。那麼以下是一種方法。

如果你道要覆蓋的確切屬性和值,並且希望在它出現的任何地方覆蓋它,那麼這種方法的效果最好。

對於此示例,元素的邊距以畫素為單位設定,但需要在 em 中進行擴充套件和設定,以便在使用者更改預設字型大小時可以正確地重新調整元素。

<div style="color: #222222; margin: 8px; background-color: #EFEFEF;"Teenage Mutant Ninja Myrtle</div>

div[style*="margin: 8px"] {
   margin: 1em !important;
}
複製程式碼

顯示檔案型別

預設情況下,檔案輸入的可接受檔案列表是不可見的。 通常,我們使用偽元素來暴露它們:

<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[open] {
   background-color: hotpink;
}
複製程式碼

列印連結

在列印樣式中顯示URL使我走上了理解屬性選擇器的道路。 你現在應該知道如何自己構建它, 你只需選擇帶有href的所有標籤,新增偽元素,然後使用attr()content列印它們。

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;
}
複製程式碼

便捷鍵

web 的一大優點是它提供了許多不同的資訊訪問選項。一個很少使用的屬性是設定accesskey的能力,這樣就可以通過鍵組合和accesskey設定的字母直接訪問該專案(確切的鍵組合取決於瀏覽器)。但是要想知道網站上設定了哪些鍵並不是件容易的事

下面的程式碼將顯示這些鍵:focus。我不使用滑鼠懸停,因為大多數時候需要accesskey的人是那些使用滑鼠有困難的人。你可以將其新增為第二個選項,但要確保它不是惟一的選項。

a[accesskey]:focus:after {
   content: " AccessKey: " attr(accesskey);
}
複製程式碼

診斷

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

沒有 controls 屬性的 audio

我不經常使用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 檔案

網頁可以是內容管理系統和外掛,框架和程式碼的集合,確定哪些JavaScript非同步載入以及哪些不載入可以幫助你專注於提高頁面效能。

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

JavaScript 事件元素

你可以突出顯示具有JavaScript事件屬性的元素,以便將它們重構到JavaScript檔案中。這裡我主要關注OnMouseOver屬性,但是它適用於任何JavaScript事件屬性。

[OnMouseOver] {
   color: burlywood;
}
[OnMouseOver]:after {
   content: "JS: " attr(OnMouseOver);
}
複製程式碼

隱藏項

如果需要檢視隱藏元素或隱藏輸入的位置,可以使用它們來顯示

[hidden], [type="hidden"] {
  display: block;
}
複製程式碼

你的點贊是我持續分享好東西的動力,歡迎點贊!

歡迎加入前端大家庭,裡面會經常分享一些技術資源。

clipboard.png

相關文章