Каков порядок приоритета CSS?


111

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

Здесь у меня есть два класса css

.smallbox { 
    background-color: white;
    height: 75px;
    width: 150px;
    font-size:20px;
    box-shadow: 0 0 10px #ccc;
    font-family: inherit;
}

.smallbox-paysummary {
    @extend .smallbox; 
    font-size:10px;
}

и на мой взгляд я звоню

<pre class = "span12 pre-scrollable smallbox-paysummary smallbox "> 

Шрифт (перекрывающийся элемент) отображается как 10 пикселей вместо 20 - может ли кто-нибудь объяснить, почему это так?


2
Вы используете препроцессор CSS? Я вижу, у вас есть @extend .smallbox;такая, которая выглядит как нестандартная cSS.
Джаред Фарриш

Вам действительно не следует комбинировать @extend- если он делает то, что я думаю, - и использовать оба селектора в одном элементе.
millimoose

SMACSS, кажется, рекомендует включать только измененные свойства в «подкласс» (т.е. .smallbox-paysummary) и, при желании, сделать объявление CSS более конкретным (не полагаясь на порядок появления в файле CSS), используя.smallbox.smallbox-paysummary { font-size: 10px; }
millimoose

1
И если вы НЕ хотите, .smallbox-paysummaryчтобы шрифт был меньше, почему вы вообще его уменьшаете?
millimoose

Теперь мне интересно, почему, если оба правила имеют одинаковую специфику, то, что объявлено позже в атрибуте class элемента, не имеет приоритета, независимо от порядка правил CSS.
Энди

Ответы:


187

Есть несколько правил (применяются в таком порядке):

  1. встроенный css (атрибут стиля html) переопределяет правила css в теге стиля и файле css
  2. более конкретный селектор имеет приоритет перед менее конкретным
  3. правила, которые появляются позже в коде, отменяют предыдущие правила, если оба имеют одинаковую специфичность.
  4. Правило css с !importantвсегда имеет приоритет.

В вашем случае применяется правило 3.

Специфичность для одиночных селекторов от высшего к низшему:

  • ids (пример: #mainвыбирает <div id="main">)
  • классы (напр .: .myclass), атрибут селекторы (напр .: [href=^https:]) и псевдо-классы (напр .: :hover)
  • элементы (напр .: div) и псевдо-элементы (напр .: ::before)

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

Пример: сравнить #nav ul li a:hoverс#nav ul li.active a::after

  • подсчитать количество селекторов id: по одному на каждый ( #nav)
  • посчитайте количество селекторов классов: по одному для каждого ( :hoverи .active)
  • подсчитайте количество селекторов элементов: есть 3 ( ul li a) для первого и 4 для второго ( ul li a ::after), поэтому второй комбинированный селектор более конкретен.

Хорошая статья о специфике CSS-селектора .


Как специфичность отменяет объявления встроенного стиля?
Джаред Фарриш

3
"... правила css в теге стиля ... отменяют правила в файле CSS". В последнее время я видел этот миф несколько раз. Не знаю, откуда это, но это чушь.
Alohci 03

@jared Я поменял местами две первые точки. Вы это имеете в виду?
Лоренц Мейер

Да, я имел в виду именно это.
Джаред Фарриш

2
@PakiPat :hover- это не селектор класса , а селектор псевдокласса .
Лоренц Мейер

31

Вот компиляция порядка стилей CSS на диаграмме, на которой правила CSS имеют более высокий приоритет и имеют приоритет над остальными: Порядок стилей CSS

Отказ от ответственности : я и моя команда разработали этот фрагмент вместе с сообщением в блоге ( https://vecta.io/blog/definitive-guide-to-css-styling-order ), который, я думаю, пригодится всем интерфейсам Разработчики.


3
Эта диаграмма требует особого мышления. Мне гораздо труднее понять эту диаграмму, чем само наследование стилей.
Лоренц Мейер

10

То, что мы здесь рассматриваем, в соответствии с заявлением Mozilla, называется специфичностью :

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

Специфичность - это вес, который применяется к данному объявлению CSS, определяемый количеством каждого типа селектора в соответствующем селекторе. Когда несколько объявлений имеют одинаковую специфичность, к элементу применяется последнее объявление, найденное в CSS. Специфичность применяется только в том случае, если один и тот же элемент нацелен несколькими объявлениями. Согласно правилам CSS, элементы с прямым нацеливанием всегда будут иметь приоритет над правилами, которые элемент наследует от своего предка.

Мне нравится объяснение 0-0-0 на https://specifishity.com :

введите описание изображения здесь

Вполне наглядная картина !importantдирективы! Но иногда это единственный способ переопределить встроенный styleатрибут. Так что лучше всего избегать того и другого.


1
превосходно. именно то, что я искал. Этот рисунок великолепен, смеется.
saran3h 05

7

Прежде всего, исходя из вашей @extendдирективы, похоже, что вы используете не чистый CSS, а препроцессор, такой как SASS os Stylus.

Теперь, когда мы говорим о «порядке приоритета» в CSS, есть общее правило: применяются любые правила, установленные после других правил (сверху вниз). В вашем случае, просто указав .smallboxпосле, .smallbox-paysummaryвы сможете изменить приоритет своих правил.

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

  1. Текущий тип носителя;
  2. Важность;
  3. Происхождение;
  4. Специфика селектора и, наконец, наше известное правило:
  5. Какой последний указан.

5

AS - состояние в W3: W3 Cascade CSS

Порядок применения различных таблиц стилей следующий (цитата из каскадного раздела W3):

  1. объявления пользовательского агента

  2. обычные объявления пользователя

  3. автор нормальных деклараций

  4. важные заявления автора

  5. важные заявления для пользователей

Более подробная информация об этом представлена ​​в упомянутом документе W3.


4

Порядок, в котором классы появляются в элементе html, не имеет значения, учитывается порядок, в котором блоки появляются в таблице стилей.

В вашем случае .smallbox-paysummaryопределяется после, .smallboxследовательно, приоритет 10 пикселей.


4
Element, Pseudo Element: d = 1  (0,0,0,1)
Class, Pseudo class, Attribute: c = 1  (0,0,1,0)
Id: b = 1  (0,1,0,0)
Inline Style: a = 1  (1,0,0,0)

Встроенный css (атрибут стиля html) переопределяет правила css в теге стиля и файле css

Более конкретный селектор имеет приоритет перед менее конкретным.

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


Вот хорошее объяснение: vanseodesign.com/css/css-specificity-inheritance-cascaade
akostadinov

1
@Mahi Я помахал предложенным вами редактированием все это время, но в будущем, пожалуйста, не добавляйте мусор в редактирование, чтобы оно было достаточно длинным. Наличие второго редактирования, которое «устраняет» ущерб, нанесенное первым, - это очень плохая практика, очень неинтуитивная для рецензентов и создает больше работы, чем необходимо. Вместо этого просто поищите другие вещи, которые можно улучшить (например, орфографию или грамматику).
Сигуза 02

0

Также важно отметить, что когда у вас есть два стиля в элементе HTML с равным приоритетом, браузер будет отдавать приоритет стилям, которые были записаны в DOM последними ... поэтому, если в DOM:

<html>
<head>
<style>.container-ext { width: 100%; }</style>
<style>.container { width: 50px; }</style>
</head>
<body>
<div class="container container-ext">Hello World</div>
</body>

... ширина div будет 50 пикселей


Это не совсем приоритет, это каскадная часть каскадных таблиц стилей.
TylerH
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.