是否有按类前缀的 CSS 选择器?

Posted

技术标签:

【中文标题】是否有按类前缀的 CSS 选择器?【英文标题】:Is there a CSS selector by class prefix? 【发布时间】:2011-03-21 07:14:36 【问题描述】:

我想将 CSS 规则应用于其中一个类与指定前缀匹配的任何元素。

例如我想要一个适用于类以status- 开头的 div 的规则(A 和 C,但在以下 sn-p 中不是 B):

<div id='A' class='foo-class status-important bar-class'></div>
<div id='B' class='foo-class bar-class'></div>
<div id='C' class='foo-class status-low-priority bar-class'></div>

某种组合:div[class|=status]div[class~=status-]

在 CSS 2.1 下是否可行?它在任何 CSS 规范下都可行吗?

注意:我知道我可以使用 jQuery 来模拟它。

【问题讨论】:

【参考方案1】:

这在 CSS2.1 中是不可行的,但可以使用 CSS3 属性子字符串匹配选择器(IE7+ 支持 ):

div[class^="status-"], div[class*=" status-"]

注意第二个属性选择器中的空格字符。这会选取div 属性满足以下任一条件的class 元素:

[class^="status-"] — 以“status-”开头

[class*=" status-"] — 包含直接出现在空格字符之后的子字符串“status-”。类名由空格 per the html spec 分隔,因此是重要的空格字符。如果指定了多个类,这将检查第一个类之后的任何其他类, 并且 增加了检查第一个类的好处,以防属性值被空格填充(这可能发生在某些输出 @987654329 的应用程序中@ 属性动态)。

当然,这也适用于 jQuery,如 here 所示。

之所以需要如上所述组合两个属性选择器,是因为[class*="status-"] 之类的属性选择器会匹配以下元素,这可能是不可取的:

<div id='D' class='foo-class foo-status-bar bar-class'></div>

如果您可以确保这种情况永远不会发生,那么为了简单起见,您可以随意使用这种选择器。但是,上面的组合更加健壮。

如果您可以控制 HTML 源代码或生成标记的应用程序,则将 status- 前缀作为自己的 status 类而不是 as Gumbo suggests 可能更简单。

【讨论】:

如果出于某种奇怪的原因你有一个名为status- 的类并且你不想匹配它,选择器会变得更加复杂:div[class^="status-"]:not(.status-), div[class*=" status-"]:not(.status-) 另外你失去了对 IE7/IE8 的支持。幸运的是,如果你的标记是理智的,你就不需要排除这样的类。 这有什么问题:[class*=" anim-overlay-"] a:hover:after...。我的 CSS 类是 anim-overlay-1, anim-overlay-2..... anim-overlay-8 @WebDevRon:你忘记了 ^= 部分。如果您的类属性保证以 anim-overlay- 开头,那么您可能不需要 *= 部分。 谢谢。还有一件事,我可以用这个.anim-overlay-*...吗? @Daniel Compton:感谢您的编辑。事后看来,我已经意识到这样的词是如何屈尊俯就某人的,对他们来说,有些事情可能并不那么明显。我知道有些人真的不喜欢这种变化,所以我的回应主要是让你知道我喜欢。【参考方案2】:

CSS 属性选择器将允许您检查字符串的属性。 (在这种情况下 - 一个类名)

https://developer.mozilla.org/en-US/docs/Web/CSS/Attribute_selectors

(看起来它实际上是 2.1 和 3 的“推荐”状态)

以下是我*认为它是如何工作的大纲:

[ ] : 是复杂选择器的容器如果你愿意... class : 'class' 是您在这种情况下查看的属性* : 修饰符(如果有):在这种情况下 - “通配符”表示您正在寻找任何匹配项。 test- :属性的值(假设有一个) - 包含字符串“test-”(可以是任何值)

所以,例如:

[class*='test-'] 
  color: red;

如果你有充分的理由,你可以更具体,也可以使用元素

ul[class*='test-'] &gt; li ...

我试图找到边缘情况,但我认为没有必要使用 ^* 的组合 - 因为 * 得到了一切......

示例:http://codepen.io/sheriffderek/pen/MaaBwp

http://caniuse.com/#feat=css-sel2

IE6 以上的一切都会很高兴地服从。 :)

注意:

[class] ...

将选择任何具有类...

【讨论】:

[class*='test-'] 将匹配 &lt;div class='foo-test-bar'&gt; 等元素。这是我的回答中描述的需要结合 ^ 和 * 的一种极端情况。而且IE6不支持属性选择器。 @BoltClock - 感谢您的澄清! - 我不支持 【参考方案3】:

你不能这样做。有一个 attribute selector 完全匹配或部分匹配,直到一个 - 符号,但它不会在这里工作,因为你有多个属性。如果您要查找的类名总是第一个,您可以这样做:

<html>
<head>
<title>Test Page</title>
<style type="text/css">
div[class|=status]  background-color:red; 
</style>
</head>
<body>
<div id='A' class='status-important bar-class'>A</div>
<div id='B' class='bar-class'>B</div>
<div id='C' class='status-low-priority bar-class'>C</div>

</body>
</html>

请注意,这只是为了指出哪个 CSS 属性选择器最接近,不建议假设类名总是在前面,因为 javascript 可以操纵属性。

【讨论】:

是的,想到了。当 jQuery 进入图片时,它可能会成为一个问题,因为它可能会在前面插入一个类。 是的,我会编辑我的帖子以明确说明这不是推荐的做法。如果您可以控制类名,那么 Gumbo 的建议肯定是可行的方法(不支持旧 IE 浏览器上的属性选择器)。【参考方案4】:

这对于 CSS 选择器是不可能的。但是你可以使用两个类而不是一个类,例如statusimportant 而不是 status-important

【讨论】:

将其分离到自己的类中是个好主意,但使用 CSS 选择器可能的。看我的回答。

以上是关于是否有按类前缀的 CSS 选择器?的主要内容,如果未能解决你的问题,请参考以下文章

Html学习之八(CSS选择器的使用--属性选择器)

Sonarqube css:如何为前缀为“pr-”的选择器禁用“意外的未知类型”规则

类选择器(CSS选择器)

CSS 正则表达式 id 选择器与类选择器的性能

JQ选择器

CSS3选择器详解