Что такое каскадность в css
Перейти к содержимому

Что такое каскадность в css

  • автор:

Принцип каскада

Один из основных принципов работы CSS. Стили читаются и применяются сверху вниз.

Время чтения: 6 мин

Открыть/закрыть навигацию по статье

  1. Источники правил
  2. Область видимости
  3. Специфичность
  4. Порядок в коде
  5. Влияние на каскад ��
    1. Начальное значение — initial
    2. Заимствование у родителя — inherit
    3. Отмена значения — unset
    4. Сброс значения — revert
    1. Николай Лопин советует
    2. Realetive советует

    Контрибьюторы:

    Обновлено 27 марта 2023

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

    Большой Каскад в Петергофе

    Каскад — одно из важнейших понятий в CSS. Само название CSS — Cascading Style Sheets, «каскадные таблицы стилей» явно упоминают это неочевидное определение.

    Каскад — не специфичность!

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

    Источники правил

    Скопировать ссылку «Источники правил» Скопировано

    Чем выше — тем «важнее»:

    1. Стили во время CSS-переходов ( transition );
    2. Браузерные стили с !important ;
    3. Пользовательские стили с !important ;
    4. Авторские (мы с вами пишем именно эти стили) стили с !important ;
    5. Стили во время анимаций ( animation );
    6. Обычные (т. е. без !important ) авторские стили;
    7. Обычные пользовательские стили;
    8. Обычные браузерные стили.

    Иногда браузеры нарушают этот порядок — порой осознанно (например, могут запретить делать слишком мелкий шрифт в полях ввода, как это делал Google Chrome) или по ошибке (до недавнего времени стили при анимации перекрывали остальные стили только в Firefox).

    Область видимости

    Скопировать ссылку «Область видимости» Скопировано

    Со свойствами, описанными через классические CSS-селекторы (классы, теги, id, атрибуты) иначе — чем точнее мы описываем правило для селектора, тем сильнее мы суживаем область видимости (т. е. как бы точнее прицеливаемся), тем самым увеличивая и приоритетность правила. Но это работает до тех пор, пока CSS-правило не содержит «подлого» !important . Именно поэтому их использование считается плохой практикой — они «меняют правила игры». Это правило мгновенно становится приоритетнее, но чем шире область видимости — тем оно важнее ��

    Специфичность

    Скопировать ссылку «Специфичность» Скопировано

    Установим цвет текста абзаца в красный:

      p  color: red;>   Цвет текста будет красным — единственное правило описано в теге <style>.  style> p  color: red; > style> p> Цвет текста будет красным — единственное правило описано в теге <style>. p>      

    Теперь переопределим цвет текста более специфичным инлайн-правилом:

      p  color: red;>   Цвет текста стал синим — инлайн «перебивает» <style>.  style> p  color: red; > style> p style="color: blue"> Цвет текста стал синим — инлайн «перебивает» <style>. p>      

    Повысим специфичность, добавив !important в правила селектора:

      p  color: red !important;>   Цвет текста снова стал красным за счёт !important в <style>.  style> p  color: red !important; > style> p style="color: blue"> Цвет текста снова стал красным за счёт !important в <style>. p>      

    Последний «шанс» разработчику повлиять на правило — добавить !important в инлайн-стиль:

      p  color: red !important;>   Цвет текста снова синий — !important инлайн-правила «перебивает» даже !important в <style>.  style> p  color: red !important; > style> p style="color: blue !important"> Цвет текста снова синий — !important инлайн-правила «перебивает» даже !important в <style>. p>      

    Инлайн-стили и !important — крайние меры влияния на стилизацию, правильнее описывать стили в селекторах в файлах. Но разные правила можно описать так, что они будут претендовать на одну и ту же сущность (тег и его содержимое). В этом случае на применимость правила будет влиять специфичность, т. е. тип (тег, класс, id, атрибуты и псевдоклассы) и их совокупность и комбинации. Самый простой способ разобраться в этом разнообразии — использовать так называемый калькулятор специфичности. Можно воспользоваться одним из множества онлайн-сервисов:

    • Specificity Calculator
    • CSS Specificity calculator | Polypane Browser for Developers
    • CSS Specificity Calculator. * CodeCaptain

    Подробнее про специфичность можно прочитать в статье «Специфичность».

    Порядок в коде

    Скопировать ссылку «Порядок в коде» Скопировано

    Тут ещё проще — при равной специфичности правила, написанные ниже по ходу чтения переопределяют написанное выше:

      .color_red  /* Определяем начальное значение */ color: red;> .color_red  /* Переопределяем написанное ранее правило */ color: blue;>  

    Цвет текста — синий!

    style> .color_red /* Определяем начальное значение */ color: red; > .color_red /* Переопределяем написанное ранее правило */ color: blue; > style> p class="color_red">Цвет текста — синий!p>

    Влияние на каскад ��

    Скопировать ссылку «Влияние на каскад ��» Скопировано

    Помимо знания как и где написать селектор, можно управлять каскадом с помощью CSS-свойств!

    Начальное значение — initial

    Скопировать ссылку «Начальное значение — initial» Скопировано

    Любое CSS-правило можно сбросить на начальное значение — то, которое было у правила до того как было установлено явно разработчиком. color станет #000 , position — static , display — inline , padding и margin — 0 и так далее.

    Даже если для тега какое-то свойство имеет конкретное значение (например, для по умолчанию браузером ставится display : block ), установка initial выставит именно дефолтное значение без учёта значения для тега (то есть для свойство display : initial вычислится как inline ).

    Заимствование у родителя — inherit

    Скопировать ссылку «Заимствование у родителя — inherit» Скопировано

    Некоторые свойства наследуются от родителя автоматически ( color , font , text — align и другие). Но можно и явно позаимствовать какое-то значение у родителя:

     div class="wrapper"> div class="inner">div> div>      
     .wrapper  background-color: #2E9AFF; border: 10px solid #FFFFFF;> .inner  background-color: #F498AD; border: inherit;> .wrapper  background-color: #2E9AFF; border: 10px solid #FFFFFF; > .inner  background-color: #F498AD; border: inherit; >      

    Отмена значения — unset

    Скопировать ссылку «Отмена значения — unset» Скопировано

    По своему поведению unset чем-то похож на initial + inherit — если это свойство ненаследуемое от родителя — оно сбросится до начального значения, наследуемое — получит значение родителя.

    Сброс значения — revert

    Скопировать ссылку «Сброс значения — revert» Скопировано

    Это менее строгий режим сброса — он отменяет все установленные разработчиком значения для данного свойства до значения, которое считается браузером «значением по умолчанию».

    Подсказки

    Скопировать ссылку «Подсказки» Скопировано

    �� В CSS есть такое волшебное свойство — all — это своеобразный шорткат (сокращённый формат записи), который внутри себя содержит все-все CSS-свойства. В сочетании с initial , inherit , unset или revert это позволяет повлиять на каскад в одну строчку.

    Все наследуемые свойства .widget и вложенных элементов будут сброшены:

     .widget  all: revert;> .widget  all: revert; >      

    На практике

    Скопировать ссылку «На практике» Скопировано

    Николай Лопин советует

    Скопировать ссылку «Николай Лопин советует» Скопировано

    �� Если вы знакомы с JavaScript, то каскад можно представить как создание объекта через спред-синтаксис на основе приоритета стилей:

     const styles =  . inheritedStyles, . tagStyles, . classStyles, . idStyles, . inlineStyles, . importantStyles, . transitionStyles> const styles =  . inheritedStyles, . tagStyles, . classStyles, . idStyles, . inlineStyles, . importantStyles, . transitionStyles >      

    + Развернуть

    Realetive советует

    Скопировать ссылку «Realetive советует» Скопировано

    �� Понимание каскада — один из ключевых моментов в понимании работы CSS. С опытом вы научитесь так эффективно писать селекторы и группировать стили, что сам уровень каскада будет минимальным — это ускоряет «чтение» кода и упрощает поддержку. Ну и в идеале — исключить необходимость использования !important .

    Что такое каскадность в css

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

    В CSS действует механизм каскадности, которую можно определить как набор правил, определяющих последовательность применения множества стилей к одному и тому же элементу.

    К примеру, у нас определена следующая веб-страница:

        Каскадность стилей в CSS3   

    Для просмотра подробной информации пройдите по ссылке: Основы CSS 3

    В CSS определено три стиля и все они применяются к ссылке.

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

    Так, в данном случае, все три стиля не конфликтуют между собой, поэтому все эти стили будут применяться к ссылке:

    Каскадность в CSS 3

    Если же стили конфликтуют между собой, например, определяют разный цвет текста, то в этом случае применяется сложная система правил для вычисления значимости каждого стиля. Все эти правила описаны в спецификации по CSS: Calculating a selectors specificity. Вкратце разберем их.

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

    • Селекторы тегов имеют важность, оцениваемую в 1 балл
    • Селекторы классов, атрибутов и псевдоклассов оцениваются в 10 баллов
    • Селекторы идентификаторов оцениваются в 100 баллов
    • Встроенные inline-стили (задаваемые через атрибут style ) оцениваются в 1000 баллов
        Каскадность стилей в CSS3   Основы CSS 3   

    Здесь к ссылке применяется сразу три стиля. Эти стили содержат два не конфликтующих правила:

    font-size: 20px; font-weight: bold;

    которые устанавливают высоту шрифта 20 пикселей и выделение ссылки жирным. Так как каждое из эти правил определено только в одном стиле, то в итоге они будут суммироваться и применяться к ссылке без проблем.

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

    #index

    Если селектор является составным, то происходит сложение баллов всех входящих в селектор подселекторов. Так, рассмотрим следующий пример:

    В CSS определено аж пять различных селекторов, которые устанавливают цвет ссылок. В итоге браузер выберет селектор #menu a и окрасит ссылки в темно-синий цвет. Но почему, на каком основании браузер выберет этот селектор?

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

    CSS: Каскадность

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

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

        Название документа   

    Цвет текста абзаца зелёный.

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

    h1 < color: gray; font-family: sans-serif; >h1

    Код, расположенный в примере выше, равносилен коду в примере ниже, в котором все три свойства указаны в одном правиле:

    Обычно дополнительные правила для элемента указываются в тех случаях, когда был задан один стиль сразу для нескольких элементов, но помимо этого необходимо добавить что-то ещё для определённого элемента:

    h1, h2, h3 < /* одинаковый стиль для трёх элементов */ color: gray; font-family: sans-serif; >/* дополнительное правило для заголовков второго уровня */ h2

    С этой темой смотрят:

    • CSS селекторы
    • Наследование стилей
    • Специфичность (приоритет) CSS селекторов

    Копирование материалов с данного сайта возможно только с разрешения администрации сайта
    и при указании прямой активной ссылки на источник.
    2011 – 2024 © puzzleweb.ru | razumnikum.ru

    Каскадность в CSS: как высчитываются приоритеты (специфичность) стилей

    CSS — это каскадные таблицы стилей (Cascading Style Sheets). Каскадность — это главный принцип css — это приоритет одних правил/стилей над другими. Когда одни стили перебивают другие. Это понятие также называется «специфичность селектора».

    Читайте также о специфичности: https://developer.mozilla.org/ru/docs/Web/CSS/Specificity

    • Все CSS селекторы.
    • Типы селекторов.
    • CSS Функции.

    При вычислении приоритета браузер определяет «Вес» каждого CSS правила, который складывается из веса отдельных селекторов этого правила. Стили менее весомых правил перебиваются стилями более весомых. В результате элемент получает собранные стили от самых «весомых» правил. Все это и есть каскадность.

    Таблица веса (числа) для каждого селектора:

    Тип селектора Описание селектора Вес (число)
    * универсальный селектор 0
    div тег 1
    :first-letter псевдо-элемент 1
    .text класс 10
    :hover псевдо-класс 10
    [атрибут=»значение»] селектор атрибута 10
    #content селектор по id 100
    style=»color:red;» стили в style атрибуте 1000
    !important суффикс увеличения веса 10000

    Из правил с одинаковым весом выбираются те, которые ближе к концу HTML страницы (ниже в коде).

    Пример подсчета веса (вес представляет из себя число):

    #content .text p < color:red; >/* 100 + 10 + 1 = 111 */ .text p < color:blue; >/* 10 + 1 = 11 */

    Тег

    внутри элемента .text получит стиль color:red; , а не color:blue; , потому что число 111 больше чем 11.

    Теперь давайте посчитаем веса на примере:

    * <> /* = 0 */ li <> /* = 1 */ li::first-line <> /* = 2 */ ul li <> /* = 2 */ ul ol + li <> /* = 3 */ ul li.red <> /* = 12 */ li.red.level <> /* = 21 */ li:not(.red)<> /* = 11 */ li:not(.red):not(.green)<> /* = 11 */ #t34 <> /* = 100 */ #content #wrap <> /* = 200 */

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

    Трюк с увеличением веса. Допустим у нас есть один селектор в правиле, но нам нужно увеличить приоритет стилей, при этом не добавляя каких-то дополнительных селекторов. Сделать это можно просто продублировав селектор или добавишь селектор атрибута или псевдо-класса:

    .class.class < color:blue; >/* сильнее чем .class */ .class < color:red; >img[src] < >/* вес = 11 */

    Приоритет @media

    Медиа правила @media ( max-width:500px ) < >не участвуют в подсчете приоритета (веса).

    Поэтому они всегда должны располагаться ниже всех остальных правил, чтобы перебивать предыдущие правила с таким же весом (приоритетом).

    .section < width:100%; >@media ( max-width:500px ) < .section < width:50%; >>

    @media ( max-width: 500px ) < .section < width:50%; >> .section

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *