Is there a CSS selector by class prefix?
我想将CSS规则应用于其类之一与指定前缀匹配的任何元素。
例如。 我想要一条适用于div以status-开头的类(A和C,但以下代码段中不包含B)的规则:
某种组合:
div[class|=status]和div[class~=status-]
它可以在CSS 2.1下执行吗? 它可以在任何CSS规范下执行吗?
注意:我知道我可以使用jQuery来模拟。
它不适用于CSS2.1,但可以用于CSS3属性子字符串匹配选择器(在IE7 +中受支持):
1
| div[class^="status-"], div[class*=" status-"] |
注意第二个属性选择器中的空格字符。这将拾取其class属性满足以下任一条件的div元素:
当然,这也适用于jQuery,如此处所示。
如上所述,您需要组合两个属性选择器的原因是因为诸如[class*="status-"]之类的属性选择器将匹配以下元素,这可能是不希望的:
如果可以确保永远不会发生这种情况,那么为简单起见,您可以自由使用此类选择器。但是,上述组合更加健壮。
如果您可以控制HTML源代码或生成标记的应用程序,则可以像Gumbo建议的那样,将status-前缀设为自己的status类可能更简单。
-
如果出于某种奇怪的原因,您有一个名为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:您忘记了^ =部分。如果保证您的class属性以anim-overlay-开头,那么您可能不需要* =部分。
-
谢谢。另一件事,我可以使用此.anim-overlay-*{...}吗?
-
@WebDevRon:如果不是这么简单,您是否认为我会在我的答案中提出这个建议,而不是您所看的复杂解决方案?
-
@Daniel Compton:感谢您的编辑。事后看来,我意识到这样的话如何可以屈服于某人,而对于某人来说,事情可能并不那么明显。我知道有些人真的不喜欢这种变化,因此我主要是想告诉您我所做的。
-
按照您提供的HTML规范链接,类名称可以用任何ASCII空格分隔,包括制表符和换行符。因此,例如,如果HTML文档具有class="fooTABstatus-important"或class="fooNEWLINEstatus-important",那么选择器是否仍与此类匹配? CSS规范是否说选择器中的空格将匹配任何空格,或仅匹配文字空格字符?如果仅匹配文字空格字符,则不能保证此选择器始终有效。
-
@加勒特·威尔逊:你的直觉是正确的;该选择器不考虑其他类型的空格。对所有可能的空白字符重复使用此选择器非常繁琐,而且浪费大量字节,在您的整个职业生涯或一生中,您几乎永远都不会遇到其余的空白字符。如果已知应用程序输出带有换行符,选项卡,换页符或您所拥有的内容或它们的任意组合的类属性,则您必须考虑这些内容。如果已知不这样做,那么它会像您实际需要的那样强大。
-
好的,很好,但这不是答案。在计算机科学中,有效的事物与"大部分时间"有效的事物之间存在很大的差异。答案使之似乎是符合CSS选择器匹配规则的(如果不是)。在我看来,您可能会遇到麻烦,说:"即使我的数据没有涵盖规格变化,它也可以处理我测试过的数据"。与使用正则表达式而不是XML解析器解析XML一样,存在同样的危险。至少,答案需要免责声明,该免责声明不能涵盖所有可能性。
-
@加勒特·威尔逊:公平的妥协。 提醒您,我很熟悉您所说的内容(即使我从未参加过CS),并且我在尽力说明尽可能多的警告,并且在最近几年更加谨慎地将免责声明添加到我的答案中-这是将近8年前的事情了 而且,除非它超级重要,否则我往往没有力气对旧的答案进行细微的改动。 过去,我故意将最极端的案例留给我,因为我不想将3个段落变成10个段落,其余的与90%的读者和99%的真实场景无关。
CSS属性选择器将允许您检查字符串的属性。 (在这种情况下-类名)
https://developer.mozilla.org/zh-CN/docs/Web/CSS/Attribute_selectors
(看起来它实际上处于2.1和3的"推荐"状态)
这是我*如何工作的概述:
-
[ ]:是复杂选择器的容器,如果您要...
-
class:"类"是在这种情况下要查看的属性。
-
*:修饰符(如果有):在这种情况下-"通配符"表示您正在寻找任何匹配项。
-
test-:属性的值(假设有一个)-包含字符串" test-"(可以是任意值)
因此,例如:
1 2 3
| [class*='test-'] {
color: red;
} |
如果您有充分的理由,也可以更具体一些
ul[class*='test-'] > li { ... }
我尝试查找边缘情况,但我认为不需要使用^和*的组合-因为*可以获取所有内容...
例如:http://codepen.io/sheriffderek/pen/MaaBwp
http://caniuse.com/#feat=css-sel2
高于IE6的一切都将愉快地服从。 :)
注意:
[class] { ... }
会选择一个班级的任何东西...
-
[class*=test-]将匹配诸如之类的元素。 多数民众赞成在一个边缘情况下需要结合^和*如我的答案所述。 IE6不支持属性选择器。
-
@BoltClock-感谢您的澄清! -我不支持
CSS选择器无法做到这一点。但是您可以使用两个类而不是一个类,例如地位和重要,而不是地位重要。
-
将其分为自己的类的好主意,但是可以使用CSS选择器。看我的答案。
您不能这样做。有一个属性选择器可以完全匹配或部分匹配,直到-号为止,但由于您有多个属性,因此在这里不起作用。如果您要查找的类名始终是第一个,则可以这样做:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| <html>
<head>
Test Page
<style type="text/css">
div[class|=status] { background-color:red; }
</style>
</head>
<body>
A
B
C
</body>
</html> |
请注意,这只是指出哪个CSS属性选择器是最接近的,不建议您假设类名始终在最前面,因为javascript可以操纵属性。
-
是的,想到了这一点。当jQuery进入图片时,这可能会成为一个问题,因为它可能在前面插入一个类。
-
是的,我会编辑我的帖子以使其清楚明确,这不是推荐的操作方式。如果您可以控制类名,那么绝对可以使用Gumbos建议(不支持旧版IE浏览器上的属性选择器)。