:open

可用性有限

此特性不是基线特性,因为它在一些最广泛使用的浏览器中不起作用。

:open CSS 伪类表示一个具有打开和关闭状态的元素,但仅当其当前处于打开状态时。

语法

css
:open {
  /* ... */
}

描述

:open 伪类选择任何当前处于打开状态的元素,其中包括以下元素:

请注意,打开和关闭状态是语义状态,不一定与所讨论元素的可见性相关。例如,展开以显示其内容的 <details> 元素是打开的,并且将被 details:open 选择器选中,即使它被 visibility 值为 hidden 隐藏。

弹出式元素(即设置了 popover 属性的元素)具有表示显示或隐藏弹出式窗口的不同语义状态,这些状态可以与打开和关闭状态共存。要定位处于显示状态的弹出式元素,请改用 :popover-open 伪类。

示例

:open 基本用法

此示例演示了一些具有打开状态的 HTML 元素。

CSS

css
details:open > summary {
  background-color: pink;
}

:is(select, input):open {
  background-color: pink;
}

HTML

html
<details>
  <summary>Details</summary>
  Lorem ipsum dolor sit amet, consectetur adipiscing elit. In pulvinar dapibus
  lacus, sit amet finibus lectus mollis eu. Nullam quis orci dictum, porta lacus
  et, cursus nunc. Aenean pulvinar imperdiet neque fermentum facilisis. Nulla
  facilisi. Curabitur vitae sapien ut nunc pulvinar semper vitae vitae nisi.
</details>
<hr />

<label for="pet-select">Choose a pet:</label>
<select id="pet-select">
  <option value="dog">Dog</option>
  <option value="cat">Cat</option>
  <option value="hamster">Hamster</option>
</select>
<hr />

<label for="start">Start date:</label>
<input type="date" id="start" />

结果

使用 :open 进行自定义 <select> 样式

在此示例中,我们为基本的 <select> 元素提供了一些自定义样式。:open 伪类用于在其打开状态(即下拉菜单显示时)应用样式增强。

HTML

我们的水果选择器没有什么特别之处。

html
<label>
  Choose your favorite fruit:
  <select name="fruit">
    <option>apple</option>
    <option>banana</option>
    <option>boysenberry</option>
    <option>cranberry</option>
    <option>fig</option>
    <option>grapefruit</option>
    <option>lemon</option>
    <option>orange</option>
    <option>papaya</option>
    <option>pomegranate</option>
    <option>tomato</option>
  </select>
</label>

注意:我们没有使用多行 <select>(即设置了 multiple 属性的元素)——这些元素通常会渲染为滚动列表框而不是下拉菜单,因此没有打开状态。

CSS

在 CSS 中,我们将 <select> 元素的 appearance 值设置为 none,以移除选择框的默认操作系统样式,并提供一些我们自己的基本样式。最值得注意的是,我们在右侧设置了一个向下箭头的 SVG 背景图像——用户通常通过向下箭头识别 <select> 元素,因此包含它是一个好主意。

然后,我们为周围的 <label> 元素设置一些 padding 和一个透明边框,以便在我们稍后添加彩色边框时保持布局一致。

css
select {
  appearance: none;
  width: 100%;
  display: block;
  font-family: inherit;
  font-size: 100%;
  padding: 5px;
  border: 1px solid black;
  background: url("data:image/svg+xml,%3Csvg width='20' height='20' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg'%3E%3Cpolygon points='5,5 15,5 10,15'/%3E%3C/svg%3E")
    no-repeat right 3px center / 1em 1em;
}

label {
  font-family: sans-serif;
  max-width: 20em;
  display: block;
  padding: 20px;
  border: 2px solid transparent;
}

<select> 打开时,我们使用 :open 伪类设置不同的背景颜色并将背景图像更改为向上箭头。我们还使用 :open:has() 伪类的组合,为包含的 <label> 元素设置不同的背景颜色和边框,以创建父选择器。我们实际上是说“选择 <label>,但仅当其后代 <select> 打开时”。

css
select:open {
  background-color: #f8f2dc;
  background-image: url("data:image/svg+xml,%3Csvg width='20' height='20' viewBox='0 0 20 20' xmlns='http://www.w3.org/2000/svg'%3E%3Cpolygon points='5,15 10,5 15,15'/%3E%3C/svg%3E");
}

label:has(select:open) {
  background-color: #81adc8;
  border-color: #cd4631;
}

结果

结果如下。尝试打开 <select> 下拉菜单以查看对样式的影响

规范

规范
HTML
# selector-open
选择器 Level 4
# selectordef-open

浏览器兼容性

另见