Выбрать элементы по атрибуту в CSS

Можно ли выбирать элементы в CSS по их атрибутам данных HTML5 (например, data-role)?


person Diogo Cardoso    schedule 16.03.2011    source источник


Ответы (5)


Если вы имеете в виду использование селектора атрибутов, конечно, почему бы и нет:

[data-role="page"] {
    /* Styles */
}

Существует множество селекторов атрибутов, которые вы можете использовать для различных сценариев, и все они описаны в документе, на который я ссылаюсь. Обратите внимание: несмотря на то, что пользовательские атрибуты данных являются «новой функцией HTML5»,

  • браузеры обычно не имеют проблем с поддержкой нестандартных атрибутов, поэтому вы должны иметь возможность фильтровать их с помощью селекторов атрибутов; а также

  • Вам также не нужно беспокоиться о проверке CSS, поскольку CSS не заботится об именах атрибутов без пространства имен, если они не нарушают синтаксис селектора.

person BoltClock    schedule 16.03.2011
comment
Совместим со всеми навигаторами? - person Christophe Debove; 26.03.2013
comment
@Christophe Debove: IE7 + и все остальное. - person BoltClock; 26.03.2013
comment
Лучший список селекторов, которые я видел, с возможностями и описаниями. code.tutsplus.com/tutorials / - person Nick M; 26.03.2014
comment
CSS, похоже, не обнаруживает этого, если атрибут данных установлен или изменен с помощью JS. - person ᴍᴀᴛᴛ ʙᴀᴋᴇʀ; 04.02.2015
comment
@ Мэтью Т. Бейкер: Интересно, спасибо. Я не могу утверждать, что понимаю, как наборы данных работают под капотом, но, вероятно, изменение набора данных элемента не устанавливает или не обновляет его список атрибутов, на что действительно смотрит селектор атрибутов. Другими словами, преобразование атрибутов данных в набор данных работает только в одном направлении - любые изменения в последнем не отражаются обратно. - person BoltClock; 04.02.2015
comment
После дальнейшего исследования выяснилось, что $("#element").data("field","value"); не изменяет значение атрибутов данных, а только изменяет кэшированную версию модели DOM jQuery. Чтобы изменить фактический атрибут DOM, нужно использовать $("#element").attr("data-field","value");. Сделать мой исходный комментарий недействительным. - person ᴍᴀᴛᴛ ʙᴀᴋᴇʀ; 05.02.2015
comment
Да, похоже, изменение набора данных тоже работает @Matthew - jsfiddle.net/BoltClock/k378xgj3 Спасибо зря jQuery. - person BoltClock; 05.02.2015
comment
Если у вас есть <div data-role="page"><div class="foo">Content here</div></div> и вы хотите изменить стиль внутреннего div, вы можете использовать [data-role="page"] .foo{background-color:red;} - person stackunderflow; 23.01.2017

В современных браузерах также можно выбирать атрибуты независимо от их содержимого.

с участием:

[data-my-attribute] {
   /* Styles */
}

[anything] {
   /* Styles */
}

Например: http://codepen.io/jasonm23/pen/fADnu.

Работает в очень значительной части браузеров.

Обратите внимание, что это также можно использовать в селекторе JQuery или с помощью document.querySelector

person ocodo    schedule 12.09.2013
comment
Вау, я никогда не видел, чтобы это можно было так использовать !! +1! И FWIW, теперь, когда срок действия браузерных снимков истек, я считаю, что он работает в IE7 +, поэтому его поддержка практически вездесуща. Забавно, что даже Крис Койер не упомянул об этом здесь - person Camilo Martin; 26.12.2013
comment
Спасибо @CamiloMartin. Я удалил ссылку на браузерные снимки, чтобы избежать путаницы / раздражения. - person ocodo; 28.12.2013
comment
Добавлена ​​ссылка на ветку Криса Койера css-tricks.com/attribute-selectors/#comment -965838 @CamiloMartin - person ocodo; 28.12.2013
comment
Отлично, чем больше кто знает, тем лучше :) и да, подтвердил, что работает с IE7 +. - person Camilo Martin; 29.12.2013
comment
В любом случае, ни один из этих синтаксисов не является новым - больше людей были удивлены тем, что IE6 не поддерживает его, чем IE7 +. Вы можете в значительной степени предположить, что все селекторы CSS2.1 поддерживаются в IE8 и более поздних версиях. - IE7 делает больше всего, хотя и с несколькими неясными ошибками. Все современные браузеры какое-то время поддерживали селекторы уровня 3, причем Chrome был ошибочным. вместо. - person BoltClock; 26.03.2014
comment
Поскольку мы говорим о селекторах атрибутов, интересно отметить, что селекторы атрибутов подстроки, которые были введены на уровне 3 (^=, *= и $=), также поддерживаются IE7 и IE8. Возможно, они были введены в IE до стандартизации. - person BoltClock; 26.03.2014

Стоит отметить селекторы атрибутов подстроки CSS3.

[attribute^=value] { /* starts with selector */
/* Styles */
}

[attribute$=value] { /* ends with selector */
/* Styles */
}

[attribute*=value] { /* contains selector */
/* Styles */
}
person Matas Vaitkevicius    schedule 18.05.2015

Вы можете комбинировать несколько селекторов, и это здорово, зная, что вы можете выбирать каждый атрибут и атрибут на основе их значения, например href, на основе их значений только с помощью CSS.

Селекторы атрибутов позволяют вам поиграть с атрибутами id и class.

Это отличное чтение о селекторах атрибутов

Fiddle

a[href="http://aamirshahzad.net"][title="Aamir"] {
  color: green;
  text-decoration: none;
}

a[id*="google"] {
  color: red;
}

a[class*="stack"] {
  color: yellow;
}
<a href="http://aamirshahzad.net" title="Aamir">Aamir</a>
<br>
<a href="http://google.com" id="google-link" title="Google">Google</a>
<br>
<a href="http://stackoverflow.com" class="stack-link" title="stack">stack</a>

Поддержка браузера:
IE6 +, Chrome, Firefox и Safari.

Вы можете проверить подробности здесь.

person Aamir Shahzad    schedule 30.03.2016
comment
Разве невозможно объединить несколько вместе в какой-то логике «или» (если вы хотите, чтобы применялись одни и те же правила)? Единственное, что я мог бы заставить работать - это [id = google], [id = bing], [id = baidu], ... {color: pink; } что хорошо и красиво с 'a', но если элемент длинный, он довольно многословен. Я бы хотел [id = google | bing | baidu] или что-то в этом роде. - person Max Waterman; 04.02.2021

Возможно ли выбирать элементы в CSS по их атрибутам данных HTML5? На этот вопрос легко ответить, просто попробовав, и ответ, конечно же, да. Но это неизменно приводит нас к следующему вопросу: «Следует ли выбирать элементы в CSS по их атрибутам данных HTML5?» По этому поводу существуют противоречивые мнения.

В лагере «нет» находится (или, по крайней мере, был в 2014 году) легенда CSS Гарри Робертс. В статье Именование компонентов пользовательского интерфейса в OOCSS он написал:

Важно отметить, что, хотя мы можем стилизовать HTML с помощью его атрибутов data- *, мы, вероятно, не должны этого делать. Атрибуты data- * предназначены для хранения данных в разметке, не для выбора. Это из Уровень жизни в HTML (выделено мной):

Атрибуты настраиваемых данных предназначены для хранения настраиваемых данных в частном порядке для страницы или приложения, для которых больше нет подходящих атрибутов или элементов.

Спецификация W3C на этот счет была удручающе расплывчатой, но, основываясь исключительно на том, что она сделала и не говорила, я думаю, что вывод Гарри был совершенно разумным.

С тех пор много из было высказано предположение, что использование настраиваемых атрибутов данных в качестве ловушек для стилизации совершенно уместно, включая руководство MDN, Использование атрибутов данных. Существует даже методология CSS под названием CUBE CSS, в которой перехватчик атрибутов данных является предпочтительным способом добавления стилей в компонент 'исключения '(известные как модификаторы в БЭМ).

К счастью, WHATWG HTML Living Standard с тех пор добавил еще несколько слов и даже несколько примеров (выделено мной):

Пользовательские атрибуты данных предназначены для хранения пользовательских данных, состояние, аннотации и т.п., частные для страницы или приложения, для которых больше нет подходящих атрибутов или элементов.

В этом примере пользовательские атрибуты данных используются для хранения результатов обнаружения функции для PaymentRequest, которую можно использовать в CSS для другого стиля страницы оформления заказа.

Авторы должны тщательно разрабатывать такие расширения, чтобы при игнорировании атрибутов и удалении любого связанного CSS страницу можно было использовать.


TL; DR: Да, можно использовать атрибуты data-* в селекторах CSS при условии, что страницу можно использовать без них.

person Kal    schedule 02.02.2021
comment
Человек, проголосовавший за этот ответ (в течение нескольких часов после того, как я его написал), не объяснил почему, поэтому я могу только догадываться, что он посчитал это не по теме. Когда дело доходит до написания кода, вопросы о том, можем ли что-то делать и должны ли, неразрывно связаны между собой. Любой разработчик, который стремится написать хороший код (то есть код, который не только выполняет свою работу, но и придерживается лучших практик), задаст этот вопрос, поэтому был предоставлен ответ, чтобы заполнить этот пробел. - person Kal; 03.02.2021
comment
Я еще не голосовал так или иначе, но рискну предположить, что человек, проголосовавший против, сделал это, потому что в этом ответе одно предложение повторяет ответ на вопрос, а остальное время тратится на ответы на совершенно другой вопрос. вопрос. Я не уверен, что это даже новая информация, поскольку она заложена в том факте, что это функция, которую нужно делать. В противном случае, вероятно, это не было бы функцией в спецификации. - person TylerH; 05.02.2021
comment
Спасибо @TylerH. Когда вы говорите: «Вероятно, это не было бы функцией в спецификации», если бы этого не было сделано, на самом деле это моя точка зрения. Веб-браузеры очень снисходительны по дизайну - Интернет не был бы таким увлекательным местом, если бы они просто выплевывали ошибку каждый раз, когда сталкивались с некорректным HTML. Поэтому, как разработчики, вопросы «можем ли мы» и «должны ли мы» не отделены друг от друга. Мы можем ответить на первый вопрос путем тестирования, но мы можем ответить на оба вопроса, обратившись к спецификации. Это то, чего не хватало во всех предыдущих ответах, и почему я предоставил свой. - person Kal; 07.02.2021
comment
Послушайте, я мог бы начать совершенно новый вопрос: «Следует ли выбирать элементы в CSS по их атрибутам данных HTML5», но тогда кто-то наверняка пометил бы это как дубликат этого, так что вы знаете … Иногда трудно выиграть. ???? - person Kal; 07.02.2021