Каков порядок приоритета CSS?
Я пытаюсь понять, почему один из моих классов 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 ">
Шрифт (перекрывающий элемент) отображается как 10px вместо 20 - может кто-нибудь объяснить, почему это так?
Ответы
Ответ 1
Есть несколько правил (применяются в этом порядке):
- встроенный CSS (атрибут стиля HTML) переопределяет правила CSS в теге стиля и файле CSS
- более конкретный селектор имеет приоритет над менее специфичным
- правила, которые появляются позже в коде, переопределяют более ранние правила, если оба имеют одинаковую специфику.
- Правило css с
!important
всегда имеет приоритет.
В вашем случае это правило 3, которое применяется.
Специфичность для отдельных селекторов от высшего к низшему:
- идентификаторы (пример:
#main
<div id="main">
) - классы (например,
.myclass
), селекторы атрибутов (например, [href=^https:]
) и псевдоклассы (например,: :hover
) - элементы (напр.:
div
) и псевдоэлементы (напр.: ::before
)
Чтобы сравнить специфичность двух комбинированных селекторов, сравните количество вхождений отдельных селекторов в каждой из указанных выше групп специфичности.
Пример: сравните #nav ul li a:hover
с #nav ul li.active a::after
- посчитать количество селекторов идентификаторов: есть один для каждого (
#nav
) - посчитать количество селекторов класса: есть один для каждого (
:hover
и .active
) - Подсчитайте количество селекторов элементов: для первого есть 3 (
ul li a
), для второго - 4 (ul li a ::after
), поэтому второй комбинированный селектор более специфичен.
Хорошая статья о специфике селектора CSS.
Ответ 2
Вот компиляция порядка стилей CSS в диаграмме, в которой правила CSS имеют более высокий приоритет и имеют приоритет над остальными:
![CSS styling order]()
Отказ от ответственности: мы с моей командой разработали эту часть вместе с сообщением в блоге (https://vecta.io/blog/definitive-guide-to-css-styling-order), которое, я думаю, пригодится всем разработчикам внешнего интерфейса.
Ответ 3
Прежде всего, на основе вашей директивы @extend
, кажется, вы не используете чистый CSS, а препроцессор, такой как SASS os Stylus.
Теперь, когда мы говорим о "порядке приоритетности" в CSS, применяется общее правило: любые правила, установленные после, применяются другие правила (сверху вниз). В вашем случае, просто указав .smallbox
после .smallbox-paysummary
, вы сможете изменить приоритет своих правил.
Однако, если вы хотите пойти немного дальше, я предлагаю следующее: CSS каскадная спецификация W3C. Вы увидите, что приоритет правила основан на:
- Текущий тип носителя;
- Значение
- Происхождение;
- Специфика селектора и, наконец, наше известное правило:
- Какой из них указан последним.
Ответ 4
AS - состояние в W3:
W3 Каскадный CSS
орден, который применяется в другой таблице стилей, следующий (цитата из каскадного раздела W3):
-
объявления пользовательских агентов
-
пользовательские декларации пользователя
-
авторские декларации
-
авторские важные декларации
- важные объявления пользователя
Дополнительная информация об этом в документе W3, указанном в документе
Ответ 5
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)
Inline css (атрибут стиля html) переопределяет правила CSS в теге стиля и файле css
Более конкретный селектор имеет приоритет над менее конкретным.
Правила, которые появляются позже в коде, переопределяют предыдущие правила, если обе имеют одинаковую специфичность.
Ответ 6
Порядок, в котором классы отображаются в элементе html, не имеет значения, что считается порядком, в котором блоки отображаются в таблице стилей.
В вашем случае .smallbox-paysummary
определяется после .smallbox
, следовательно, приоритет 10px.
Ответ 7
То, на что мы смотрим, называется специфичностью, как утверждает Mozilla:
Специфика - это средство, с помощью которого браузеры решают, какое свойство CSS значения являются наиболее релевантными для элемента и, следовательно, будут применяется. Специфика основана на правилах сопоставления, которые составлены различных видов селекторов CSS.
Специфичность - это вес, который применяется к данной декларации CSS, определяется номером каждого типа селектора в сопоставлении селектор. Когда несколько объявлений имеют одинаковую специфичность, последний объявление, найденное в CSS, применяется к элементу. специфичность применяется только тогда, когда один и тот же элемент предназначен для нескольких деклараций. Согласно правилам CSS, элементы с прямым таргетингом всегда будут иметь приоритет над правилами, которые элемент наследует от своего предок.
Мне нравится объяснение 0-0-0 на https://specifishity.com:
![enter image description here]()
Довольно описательная картина директивы !important
! Но иногда это единственный способ переопределить встроенный атрибут style
. Так что это лучшая практика, пытаясь избежать обоих.
Ответ 8
Также важно отметить, что когда у вас есть два стиля в элементе 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 будет 50px