有没有靠谱的select或者可以select基于样式的元素?

Is there a reliable selector that can select elements based on styles?

这是我写的一个函数。获取具有特定属性的最近元素效果很好:

// Example of attribute if id

export function getClosestAttribute(
  element: SVGElement,
  attribute: keyof typeof svgAttributeToCssStyle,
  excludeElement: boolean
): string | null {
  let firstIncludedEl: Element | null = element;
  if (excludeElement) {
    firstIncludedEl = element.parentElement;
  }
  if (!firstIncludedEl) {
    return null;
  }
  const closestEl = firstIncludedEl.closest(`[${attribute}]`);
  if (!closestEl) {
    return null;
  }

  return closestEl.getAttribute(attribute);
}

是否可以为样式编写类似的东西?例如。我想 select 任何具有 style="...fill:..."?

的元素

更新

另一种方法是匹配两个规则。第一个“开始于”规则匹配:color: red,但不匹配 background-color: red.

div[style^="color:"] {
  text-decoration: underline;
}

当字符串出现在 style 值后面的任何位置时,第二条规则匹配:

div[style*=" color:"] {
  text-decoration: underline;
}

然后我们将它们链接在一起:

div[style^="color:"],
div[style*=" color:"] {
  text-decoration: underline;
  opacity: 0.5;
}
<div style="background-color: red;">Should not match
</div>

<div style="font-size: 20px; color: red;">Match
</div>

<div style="color: red; font-size: 32px;">Match
</div>

<div style="font-size: 20px; background-color: red;">Should not match
</div>

__

您可以使用 attribute selector 并查找包含您选择的字符串的 style 值。但是,白色 space 很重要。如果您正在寻找 style*="color: red" 但您的 style 值在 color:red 之间没有 space,则选择器将 not 找到匹配项。

[attr*=value] Represents elements with an attribute name of attr whose value contains at least one occurrence of value within the string.

示例:

div[style*="color: red"] {
  text-decoration: underline;
}
<div style="color: blue;">Regular div
</div>

<div style="color: red;">Add an underline
</div>

尝试:

div[style^="color: red"] {
  text-decoration: underline;
}

如果样式属性以 color: red.

开头,则此方法有效