Как браузеры разрешают конфликтующие классы?

#html #css #dom

#HTML #css #dom

Вопрос:

Я знаю, что можно указать несколько классов для элемента в HTML:

 <div class='one two'>Text</div>
  

Похоже, что классы доступны из Javascript в виде одной строки.

Что происходит, когда классы указаны с конфликтующими свойствами? Например

 div.one {
  background-color: red; 
  color: blue;
}
div.two {
  background-color: green;
}
  

Будет ли результат зависеть от порядка, в котором указаны классы? Например, могу ли я разумно ожидать, что приведенный выше div появится с синим текстом и зеленым фоном, потому two что класс вычисляется вторым, перезаписывая background-color свойство?

Комментарии:

1. Это скорее вопрос о том, какие результаты должны быть получены (стандарты wrt и т. Д.). Конечно, я мог бы протестировать его во всех 8 браузерах, которые я пытаюсь поддерживать, но эта информация может оказаться бесполезной даже через два года

2. Прочитайте: htmlhelp.com/reference/css/structure.html#cascade

3. @FlyBy — я не согласен; разве вы не видели, как быстро люди отвечают на вопросы здесь ??? 😉

4. Насколько я знаю, это зависит от порядка классов в записанном файле css. В этом случае это должен быть синий текст на зеленом фоне, независимо от того, является ли класс divs one two или two one . Если вы измените css и определите div.two ранее div.one , вы получите синий текст на красном фоне…

5. Название «каскадный» должно давать четкую подсказку — «последний» будет иметь приоритет и переопределять свойства. Все, что дочерний элемент не указывает, остается за родительским, вплоть до собственной таблицы стилей страницы и стилей браузера по умолчанию.

Ответ №1:

Читайте о специфике:

Краткий ответ: если два селектора имеют одинаковую специфику, выигрывает последний объявленный.

Ответ №2:

CSS имеет очень четко определенный порядок приоритета.

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

В приведенном вами примере это означало бы, что div.two стили будут переопределяться div.one , где одно и то же свойство определено в обоих.

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

 .myclass {
    background: rgb(200, 54, 54);
    background: rgba(200, 54, 54, 0.5);
}
  

Все браузеры будут выбирать последнее background объявление, которое они поддерживают, поэтому браузеры, которые поддерживают rgba , выберут второе, в то время как браузеры, которые этого не делают, обойдутся первым.

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

Комментарии:

1. за исключением атрибута color .

2. Итак, проблема с добавлением стилей с префиксом поставщика после заключается в том, что в браузере, который поддерживает обе версии, он будет использовать префиксный (менее «стандартный» из поддерживаемых версий)? Я не уверен, почему это само по себе может оказаться проблемой.

3. @Steven Lu — префиксы поставщиков: дело в том, что версия с префиксом может не поддерживать все функции, которые есть в окончательной версии, но более поздняя версия браузера может продолжать поддерживать версию с префиксом для обратной совместимости. Но вы хотите, чтобы версия без префикса имела приоритет, если это возможно.

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

Ответ №3:

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

Из спецификации CSS:

Наконец, сортировка по указанному порядку: если два объявления имеют одинаковый вес, происхождение и специфику, последнее указанное выигрывает. Объявления в импортированных таблицах стилей считаются предшествующими любым объявлениям в самой таблице стилей.

Ответ №4:

То, что вы используете для их оформления, называется «каскадными таблицами стилей». Каскадная часть означает, что это похоже на водопад, и будущие правила основаны на (или перезаписывают) предыдущие. Таким образом, второе правило перезапишет свойство background-color, но оно все равно сохранит цвет шрифта.

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

Ответ №5:

http://jsfiddle.net/mrtsherman/2NpXS/

Зависит от порядка таблицы стилей. Более поздние объявления стиля имеют приоритет. Вы можете инвертировать две строки css, чтобы увидеть.

Ответ №6:

Результат зависит от порядка, в котором указаны классы.

Вот хороший обзор порядка, в котором выполняются правила CSS: http://htmlhelp.com/reference/css/structure.html