Приоритет в css
Что в css приоритетнее? То, что указано в аттрибуте style=»» или то, что с !important? Можно ли чем-то перекрыть style?
Отслеживать
задан 18 авг 2016 в 18:45
JamesJGoodwin JamesJGoodwin
3,968 6 6 золотых знаков 39 39 серебряных знаков 73 73 бронзовых знака
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
!important перебивает стили, вне зависимости от порядка подключения последних.
Вообще, порядок такой:
- Стили из и — применяются в первую очередь, в том порядке, в каком подключались в html;
- Инлайновые стили (те, что в style=»» ) применяются вторыми;
!important же перебивает любые стили, неважно, где они были объявлены.
P.S. Перебить !important стиль может только такой же !important , только объявленный позже.
Приоритет в CSS
Элемент HTML может быть целью нескольких правил CSS. Давайте воспользуемся простым абзацем в качестве примера:
Мы можем изменить этот абзац просто используя имя тега:
Или же можем воспользоваться именем класса:
.message
Или можем использовать идентификатор:
#introduction
Поскольку браузер может выбрать только один цвет и применить его к этому абзацу, то он должен решить, какое правило CSS имеет приоритет над другими. Это называется приоритетом в CSS (или специфичностью).
В нашем примере абзац будет красным, потому что идентификатор более специфичен и, таким образом, более важен, чем другие селекторы.
Порядок правил CSS
Если в вашем CSS есть одинаковые селекторы, то последний из них будет иметь приоритет.
p < color: green; >p < color: red; >/* Абзац будет красным */
Вычисление 100
Есть один быстрый способ выяснить, насколько правило CSS «сильное», путём вычисления специфичности селекторов:
Селектор с наивысшим «счётом» будет преобладать, независимо от порядка, в котором появляются правила CSS.
#introduction < color: red; >.message < color: green; >p
Правило #introduction < color: red; >является более специфичным, чем другие, потому что идентификаторы должны быть уникальными по всей веб-странице, таким образом, может быть только один целевой элемент.
.message < color: green; >будет нацелен на любой HTML-элемент с атрибутом class=»message» и, следовательно, менее специфичен. То же самое относится и к p < color: blue; >, который может предназначаться для любого абзаца.
Как избежать конфликтов
Во время написания вашего CSS могут легко возникнуть противоречивые правила, в которых одно и то же свойство применяется несколько раз.
Чтобы избежать этого:
- применяйте только классы: используйте .introduction вместо #introduction , даже если этот элемент появляется на вашей веб-странице только один раз;
- избегайте применять несколько классов к одному элементу HTML: пишите не , а , который является семантически более описательным;
- не используйте встроенные стили, такие как .
Специфичность
Специфичность — это способ, с помощью которого браузеры определяют, какие значения свойств CSS наиболее соответствуют элементу и, следовательно, будут применены. Специфичность основана на правилах соответствия, состоящих из селекторов CSS различных типов.
Как вычисляется специфичность?
Специфичность представляет собой вес, придаваемый конкретному правилу CSS. Вес правила определяется количеством каждого из типов селекторов в данном правиле. Если у нескольких правил специфичность одинакова, то к элементу применяется последнее по порядку правило CSS. Специфичность имеет значение только в том случае, если один элемент соответствует нескольким правилам. Согласно спецификации CSS, правило для непосредственно соответствующего элемента всегда будет иметь больший приоритет, чем правила, унаследованные от предка.
Примечание: Примечание: Взаимное расположение элементов в дереве документа не влияет на специфичность.
Типы селекторов
В следующем списке типы селекторов расположены по возрастанию специфичности:
- селекторы типов элементов (например, h1 ) и псевдоэлементов (например, ::before ).
- селекторы классов (например, .example ), селекторы атрибутов (например, [type=»radio»] ) и псевдоклассов (например, :hover ).
- селекторы идентификаторов (например, #example ).
Универсальный селектор ( * ), комбинаторы ( + , > , ~ , ‘«’) и отрицающий псевдокласс ( :not() ) не влияют на специфичность. (Однако селекторы, объявленные внутри :not() , влияют)
Стили, объявленные в элементе (например, style=»font-weight:bold» ), всегда переопределяют любые правила из внешних файлов стилей и, таким образом, их специфичность можно считать наивысшей.
Важное исключение из правил — !important
Когда при объявлении стиля используется модификатор !important , это объявление получает наивысший приоритет среди всех прочих объявлений. Хотя технически модификатор !important не имеет со специфичностью ничего общего, он непосредственно на неё влияет. Поскольку !important усложняет отладку, нарушая естественное каскадирование ваших стилей, он не приветствуется и следует избегать его использования. Если к элементу применимы два взаимоисключающих стиля с модификатором !important , то применён будет стиль с большей специфичностью.
Несколько практических советов:
- Всегда пытайтесь использовать специфичность, а !important используйте только в крайних случаях
- Используйте !important только в страничных стилях, которые переопределяют стили сайта или внешние стили (стили библиотек, таких как Bootstrap или normalize.css)
- Никогда не используйте !important , если вы пишете плагин или мэшап.
- Никогда не используйте !important в общем CSS сайта.
Вместо !important можно:
- Лучше использовать каскадные свойства CSS
- Использовать более специфичные правила. Чтобы сделать правило более специфичным и повысить его приоритет, укажите один элемент или несколько перед нужным вам элементом:
div id="test"> span>Textspan> div>
div#test span color: green; > div span color: blue; > span color: red; >
Вне зависимости от порядка следования правил, текст всегда будет зелёным, поскольку у этого правила наибольшая специфичность (при этом, правило для голубого цвета имеет преимущество перед правилом для красного, несмотря на порядок следования).
Вам придётся использовать !important если:
А) Первый сценарий:
- У вас есть общий файл стилей, устанавливающий правила для внешнего вида сайта.
- Вы пользуетесь (или кто-то другой пользуется) весьма сомнительным средством — объявлением стилей непосредственно в элементах
В таком случае вам придётся объявить некоторые стили в вашем общем файле CSS как !important , переопределяя, таким образом, стили, установленные в самих элементах.
Пример из практики: Некоторые плохо написанные плагины jQuery, использующие присваивание стилей самим элементам.
#someElement p color: blue; > p.awesome color: red; >
Как сделать цвет текста в абзацах awesome красным всегда, даже если они расположены внутри #someElement ? Без !important у первого правила специфичность больше и оно имеет преимущество перед вторым.
Как преодолеть !important
A) Просто добавьте ещё одно правило с модификатором !important , у которого селектор имеет большую специфичность (благодаря добавлению типа элемента (тэга), идентификатора (атрибута id) или класса к селектору).
Пример большей специфичности:
table td height: 50px !important; > .myTable td height: 50px !important; > #myTable td height: 50px !important; >
Б) Или добавьте правило с модификатором !important и таким же селектором, но расположенное в файле после существующего (при прочих равных выигрывает последнее объявленное правило):
td height: 50px !important; >
В) Или перепишите первоначальное правило без использования !important .
С более подробной информацией можно ознакомиться по следующим ссылкам:
Не исключение — :not()
Отрицающий псевдокласс :not не учитывается как псевдокласс при расчёте специфичности. Однако селекторы, расположенные внутри :not , при подсчёте количества по типам селекторов рассматриваются как обычные селекторы и учитываются.
Следующий фрагмент CSS .
div.outer p color: orange; > div:not(.outer) p color: lime; >
. применённый к такому HTML .
div class="outer"> p>Это div.outerp> div class="inner"> p>Это текст в div.innerp> div> div>
. отобразится на экране так:
Это текст в div.inner
Специфичность основана на форме
Специфичность опирается на форму селектора. В следующем примере, при определении специфичности селектора, селектор *[id=»foo»] считается селектором атрибута, даже при том, что ищет идентификатор.
Эти объявления стилей .
*#foo color: green; > *[id="foo"] color: purple; >
. применённые к нижеследующей разметке .
p id="foo">Это пример.p>
. в результате выглядят так:
Потому что оба правила соответствуют одному и тому же элементу, но селектор идентификатора имеет большую специфичность.
Независимость от расположения
Взаимное расположение элементов, указанных в селекторе не влияет на специфичность правила. Следующие объявления стилей .
body h1 color: green; > html h1 color: purple; >
. в сочетании со следующим HTML .
html> body> h1>Вот заголовок!h1> body> html>
Потому что, хотя оба объявления имеют одинаковое количество типов селекторов, но селектор html h1 объявлен последним.
Непосредственно соответствующие элементы и унаследованные стили
Стили непосредственно соответствующих элементов всегда предпочитаются унаследованным стилям, независимо от специфичности унаследованного правила. Этот CSS .
#parent color: green; > h1 color: purple; >
html> body id="parent"> h1>Вот заголовок!h1> body> html>
. тоже отобразится как:
Потому что селектор h1 непосредственно соответствует элементу, а стиль, задающий зелёный цвет, всего лишь унаследован от родителя.
Дополнительная информация
- Калькулятор специфичности: Интерактивный сайт, помогающий вам проверить и понять ваши собственные правила CSS — https://specificity.keegan.st/
- Специфичность селекторов в CSS3 — http://www.w3.org/TR/selectors/#specificity
- Ключевые концепции CSS
- Синтаксис CSS
- @-правила
- комментарии
- специфичность
- наследование
- блочная модель
- режимы компоновки
- модели визуального форматирования
- Схлопывание отступов
- Значения
- начальные
- вычисленные
- используемые
- действительные
Found a content problem with this page?
- Edit the page on GitHub.
- Report the content issue.
- View the source on GitHub.
This page was last modified on 7 авг. 2023 г. by MDN contributors.
Your blueprint for a better internet.
Каскадность CSS: определяем приоритет стиля, когда нужен тег important
В CSS приоритет стиля задается разработчиком. Вся прелесть в том, что одному и тому же элементу можно задать несколько разных стилей. А применяться будет тот, у которого выше приоритет.
CSS — это Cascading Style Sheets, переводится как «каскадные таблицы стилей». «Каскадность» CSS-таблиц является очень важным их свойством. Каскадность в этом контексте — возможность подключать к одному и тому же HTML-элементу разные стилевые правила и разные стилевые документы. При этом браузер показывает стили согласно правилам приоритетности. Сегодня мы обсудим, что такое приоритет стиля в CSS.
Приоритет стиля CSS
Представьте, что вы создаете «чистый» HTML-код, не прописав ни одного CSS-свойства элементам. В этом случае, браузер все равно отразит HTML-элементы в каком-то примитивном стиле, потому что внутри браузера уже заложены «базовые» стили для HTML. Таким образом мы имеем браузерные примитивные CSS-стили, которые «автоматически» добавляются к HTML-компонентам. Браузерные стили имеют самый низкий приоритет.
Более высокий приоритет имеют CSS-стили, которые прописаны разработчиком. Однако при определении стилей, обязательно нужно учитывать, что один вид стилей всегда будет перекрывать другой вид стилей. Чтобы не сталкиваться с ситуацией, что ваши стили не работают, а вы не знаете почему, тогда нужно понимать как распределяется приоритет между разными стилевыми правилами CSS.
Приоритет CSS-стилей по способу их размещения
- Создать таблицу стилей отдельным документом и подключить ее в собственном проекте. Отдельный файл стилей может быть таким: «style.css». Чтобы его подключить нужно в разделе «head» вашего HTML-документа прописать такую строчку: «».
- Создать внутреннюю таблицу прямо внутри HTML-документа. Она создается в разделе «head» вашего HTML-проекта между тегами
. Такой подход удобен, если вы создаете небольшой проект.
- Описать стиль у каждого элемента, применив атрибут «style». Например так: .
Приоритет CSS-стиля в зависимости от выбранного селектора
- Селектор тега. Это когда в CSS-свойствах вы задаете стили не какому-то конкретному элементу, а всем элементам документа, которые определяются определенным тегом. Например: всем элементам «h1», «p», «ul», «td» и др.
- Селектор класса. В этом случае разработчик задает один класс нескольким элементам. А потом в CSS-свойствах прописывает стили этого класса. В этом случае стили будут применяться ко всем элементам, которым задан этот класс. Такой подход позволять задавать свойства сразу нескольким HTML-элементам. При этом список элементов класса разработчик задает самостоятельно.
- Селектор идентификатора (ID). Одни идентификатор принадлежит одному элементу. Нельзя задавать один и тот же идентификатор нескольким элементам. В этом случае нужно применить класс элементов. Таким образом, идентификатор — это способ задать CSS-свойства одному определенному HTML-элементу.
- самый высокий CSS-приоритет у идентификатора;
- самый низкий CSS-приоритет у селектора тега.
Термин «!important» в таблице стилей
Случаи бывают разные. Например , вам срочно нужно задать определенный стиль какому-то HTML-элементу. Вы не можете найти место, где ему определяются стили, потому что к проекту подключено много внешних и внутренних таблиц стилей. Разбираться в их иерархии нет времени. В этом случае, вам может помочь термин «!important».
Что делает этот термин? Он «ломает» каскадность и приоритет всех стилей CSS, потому что определяет тот стиль, рядом с которым он прописан. Селектор или «уровень таблицы» ему неважен. Термин «!important» «перебивает» даже т е стили, которые прописаны в атрибутах HTML-элемента, хотя они по приоритету являются самыми высокими.
Применять термин «!important» нужно очень осторожно. Потому что он ломает иерархию стилей, а значит может вызвать их конфликт. Веб-разработчики рекомендуют его применять в исключительных случаях, когда по-другому не получается задать стили элементу страницы.
Заключение
Сегодня мы разобрали, как распределяется приоритет стилей в CSS. Мы рассмотрели всю каскадность стилей в зависимости от способа объявления стилей и от иерархии селекторов. Чтобы быстро «вознести до небес» любой стиль, можно применить термин «!important». Однако применять его нужно осторожно, так как если его часто и много использовать, ваши стили в конце концов «сломаются» и будут работать неправильно.
Мы будем очень благодарны
если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.
