: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

浏览器兼容性

另见