Есть ли селектор CSS по префиксу класса?

Я хочу применить правило CSS к любому элементу, чей один из классов соответствует указанному префиксу.

например. Я хочу правило, которое будет применяться к div, у которого есть класс, который начинается с status- (A и C, но не 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-", которая встречается непосредственно после символа пробела. Имена классов разделяются пробелом за спецификацию HTML, отсюда и значительный символ пробела. Это проверяет любые другие классы после первого, если указано несколько классов, и добавляет бонус к проверке первого класса в случае, если значение атрибута заполняется пробелом (что может случиться с некоторыми приложениями, которые динамически выводят атрибуты class).

Естественно, это также работает в jQuery, как показано здесь.

Причина, по которой вам нужно объединить два селектора атрибутов, как описано выше, состоит в том, что селектор атрибутов, такой как [class*="status-"], будет соответствовать следующему элементу, что может быть нежелательным:

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

Если вы можете гарантировать, что такой сценарий будет никогда, то вы можете использовать такой селектор для простоты. Однако вышеприведенная комбинация намного более надежна.

Если у вас есть контроль над источником HTML или приложением, генерирующим разметку, может быть проще просто сделать префикс status- своим собственным status классом вместо как предлагает Gumbo.

Ответ 2

Селекторы атрибутов CSS позволят вам проверять атрибуты для строки. (в этом случае - имя класса)

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

(похоже, что он находится в статусе "рекомендации" для 2.1 и 3)


Здесь очертания того, как я * думаю, что это работает:

  • [ ]: контейнер для сложных селекторов, если вы...
  • class: "класс" - это атрибут, который вы смотрите в этом случае.
  • *: модификатор (если есть): в этом случае - "подстановочный знак" означает, что вы ищете ЛЮБОЕ совпадение.
  • test-: значение (если оно есть) атрибута - содержит строку "test-" (что может быть что угодно)

Итак, например:

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

Вы можете быть более конкретным, если у вас есть веская причина, и элемент тоже

ul[class*='test-'] > li { ... }

Я попытался найти граничные случаи, но я не вижу необходимости использовать комбинацию ^ и * - as * получает все...

example: http://codepen.io/sheriffderek/pen/MaaBwp

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

Все выше IE6 будет радостно подчиняться.:)

обратите внимание, что:

[class] { ... }

Выберет что-нибудь с классом...

Ответ 3

Это невозможно с помощью селекторов CSS. Но вы можете использовать два класса вместо одного, например. статус и важность, а не статус важны.

Ответ 4

Вы не можете этого сделать. Существует один селектор атрибутов, который соответствует точно или частично до знака -, но он не будет работать здесь, потому что у вас есть несколько атрибутов. Если имя класса, которое вы ищете, всегда будет первым, вы можете сделать это:

<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 может манипулировать атрибутом.