【问题标题】:How might I build a negative attribute selector in CSS?如何在 CSS 中构建否定属性选择器?
【发布时间】:2021-07-11 14:25:41
【问题描述】:

我正在尝试(可能有点鲁莽)在 CSS 中重现 Douglas Crockford 所说的底价

什么是底价?

在 Javascript 中,底部值为 undefinednull

我可以采用自定义数据属性:

data-my-custom-attribute=""

我可以给它一个 null 的值(使用 Unicode U+2400):

data-my-custom-attribute="␀"

在 CSS 中,我可以引用任何 null的自定义数据属性:

[data-my-custom-attribute="␀"] {

  [... CSS PROPERTIES HERE...]

}

接下来,我想部署一个等效于这个 Javascript:

if (myCustomAttribute !== null) { ... }

但我似乎不能引用任何不是 null的自定义数据,因为像这个

[data-my-custom-attribute!="␀"] {

  [... CSS PROPERTIES HERE...]

}

不起作用且无效。


已经确定:

  • [data-my-custom-attribute!="␀"]

不行,我突然想到:

  • [data-my-custom-attribute]:not([data-my-custom-attribute="␀"])

实际上确实有效(如果没有其他问题,我会坚持下去)。

工作示例:

div {
  display: inline-block;
  width: 100px;
  height: 100px;
  margin-right: 12px;
}

.rectangle {
  display: block;
  width: 450px;
  height: 60px;
  margin-top: 12px;
  background-color: orange;
}

[data-my-custom-attribute="red"] {
  background-color: red;
}

[data-my-custom-attribute="yellow"] {
  background-color: yellow;
}

[data-my-custom-attribute="blue"] {
  background-color: blue;
}

[data-my-custom-attribute="␀"] {
  border-radius: 0;
  background-color: black;
}

[data-my-custom-attribute]:not([data-my-custom-attribute="␀"]) {
  border-radius: 50%;
}
<div data-my-custom-attribute="red"></div>
<div data-my-custom-attribute="yellow"></div>
<div data-my-custom-attribute="blue"></div>
<div data-my-custom-attribute="␀"></div>

<div class="rectangle"></div>

然而,

[data-my-custom-attribute]:not([data-my-custom-attribute="␀"])

感觉很尴尬和冗长。真的没有比这更好的了吗?

【问题讨论】:

  • 它不会让人觉得尴尬和冗长,它似乎是唯一的解决方案,因为你有两个条件要满足
  • Re: “感觉没那么笨拙和冗长” 我更喜欢[attribute!="value"]而不是[attribute]:not([attribute="value"])
  • 即使第一个存在,您仍然需要attribute 存在的条件,因此它将是[attribute][attribute!="value"],除非您将其定义为仅适用于现有属性
  • [attribute^="value"][attribute*="value"][attribute$="value"] 等情况并非如此。
  • 不一样。要有一个等于某物的属性,它需要存在(你不能有一个不存在的属性等于某物)但不等于适用于不存在的属性,因为如果该属性不存在,那么它肯定不等于那个值。

标签: javascript css null css-selectors


【解决方案1】:

没错。结论。

正如 CSS 中已经存在以下属性选择器:

  • [data-attribute="value"] // data-attribute,其值 value
  • [data-attribute^="value"] // data-attribute,其值开头value
  • [data-attribute*="value"] // data-attribute,其值包含 value
  • [data-attribute$="value"] // data-attribute,其值结尾value

我希望可能有类似的东西:

  • [data-attribute!="value"] // data-attribute,其值不是 value

然后,通过扩展:

  • [data-attribute!^="value"] // data-attribute 并且它的值不是以开头的value
  • [data-attribute!*="value"] // data-attribute,它的值不包含 value
  • [data-attribute!$="value"] // data-attribute 并且它的值不以结尾 value

但是,我们只有:

  • :not([data-attribute="value"]) // 不是 value ORdata-attribute
  • :not([data-attribute^="value"]) // 不是以 value OR 没有 data-attribute
  • :not([data-attribute*="value"]) // 不包含 value 没有 data-attribute
  • :not([data-attribute$="value"]) // 不以结尾 value OR no data-attribute

因此,摆脱其他可能性(即在逻辑 OR 之后)的唯一方法是:

  • [data-attribute]:not([data-attribute="value"]) // data-attribute不是 value
  • [data-attribute]:not([data-attribute^="value"]) // 不是以开头的 value
  • [data-attribute]:not([data-attribute*="value"]) // 不包含 value
  • [data-attribute]:not([data-attribute$="value"]) // 不以结尾 value

【讨论】:

    【解决方案2】:

    很遗憾,没有更简洁的方法了。即使是 jQuery 的 [att!=val] 选择器,这些年来一直是 jQuery 独有的,它也不需要匹配该属性,因此您仍然需要将其与 [att] 配对。

    我知道这是一个关于底值概念的实验,但为了完整起见,我将补充一点,HTML(以及扩展 CSS)中最接近空属性值的东西要么是空字符串(默认自定义数据属性的值),或者完全是属性的缺少。实现所需结果的惯用方法是选择空字符串或完全省略属性,并在 CSS 中分别使用相应的 [data-my-custom-attribute=""]:not([data-my-custom-attribute]) 选择器,在 JS 中分别使用 if (myCustomAttribute === "")if (("myCustomAttribute" in myDiv.dataset) === false)

    【讨论】:

    • 谢谢你,@BoltClock。我绝对想区分存在的属性和具有 值的属性和完全不存在的属性。当我开始将我的实验 UI 放在一起时,我的第一个想法是使用 "" 作为 null 值,但我很早就决定,为了不影响未来的潜在问题,我需要 "" 是一个有效的非null 值(就像 javascript 中的 '' 是一个有效的非null 值)。
    猜你喜欢
    • 1970-01-01
    • 2012-09-02
    • 2016-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 2019-05-14
    相关资源
    最近更新 更多