使用特性查詢

特性查詢是條件組規則,用於測試使用者代理是否支援一個或多個 CSS 特性,例如 CSS 屬性和屬性值。特性查詢為 Web 開發者提供了一種方法,可以測試瀏覽器是否支援某個特性,然後根據測試結果提供僅在該條件下執行的 CSS。在本指南中,你將學習如何使用特性查詢實現漸進增強。

特性查詢是使用 CSS at-rule @supports(或 @import at-rules 中的 supports() 函式)建立的。

語法

CSS 特性查詢是 CSS 條件規則模組的一部分,該模組還定義了媒體查詢 @media at-rule。特性查詢的行為類似於媒體查詢。區別在於,媒體查詢是測試 Web 頁面執行環境的某些方面,而特性查詢是測試瀏覽器對 CSS 特性的支援。

特性查詢由 @supports at-rule 及其後的支援條件,或 @import at-rule 宣告中的 supports() 函式和宣告引數組成。

/* `@supports` at-rule */
@supports <support-condition> {
  /* CSS rules to apply */
}

/* `supports()` function */
@import url_to_import supports(<declaration>);

例如,如果使用者代理支援 red 作為 CSS color 屬性的有效值,我們可以應用一組樣式或匯入整個樣式表

css
/* `@supports` at-rule */
@supports (color: red) {
  /* CSS rules to apply */
}

/* `supports()` function */
@import "/css/styles.css" supports(color: red);

再舉一個例子,如果你想檢查瀏覽器是否支援 row-gap 屬性,你可以編寫以下特性查詢。在很多情況下,你使用什麼值並不重要:如果你只是想檢查瀏覽器是否支援此屬性,那麼任何有效值都可以。

html
<div class="box">
  If your browser supports the row-gap property, the border will be dashed and
  text will be red.
</div>
css
body {
  font: 1.2em / 1.5 sans-serif;
}
.box {
  border: 4px solid blue;
  color: blue;
  padding: 1em;
}
@supports (row-gap: 10px) {
  .box {
    border: 4px dashed darkgreen;
    color: red;
  }
}

如果你正在測試特定屬性的新值,屬性-值對的值部分就更重要了。所有瀏覽器都支援 color: red:這可以追溯到 CSS1。然而,CSS 中經常會向屬性新增額外的值,例如相對顏色,這些值可能不受支援。特性查詢可以測試屬性和值對,這意味著我們可以檢測對值的支援。

在上方的 color 屬性示例基礎上,我們在這裡檢查瀏覽器是否支援 color: AccentColor 宣告

css
/* `@supports` at-rule */
@supports (color: AccentColor) {
  /* CSS rules to apply */
}

/* `supports()` function */
@import "/css/styles.css" supports(color: AccentColor);

在這些示例中,我們使用特性查詢來檢查使用者代理是否支援 CSS 屬性的特定值,將單個宣告列在括號內。你可以測試多個屬性值或不支援的情況。

測試不支援某特性

除了詢問瀏覽器是否支援某個特性外,你還可以透過新增 not 關鍵字來測試相反的情況

css
/* `@supports` at-rule with `not` */
@supports not (property: value) {
  /* CSS rules to apply */
}

如果瀏覽器不支援 row-gap,以下示例特性查詢中的 CSS 將會執行。

html
<div class="box">
  If your browser does not support row-gap, the content will be darkgreen with a
  dashed border.
</div>
css
body {
  font: 1.2em / 1.5 sans-serif;
}
.box {
  border: 4px solid blue;
  color: blue;
  padding: 1em;
}
@supports not (row-gap: 10px) {
  .box {
    border: 4px dashed darkgreen;
    color: darkgreen;
  }
}

測試多個特性

你可能需要在特性查詢中測試多個屬性的支援情況。為此,你可以包含一個要測試的特性列表,用 and 關鍵字分隔

css
/* multiple feature `@supports` at-rule */
@supports (property1: value) and (property2: value) {
  /* CSS rules to apply */
}

例如,如果你想要執行的 CSS 需要瀏覽器支援 CSS Shapes 和 CSS Grid,你可以建立一個規則來測試瀏覽器對這兩個特性的支援。以下規則僅在瀏覽器同時支援 shape-outside: circle()display: grid 時才返回 true。

html
<div class="box">
  If your browser supports <code>display: grid</code> and
  <code>shape-outside: circle()</code>, the content will be darkgreen with a
  dashed border.
</div>
css
body {
  font: 1.2em / 1.5 sans-serif;
}
.box {
  border: 4px solid blue;
  color: blue;
  padding: 1em;
}
@supports (display: grid) and (shape-outside: circle()) {
  .box {
    border: 4px dashed darkgreen;
    color: darkgreen;
  }
}

測試多個特性中的至少一個

你還可以使用 or,僅當支援一個或多個宣告時才應用 CSS

css
/* any feature `@supports` at-rule */
@supports (property1: value) or (property2: value) {
  /* CSS rules to apply */
}

如果某個特性帶有供應商字首,這會特別有用,因為你可以測試標準屬性以及任何供應商字首。

html
<div class="box">
  The text and border will be green if your browser supports font smoothing.
</div>
css
body {
  font: 1.2em / 1.5 sans-serif;
}
.box {
  border: 4px solid blue;
  color: blue;
  padding: 1em;
}
@supports (font-smooth: always) or (-webkit-font-smoothing: antialiased) {
  .box {
    border: 4px dashed darkgreen;
    color: darkgreen;
  }
}

其他特性查詢選項

特性查詢不限於屬性-值對。你可以在特性查詢中包含 font-tech()font-format()selector() 函式,以根據使用者代理是否支援指定的字型技術、字型格式或選擇器語法有選擇地應用 CSS。

例如,selector() 函式可以用於為支援帶供應商字首的偽元素的瀏覽器匯入樣式表

css
/* A `selector()` query within a `supports()` function */
@import "/css/webkitShadowStyles.css"
  supports(selector(::-webkit-inner-spin-button));

示例

瀏覽器支援測試

在此示例中,我們檢查瀏覽器是否支援 AccentColor <system-color>,如果支援該顏色型別,則使用 display: none 將預設的“不支援”訊息更改為“已支援”訊息。

HTML

html
<p class="accentcolor">
  Your browser does <span>not</span> support <code>AccentColor</code> as a color
  value.
</p>

CSS

css
body {
  font: 1.2em / 1.5 sans-serif;
}
p {
  padding: 1em;
}
@supports (color: AccentColor) {
  p {
    color: green;
    border: 2px solid;
  }
  span {
    display: none;
  }
}
@supports not (color: AccentColor) {
  p {
    color: red;
  }
}

結果

特性查詢的侷限性

@supports 規則用於測試瀏覽器是否可以解析一個或多個屬性/值對,並因此是否聲稱支援相關特性。如果瀏覽器理解這些屬性/值對,它將返回一個肯定的響應。特性查詢會檢查宣告是否被瀏覽器認為是有效的,但不能用於檢查它是否正確支援某個特性而沒有錯誤或違反規範。特性查詢無法測試部分實現

總結

特性查詢是漸進增強網站的有用工具。它們使你能夠為所有瀏覽器提供一個良好的解決方案,併為支援新屬性和值的瀏覽器提供一個增強的解決方案。

你不需要使用特性查詢才能開始使用新的 CSS 特性;CSS 錯誤處理意味著瀏覽器會簡單地忽略它尚不識別的 CSS。然而,特性查詢是回退宣告的有用替代方案,並且能夠一次編寫程式碼,最終在所有地方都能得到支援。

另見