:defined

Baseline 已廣泛支援

此特性已相當成熟,可在許多裝置和瀏覽器版本上使用。自 ⁨2020 年 1 月⁩ 起,所有主流瀏覽器均已支援。

:defined CSS 偽類表示任何已定義的元素。這包括瀏覽器內建的標準元素以及已成功定義的自定義元素(即,透過 CustomElementRegistry.define() 方法定義的元素)。

css
/* Selects any defined element */
:defined {
  font-style: italic;
}

/* Selects any instance of a specific custom element */
custom-element:defined {
  display: block;
}

語法

css
:defined {
  /* ... */
}

示例

在元素定義前隱藏它們

在這個演示中,我們定義了一個名為 <custom-element> 的基本自定義元素,並使用 :not(:defined):defined 選擇器來在元素定義前和定義後對其進行樣式設定。如果你的自定義元素很複雜,載入到頁面需要一段時間,這會很有用——你可能希望在定義完成之前隱藏元素的例項,這樣你就不會在頁面上看到醜陋的未樣式化元素的閃爍。

HTML

以下 HTML 程式碼使用了自定義元素,但該元素尚未定義。我們還包含了一個 <button>,點選它將定義自定義元素,讓你可以在定義前和定義後檢視其狀態。

html
<custom-element>
  <p>
    Loaded content: Lorem ipsum tel sed tellus eiusmod tellus. Aenean. Semper
    dolor sit nisi. Elit porttitor nisi sit vivamus.
  </p>
</custom-element>

<button id="btn">define the <code>&lt;custom-element&gt;</code></button>

CSS

在下面的 CSS 中,我們使用 custom-element:not(:defined) 選擇器來選擇元素並在其未定義時將其著色為灰色,而使用 custom-element:defined 選擇器來選擇元素並在其定義後將其著色為黑色。

css
custom-element:not(:defined) {
  border-color: grey;
  color: grey;
}

custom-element:defined {
  background-color: wheat;
  border-color: black;
  color: black;
}

/* show loading message */
custom-element:not(:defined)::before {
  content: "Loading...";
  position: absolute;
  inset: 0;
  align-content: center;
  text-align: center;
  font-size: 2rem;
  background-color: white;
  border-radius: 1rem;
}

/* remove the loading message */
custom-element:defined::before {
  content: "";
}

我們還使用了 ::before 偽元素來顯示“Loading...”疊加訊息,直到元素被定義。定義後,透過將 content 設定為空字串將其刪除。

以下 JavaScript 已用於定義自定義元素。為了讓您在定義前和定義後檢視自定義元素的狀態,我們會在點選按鈕時執行 define() 方法。

js
const btn = document.querySelector("#btn");

btn.addEventListener("click", () => {
  customElements.define("custom-element", class extends HTMLElement {});
  btn.remove();
});

結果

規範

規範
HTML
# selector-defined
選擇器 Level 4
# defined-pseudo

瀏覽器相容性

另見