Что означает «i» в селекторе атрибутов CSS?

112

Я нашел следующий селектор CSS в таблице стилей пользовательского агента Google Chrome:

[type="checkbox" i]

Что iзначит?

AntiCZ
источник
1
@Alexander O'Mara: Селекторы уровня 4 являются частью CSS3 - это просто следующий уровень модуля, который начался на уровне 3. «CSS4» - неправильное название.
BoltClock
2
@Alexander O'Mara: Мне бы хотелось, чтобы об этом рассказали в мета. В частности, я хотел бы знать, как мы можем справиться с использованием тега [css4] - самая радикальная мера, которую я мог предпринять, - это сделать его синонимом [css3], и это было бы правильным поступком.
BoltClock
1
@BoltClock Мета Вопрос задан ! Кстати, когда вы спрашиваете об объединении вашего ответа с этим вопросом, вы имели в виду отредактировать вопрос / ответ здесь, чтобы добавить информацию, или вы имели в виду волшебную кнопку «перейти и ответить на другой вопрос»?
Александр О'Мара
1
@Alexander O'Mara: Не двигать отдельные ответы, а объединять два целых вопроса. Это функция только для мода.
BoltClock
1
@TylerH У нас есть обсуждение Meta по этой теме . Не стесняйтесь добавлять к обсуждению там.
Александр О'Мара

Ответы:

132

Как упоминалось в комментариях, это для сопоставления атрибутов без учета регистра. Это новая функция в CSS Selectors Level 4.

В настоящее время он доступен в Chrome 49+, Firefox 47+, Safari 9+ и Opera 37 + *. До этого он был доступен только в стилях пользовательского агента Chrome, начиная с Chrome 39, но его можно было включить для веб-контента, установив флаг экспериментальных функций.

* Более ранние версии Opera также могут его поддерживать.

Рабочий пример / тест браузера:

[data-test] {
    width: 100px;
    height: 100px;
    margin: 4px;
}

[data-test="A"] {
    background: red;
}

[data-test="a" i] {
    background: green;
}
Green if supported, red if not:

<div data-test="A"></div>

Вышеупомянутый квадрат будет зеленым, если браузер поддерживает эту функцию, и красным, если нет.

Александр О'Мара
источник
6
Спасибо за обучение! Наслаждайтесь своей новой шляпой. Работает ли подобное в библиотеках селекторов? Какая у него поддержка браузера?
Бенджамин Грюнбаум
1
@BenjaminGruenbaum Похоже, он доступен только в стилях пользовательского агента Chrome (не CSS веб-сайта, по крайней мере, пока). Мне не удалось найти официальную документацию по совместимости.
Александр О'Мара
(Повторная публикация моего предыдущего комментария теперь, когда вопросы объединены.) Неудивительно, что совершенно новые экспериментальные стандарты, подобные этому, плохо документированы. Тем не менее, мой ответ содержит дополнительную информацию об этом, а именно, как это работает, почему он используется и как он реализован в Chrome (как указано в вопросе).
BoltClock
Chrome добавит поддержку для этого в версии 49.0 (в настоящее время в бета-версии), Firefox в версии 47.0 (выпуск запланирован на июнь 2016 года). Источник: developer.mozilla.org/en-US/docs/Web/CSS/…
Miscreant
1
@LWChris: Я не уверен, что такой браузер действительно существует. IE6 вообще не понимает селекторов атрибутов, а IE7 поддерживает их даже с настраиваемыми атрибутами данных.
BoltClock
36

Это флаг без учета регистра для селекторов атрибутов, представленный в Селекторах 4 . Судя по всему, они внедрили эту функцию в Chrome еще в августе 2014 года.

Вкратце: этот флаг сообщает браузеру о необходимости сопоставления соответствующих значений typeатрибута без учета регистра. Поведение селектора по умолчанию для значений атрибутов в HTML чувствительно к регистру , что часто нежелательно, потому что для многих атрибутов определены значения без учета регистра, и вы хотите, чтобы ваш селектор выбирал все правильные элементы независимо от регистра. typeявляется одним из примеров такого атрибута, потому что это перечислимый атрибут , а перечисленные атрибуты, как говорят, имеют значения без учета регистра .

Вот соответствующие коммиты:

  • 179370 - реализация
  • 179401 - изменения в таблицах стилей UA, как показано на скриншоте в вопросе

Обратите внимание, что в настоящее время он скрыт во флаге «Включить экспериментальные функции веб-платформы», доступ к которому можно получить по адресу chrome: // flags / # enable-experimental-web-platform-features. Это может объяснить, почему эта функция осталась практически незамеченной - функции, скрытые за этим флагом, могут использоваться только внутри, а не в общедоступном коде (например, в таблицах стилей авторов), если они не включены, потому что они экспериментальные и, следовательно, не готовы к использованию в производственной среде.

Вот тестовый пример, который вы можете использовать - сравните результаты, когда флаг включен и отключен:

span[data-foo="bar"] {
    color: red;
}

span[data-foo="bar" i] {
    color: green;
}
<span data-foo="bar">If all of this text is green,</span>
<span data-foo="Bar">your browser supports case-insensitive attribute selectors.</span>

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

На момент написания этой статьи мне не известно о каких-либо других реализациях, но, надеюсь, другие браузеры скоро их догонят. Это относительно простое, но чрезвычайно полезное дополнение к стандарту, и я с нетерпением жду возможности использовать его в будущем.

BoltClock
источник
У меня "послеобеденная" усталость ... Прочитав спецификацию W3, я все еще не понимаю полностью, что будет для этого практического использования в css в реальной жизни?
Мэтт
2
@Matt: соответствие селектора атрибутов чувствительно к регистру, как указано в HTML5 , что во многих случаях нежелательно, поскольку HTML5 допускает нечувствительные к регистру значения для определенных атрибутов. Вы можете использовать этот флаг, чтобы убедиться, что вы выбираете правильные элементы независимо от регистра. Например, на скриншоте видно, что он ищет input[type="search" i], что соответствует элементам вроде <input type="SEARCH">.
BoltClock
1
Я могу подтвердить, что он работает с Chromium версии 43.0.2357.130 и включенным «Включить экспериментальные функции веб-платформы».
Роберт Симер