Подтвердить что ты не робот

Почему нет возможности комбинировать псевдо-элементы/классы, относящиеся к конкретному поставщику, в один набор правил?

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

Все они имеют одни и те же базовые свойства (то есть: стилизация текста и декларации цветов).

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

В качестве примера я склонен ориентироваться на стиль заполнителя с использованием следующих четырех селекторов:

  • input:-moz-placeholder
  • input::-moz-placeholder
  • input:-ms-input-placeholder
  • input::-webkit-input-placeholder

(хотя :-moz-placeholder устарел в пользу ::-moz-placeholder, это произошло только с выпуском FireFox 19, так что в настоящее время оба необходимых для лучшей поддержки браузера).

Что расстраивает то, что объявление и предоставление каждого (того же) стиля приводит к большому количеству повторений в CSS.

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

input:-moz-placeholder{
    font-style: italic;
    text-align: right;
}
input::-moz-placeholder{
    font-style: italic;
    text-align: right;
}
input:-ms-input-placeholder{
    font-style: italic;
    text-align: right;
}
input::-webkit-input-placeholder{
    font-style: italic;
    text-align: right;
}

То, что я действительно хочу сделать, это объединить их в одно единственное правило, разделенное запятыми:

input:-moz-placeholder,
input::-moz-placeholder,
input:-ms-input-placeholder,
input::-webkit-input-placeholder{
    font-style: italic;
    text-align: right;
}

Однако, несмотря на то, что это случалось несколько раз, это, похоже, не работает. Меня беспокоит, что есть некоторая фундаментальная часть CSS, которую я не понимаю.

Может ли кто-нибудь пролить свет на то, почему это происходит?

4b9b3361

Ответ 1

CSS2.1 состояния:

Селектор (см. также раздел селектор) состоит из всего до (но не включая) первой левой фигурной скобки ({), Селектор всегда идет вместе с блоком декларации. Когда пользовательский агент не может разобрать селектор (т.е. Он недействителен CSS 2.1), он должен ignore селектор и следующий блок объявления (если таковые имеются).

Обратите внимание, что "недействительно CSS 2.1" в случае браузера, который реализует CSS3, действительно означает "он не понятен пользовательскому агенту".

Поскольку один поставщик браузеров не понимает префиксы других поставщиков, он должен отказаться от любых правил, содержащих эти непризнанные префиксы в псевдо-классах и псевдоэлементных селекторах. 1

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


1 Обратите внимание, что WebKit печально известен тем, что частично нарушает это правило: в нем нет проблем с анализом правил, у селекторов которых есть непризнанные префиксные псевдоэлементы (что в данном случае равно ::-moz-placeholder). Тем не менее, псевдо-класс :-moz-placeholder в вашем объединенном правиле приведет к тому, что он все равно сломается.

Ответ 2

Спецификации говорят, что если пользовательский агент не распознает часть селектора, он должен игнорировать весь селектор и его блок.

http://www.w3.org/TR/css3-syntax/#rule-sets

Селектор (см. модуль Selectors [SELECT]) состоит из всего до (но не включая) первой левой фигурной скобки ({). Селектор всегда идет вместе с {} -блоком. Когда пользовательский агент не может разобрать селектор (т.е. Он недействителен CSS3), он также должен игнорировать {} -блок.