Css наследование: Наследование — CSS | MDN
Содержание
Наследование — CSS | MDN
Описание каждого CSS свойства говорит наследуется ли оно по умолчанию («Наследуется: да/нет»). Наследование контролирует, что происходит, если значение свойства элемента не определено.
Когда никакого значения для свойства, которое наследуется, у элемента не установлено, элемент получает вычисленное значение этого свойства от его родителя. Только корневой элемент документа получает начальное значение из описания свойства.
Типичный пример наследуемого свойства color
(en-US). Стили:
и разметка:
<p>В этом параграфе <em>подчёркнутый текст</em>.</p>
слова «подчёркнутый текст» станут зелёными, т.к. тег em
унаследовал значение свойства color
(en-US) от элемента p,
а не получают начальное значение свойства (цвет, который используется для корневого элемента, когда страница не определяет цвет).
Когда значения свойства элемента, которое не наследуется, не указано(иногда называемое Mozilla — сброшенное свойство), элемент получает начальное значение этого свойства (как указано в описании свойства).
Пример ненаследуемого свойства border
. Стили:
p { border: medium solid }
и разметка:
<p>В этом параграфе <em>подчёркнутый текст</em>.</p>
у слов «подчёркнутый текст» не будет рамки (т.к. начальное значение border-style
(en-US):none
).
Ключевое слово inherit
позволяет нам явно задать наследование. Это работает и на наследуемых, и на ненаследуемых свойствах.
- CSS документация
- Ключевые концепции CSS:
Синтаксис CSS,
@-правила,
комментарии,
специфичность и
наследование,
блочная модель,
режимы компоновки и
модели визуального форматирования,
схлопывание отступов (en-US),
начальные,
вычисленные,
решённые,
указанные,
используемые и
действительные значения.
Синтаксис определения значений (en-US),
сокращённые свойства и
замещаемые элементы. inherit
CSS3 | Наследование стилей
Наследование стилей
Последнее обновление: 21.04.2016
Для упрощения определения стилей в CSS применяется механизм наследования стилей. Этот механизм предполагает, что вложенные элементы могут наследовать
стили своих элементов-контейнеров. Например, пуcть у нас на веб-странице есть заголовок и параграф, которые должны иметь текст красного цвета. Мы можем
отдельно к параграфу и заголовку применить соответствующий стиль, который установит нужный цвет шрифта:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Наследование стилей в CSS3</title> <style> p {color: red;} h3 {color: red;} </style> </head> <body> <h3>Наследование стилей</h3> <p>Текст про наследование стилей в CSS 3</p> </body> </html>
Однако поскольку и элемент p, и элемент h3 находятся в элементе body, то они наследуют от этого контейнера — элемента body многие стили. И чтобы не дублировать определение стиля,
мы могли бы написать так:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Наследование стилей в CSS3</title> <style> body {color: red;} </style> </head> <body> <h3>Наследование стилей</h3> <p>Текст про наследование стилей в CSS 3</p> </body> </html>
В итоге определение стилей стало проще, а результат остался тем же.
Если нам нежелателен унаследованный стиль, то мы его можем переопределить для определенных элементов:
body {color: red;} p {color: green;}
При нескольких уровнях вложенности элементы наследуют стили только ближайшего контейнера:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>Наследование стилей в CSS3</title> <style> body {color: red;} div {color:black;} </style> </head> <body> <div> <h3>Наследование стилей</h3> <p>Текст про наследование стилей в CSS 3</p> </div> <p>Copyright © MyCorp.com</p> </body> </html>
Здесь веб-страница имеет следующую структуру:
Для элемента div переопределяется цвет текста. И так как элемент h3 и один из параграфов находятся в элементе div, то они наследуют стиль именно элемента div.
Второй параграф находится непосредственно в элементе body и поэтому наследует стиль элемента body.
Однако не ко всем свойствам CSS применяется наследование стилей. Например, свойства, которые представляют отступы (margin, padding) и границы (border) элементов, не наследуются.
Кроме того, браузеры по умолчанию также применяют ряд предустановленных стилей к элементам. Например, заголовки имеют определенную высоту и т.д.
Наследование в CSS на примерах — Site on!
Заметка: активирована адаптивная версия сайта, которая автоматически подстраивается под небольшой размер Вашего браузера и скрывает некоторые детали сайта для удобства чтения. Приятного просмотра!
05.04.2013
Рад снова всех вас приветствовать на страницах блога Site on! В прошлой статье мы кратко поговорили об основах CSS и разобрали несколько простых примеров. Сегодня наша тема – это такая важная вещь, как наследование в CSS. Наследованием в CSS называется передача свойств от элемента родителя к дочерним элементам. Или если вам будет понятней: передача CSS свойств от верхнего тега к вложенным в него. Причём наследуется ли свойство или не наследуется зависит от самого свойства, а не от тегов, к которым оно применено. Как это работает? Да очень просто, вернёмся к нашему макету, с помощью которого мы научились создавать нашу первую веб-страницу:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8" /> <title>Как создать веб страницу?</title> </head> <body> И здесь пишем любой интересующий нас текст. </body> </html>
Если мы запишем в CSS:
body{ color: green; }
То цвет надписи «И здесь пишем любой интересующий нас текст» как ни странно станет зелёным. А что будет, если мы нашу надпись заключим в блок? То есть вот какой стала интересующая нас часть кода:
<body> <div> И здесь пишем любой интересующий нас текст. </div> </body>
То надпись всё равно останется зелёной, так как свойство color наследуется, а значит, передалось от тега body к вложенному в него тегу div и дальше (если бы было куда). И сразу вам задачка: какого цвета будет наша надпись, если мы имеем следующий код
<head> <style> body{ color: green; } div{ color: red; } </style> </head> <body> <div> <span>И здесь пишем любой интересующий нас текст.</span> </div> </body>
Для справки <span> — тег, который просто обозначает какой-либо участок текста. Если в CSS для него ничего не задано, то он ничего и не делает.
Правильный ответ: красным. Так как тег div перебил наследование от body (но только для тегов, вложенных внутрь div).
Какой приоритет имеет наследование в CSS ?
Да ровным счётом никакого. Приоритет наследования в CSS даже не равняется нулю, его просто нет. О чём нам это говорит? Да о том, что любое свойство, заданное вложенному тегу напрямую, будет исполняться вместо того свойства, которое он бы унаследовал (но мы не дали этому случится, так как указали это же самое свойство, но с другим значением).
Об этом ярко свидетельствует предыдущий пример, где тег div не дал тегу span унаследовать зелёный цвет текста от тега body, а всё потому, что мы для тега div явно объявили красный цвет, а значит, приоритет у красного цвета наивысший…
А может быть и нет? Давайте рассмотрим пример ниже, где для одного и того же тега будет явно, но различным образом, указано одно и тоже свойство. Итак, смотрим наш CSS:
div p { Color: green; } p{ color:red; }
И там и там явно указан цвет именно для параграфов, но в одном из случаев, только для параграфов внутри блока, посмотрим же результат:
<div> <p> Текст внутри блока зелённый </p> </div> <p> А просто внутри параграфа - красный </p>
Да друзья, на этот раз ничего революционного, победила логика 🙂 Ведь действительно, на то они и каскадные таблицы, чтобы было можно указывать цвета отдельно для вложенных элементов и не беспокоится за «пересекающиеся» свойства.
Подытожим: наследование в CSS имеет наименьший из возможных приоритетов, однако стоит помнить, что не все свойства наследуются. Свойства, у которых имеется уточнение обстоятельств (при наведении мыши; если один тег вложен в другой, и тд.) имеют приоритет над свойствами, указанными для всех остальных случаев.
Ещё один важный момент: если после значения CSS свойства поставить пробел и написать !important, то это свойство всегда и везде будет иметь наивысший приоритет. Пример записи:
p{ color:red !important; }
Я бы советовал избегать такого приёма, вместо этого заранее продумать правильную структуру, чтобы не приходилось так грубо перекрывать одно свойство другим, однако иногда его использование может быть очень практичным.
И напоследок вот что вы должны иметь ввиду, если у вас что-то не получается — если написать так:
p{ color:red; } p{ color:green; }
То применится то значение, которое в коде находится ниже, то есть green. Подобных случаев может быть много, особенно пока у вас мало опыта и при этом они могут быть довольно разнообразными, чтобы быстро сориентироваться в проблеме, советую использовать просмотр элементов страницы с помощью веб-инспекторов. О том, как ими пользоваться и что это такое вы можете прочесть по приведённой выше ссылке.
Заметки:
1) Свойства, указанные для класса (class) или уникального идентификатора (id), имеют высший приоритет, причём приоритет у id, выше чем у class. Всё об этих селекторах и о понятии селектора в целом вы узнаете в следующей статье.
Ещё раз напомню вам о том, что лучший учитель по HTML и CSS – это практика + справочник, который я, между прочим, рекомендовал в статье об основах XHTML (HTML). Также рекомендую подписаться на обновления моего блога, так как после общеобразовательных и вступительных статей я обязательно напишу о некоторых тонкостях и, если можно так выразиться, секретах правильной вёрстки сайта.
На сегодня всё, спасибо за ваше внимание!
Пожалуйста, оцените эту статью
Средняя оценка: 4.52 из 5 (проголосовало: 91)
Статья оказалась вам полезной? Подпишитесь, чтобы не пропустить новые!
Вы можете помочь развитию проекта, сделав всего 1 клик:
Спасибо!
Учебник CSS 3. Статья «Наследование в CSS»
Эта статья будет посвящена такой важной теме как наследование стилей. Основная цель данной статьи учебника заключается в том, чтобы донести до Вас механизм работы наследования стилей, объяснить Вам в чем заключаются его основные плюсы и разобрать некоторые не очевидные на этот счет вещи.
Зачастую, если у ребёнка родители чудаки, то он от них не отстает, или как говорится: «яблоко от яблони недалеко падает». Что касается наследования в CSS, то это не что иное, как метод тиражирования различных CSS свойств, относящихся к одному элементу страницы на вложенные в него элементы (потомки).
Давайте сразу перейдем к примеру и рассмотрим наследование стилей на примере HTML элемента <body>, который определяет видимое содержимое страницы.
Рис.28 Схема наследования стиля в CSS.
Создадим стиль для элемента <body>, который будет изменять цвет и тип шрифта:
<!DOCTYPE html> <html> <head> <meta charset = "UTF-8"> <title>Пример наследования стиля в CSS</title> <style> body { /* используем селектор типа */ color: green; /* устанавливаем цвет текста */ font-family: arial; /* устанавливаем тип шрифта */ } </style> </head> <body> <h3>Заголовок второго уровня</h3> <p>Полный <strong>абзац</strong></p> </body> </html>
В этом примере для элемента <body> мы установили зеленый цвет текста и тип шрифта Arial.
CSS свойства color и font-family наследуются, а это означает, что эти свойства будут применяться и на вложенные элементы внутри <body> (на все его потомки).
Обращаю Ваше внимание на то, что вы всегда можете посмотреть наследуется или нет конкретное свойство в полном справочнике CSS.
Результат нашего примера:
Рис. 29 Пример наследования стиля в CSS.
В выше рассмотренном примере все элементы, расположенные внутри <body> (его потомки) унаследовали его свойства.
Механизм наследования имеет многоуровневую систему и распространяется не только на прямых потомков элемента, но и переносится на все вложенные элементы. В нашем примере к такому элементу относится элемент <strong>, который по аналогии с другими элементами унаследовал все свойства стиля, заданного для элемента <body>. В этом заключается основной смысл наследования, который используется в CSS.
Механизм наследования значительно сокращает код CSS, например, если бы наш элемент <strong> получил цвет по умолчанию – чёрный, то нам пришлось бы отдельно для этого элемента устанавливать стиль, который бы определял как цвет, так и тип шрифта, что значительно увеличивало бы трудозатраты на разработку конкретной страницы.
Еще один момент, который обязательно необходимо понять, это то, что аналогично действует механизм наследования не только для селекторов типа, но и для всех типов селекторов, рассмотренных в предыдущих статьях, посвященной этой тематике. Допустим, мы создали селектор класса с аналогичными CSS свойствами и применили его к элементу <body>, то в этом случае все элементы, вложенные в него также унаследуют эти свойства.
Вы будете в дальнейшем использовать эти особенности CSS для упрощения Вашей работы по созданию стилей для элементов документа.
Ограничения и нюансы наследования
Ограничения:
- Не наследуются свойства, которые влияют на размещение элементов на странице, свойства отвечающие за внешние и внутренние отступы элемента, свойства отвечающие за границы элементов. Все эти свойства мы подробно рассмотрим далее в учебнике. Повторюсь, что вы всегда можете посмотреть наследуется или нет конкретное свойство на сайте в справочнике CSS.
- Я хочу, чтобы вы поняли, что многие свойства не наследуются по объективным причинам, представьте, что мы создаем границу для родительского элемента и после этого все потомки по этой логике должны унаследовать это свойство, что выглядело бы абсурдно и напротив увеличивало бы работу по созданию стилей (их отмене, или сбросу).
Нюансы:
Все современные браузеры используют собственные встроенные CSS стили для HTML элементов, эти стили, при необходимости, вы можете посмотреть у конкретного элемента на сайте в справочнике HTML (значение CSS по умолчанию). В следующей статье мы научимся обнулять встроенные стили для отображения ваших страниц одинаково во всех популярных браузерах.
А сейчас на примере элемента <a>, определяющего гиперссылку, мы рассмотрим пример в котором рассмотрим почему некоторые элементы не наследуют некоторые свойства своего предка:
<!DOCTYPE html> <html> <head> <meta charset = "UTF-8"> <title>Нюансы наследования стилей</title> <style> body { /* используем селектор типа */ color: green; /* устанавливаем цвет текста */ text-decoration: none; /* убираем декорирование текста (нижнее подчеркивание) */ } </style> </head> <body> <p>Абзац, который содержит внутри себя <a href = "#">гиперссылку</a>.</p> </body> </html>
В этом примере для элемента <body> мы установили следующие стили: зеленый цвет текста и отсутствие декорирования текста (убрали нижнее подчеркивание снизу). Обратите внимание на элемент <a> на изображении, он полностью не изменился. Давайте разберемся ниже (после просмотра изображения) почему так происходит.
Результат нашего примера:
Рис. 29а Нюансы наследования стилей.
При возникновении конфликта побеждает сильнейший, в CSS это, как правило, явно определенный стиль. Откроем инструменты разработчика (для Chrome это F12). Обратите внимание какие встроенные в браузер CSS свойства (user agent stylesheet) имеет любая ссылка (any link) в документе. Для неё заданы следующие стили: цвет текста синий (-webkit-link — значение браузера по умолчанию), декорирование текста (нижнее подчеркивание) и определено, что браузер устанавливает курсор автоматически (значение auto CSS свойства cursor).
Ниже отображаются свойства, которые были унаследованы (Inherited from) элементом <a> от <body>. Как вы можете заметить, браузер отбросил все стили элемента <body>, по той причине, что у элемента <a> стиль, который определяет цвет текста явно определен (встроенный стиль по умолчанию), а свойство, которое определяет декорирование текста не наследуется и отображается с небольшой прозрачностью в инструментах разработчика, но даже если бы оно наследовалось, то не применилось бы по аналогии с цветом теста (у элемента <a> это свойство тоже явно определно).
Такие конфликты между стилями всегда разрешает браузер, а по каким правилам определяет, кому отдает приоритет и как он в том, или ином случае себя должен повести, на чью сторону встать, определяется правилами каскадности. Подробнее о правилах каскадности мы поговорим в следующей статье учебника.
Вопросы и задачи по теме
Перед тем как перейти к следующей статье ответьте на следующие вопросы:
- Что представляет из себя механизм наследования в CSS?
Наследование — метод тиражирования различных CSS свойств, относящихся к одному элементу страницы на вложенные в него элементы (потомки).
- Где можно посмотреть наследуется или нет конкретное свойство если я не помню?
Вы всегда можете посмотреть наследуется или нет конкретное свойство на сайте в справочнике CSS.
- Где можно посмотреть какие встроенные CSS стили используются для HTML элементов?
При необходимости, вы можете посмотреть их на сайте в справочнике HTML выбрав конкретный элемент.
Наследование стилей CSS.
Сейчас давайте рассмотрим еще одну интересную особенность языка CSS, которая называется наследование.
Наследование — это перенос свойств от родительского элемента к дочернему элементу. Т.е. вы написали какое-то свойство для родительского элемента, а оно применилось для дочерних элементов.
Если вы будете разбираться со справочником CSS, то для каждого свойства есть колонка «Краткая информация». В этой колонке есть раздел «Наследуется».
Если там стоит значение «Да», значит это свойство переносит свое значение от родительских элементов к дочерним.
Давайте рассмотрим, как это работает.
Для примера, возьмем свойство color и оно у нас наследуется.
Предположим, что у нас имеется элемент div, который содержит внутри себя абзацы и другой элемент div.
<div> <p>Абзац 2</p> <div> <p>Абзац</p> </div> <p>Абзац 3 <a href="#">Ссылка</a></p> </div>
Если для родительского элемента добавить свойство color:red, то, несмотря на то, что у дочерних элементов не было присвоено свойство color, тем не менее все дочерние элементы унаследуют от родителя свойство color и станут красным цветом.
<div style="color:red;"> <p>Абзац 2</p> <div> <p>Абзац</p> </div> <p>Абзац 3 <a href="#">Ссылка</a></p> </div>
Имейте такую особенность языка CSS в виду. Т.е. есть свойства, которые наследуются дочерними элементами, а есть свойства, которые не наследуются, которые будут применяться только для родительского элемента и не будут применяться для всех дочерних.
При работе со сложными и большими страницами, с последствиями наследования приходится сталкиваться довольно часто.
Изучаем наследование в CSS
Время чтения: 2 мин.
Здравствуй, уважаемый читатель.
Это девятый урок изучения CSS. В этом уроке мы рассмотрим что такое наследование и как избежать ошибок при наследовании.
Перед изучением данного урока (наследование в CSS) пройдите предыдущие уроки:
Урок 1. Что такое CSS?
Урок 2. Базовые селекторы
Урок 3. Групповые селекторы и селекторы потомков
Урок 4. Псевдоселекторы ссылок
Урок 5. Шрифты
Урок 6. Оформление текста
Урок 7. Рамки
Урок 8. Оформление списков
Теория и практика
При написании CSS стилей мы сталкиваемся с проблемой, что некоторые наши свойства могут перекрывать другие свойства, которые июмет больший приоритет. Но также, как вы уже знаете из прошлых уроков, некоторые свойства могут наследовать значения от родителей. Рассмотрим как в коде наглядно это дело обстоит.
Пример html кода:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <html> <head> <title>Главная</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <link rel="stylesheet" type="text/css" href="style.css"> </head> <body> <div> <div> <p>Aliquam malesuada tellus justo, eget lacinia nunc rutrum a. Phasellus dictum tempor eleifend. Nunc ut magna non purus fermentum egestas ac eu nulla.</p> <p>Fusce est tellus, mattis quis nisl et, egestas posuere libero. Donec scelerisque tellus porttitor massa dictum pulvinar.</p> </div> <div> <p>Cras</p> <ul> <li>amet condimentum</li> <li>aliquam volutpat</li> <li>elementum interdum</li> </ul> </div> </div> </body> </html> |
Сейчас посмотрите на дерево, которое из себя представляет html:
Сейчас вы видите что по отношению к чему и как относиться. А сейчас пример CSS кода с наследованием. Допустим для <div> зададим стиль текста и цвет красный, <div> будет наследовать стиль и цвет текста, а <div> будет иметь другой стиль и цвет.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #content{ font:14px bold arial,verdana,sans-serif; color:#C91212; } .firstPar{ font:inherit; color:inherit; } .secondPar{ font:10px bold arial,verdana,sans-serif; color:#000CFF; } |
Как это выглядит в браузере:
Как видите во втором div-е мы задали другой стиль и не наследовали от блока родителя <div>. Стиль <div> является приоритетнее для элементов которые входят в этот блок, поэтому к ним не применился стиль <div>.
Вот как это воспринимает браузер(скриншот из Firebug — плагин для Mozilla Firefox):
Сегодня мы рассмотрели наследование. Это был легкий урок и я уверен что вы разберетесь в нем! Если что-то непонятно — пишите в комментариях.
CSS каскадирование, специфичность, наследование: что это и как правильно использовать?
Любой профессионал своего дела должен владеть терминологией. Если Вы занимаетесь версткой, можете ли без раздумий ответить на вопрос в заголовке статьи?
Возможно сейчас вы откроете для себя что-то новое. Давайте сделаем решительный шаг на пути к профессионализму:)
Наследование
Начнем с самой простой для понимания концепции CSS. Суть ее состоит в том, что стили, присвоенные некоторому элементу, наследуются всеми потомками (вложенными элементами), если они не переопределены явно. Например, размер шрифта и его цвет достаточно применить к дескриптору body чтобы все элементы внутри имели те же свойства. Но, для заголовков h2-h6 размер шрифта не будет присвоен, потому что у браузера для них есть своя таблица стилей по умолчанию, а наследованные стили имеют самый низкий приоритет. Аналогичная ситуация с цветом ссылок.
Таким образом, наследование позволяет сократить таблицу CSS. Но в то же время если стилей много, то отследить какой родительский элемент установил некоторое свойство, становится довольно сложно.
Каскадирование
Правила каскадирования позволяют разрешать ситуации, когда для одного элемента прописано несколько стилей. Каскадирование основано на присвоении некоторого приоритета каждому правилу. Авторские таблицы стилей имеют самый большой приоритет, меньший — пользовательские, самый низкий — таблицы стилей по умолчанию браузера. У пользователя есть возможность переопределить авторское правило путем добавления флага !important к своему.
Правила каскадирования определяют следующие приоритеты:
- пользовательские стили, отмеченные !important
- авторские стили, отмеченные !important
- авторские стили
- пользовательские стили
- стили по умолчанию
После каскадирования правила упорядочиваются на основе специфичности селекторов.
Специфичность
Специфичность — это некоторое число в системе с неопределенно высоким основанием, которое является отражением приоритета какого-либо правила. Вычисляется оно на основе специфичности каждого из селекторов, входящих в правило CSS.
Специфичность селектора разбивается на 4 группы — a b c d:
- если стиль встроенный, т.е. определен как, то а=1
- значение b равно количеству селекторов идентификаторов
- значение c равно количеству классов, псевдоклассов и селекторов атрибутов
- значение d равно количеству селекторов типов
Пример вычисления специфичности:
Селектор | Специфичность | Специфичность в системе с основанием 10 |
---|---|---|
Style=»» | 1,0,0,0 | 1000 |
#wrapper #content {} | 0,2,0,0 | 200 |
#content .datePosted {} | 0,1,1,0 | 110 |
div#content {} | 0,1,0,1 | 101 |
#content {} | 0,1,0,0 | 100 |
p.comment .datePosted {} | 0,0,2,1 | 21 |
p.comment {} | 0,0,1,1 | 11 |
div p {} | 0,0,0,2 | 2 |
p {} | 0,0,0,1 | 1 |
Неопределенно высокое основание системы счисления является следствием того, что неизвестно заранее, насколько большими будут числа a, b, c, d. Если они меньше 10, то удобно использовать десятичную СС.
Некоторые особенности:
- если два правила имеют одинаковую специфичность, то приоритетным становится правило, определенное последним
- наследованные стили имеют нулевую специфичность
На сегодня все. Комментируем, добавляем, исправляем:)
При подготовке статьи использовалась книга Энди Бадд: «Мастерская CSS: профессиональное применение web-стандартов».
Похожие записи
Если вам понравилась статья, подписывайтесь на обновления блога по rss или присоединяйтесь в twitter
Поделиться ссылкой с друзьями:
Наследование — CSS: каскадные таблицы стилей
В CSS наследование управляет тем, что происходит, когда для свойства элемента не указано значение.
CSS-свойств можно разделить на два типа:
- унаследованных свойств , которые по умолчанию установлены на вычисленное значение родительского элемента
- ненаследуемых свойств , для которых по умолчанию установлено начальное значение свойства
Обратитесь к любому определению свойства CSS, чтобы узнать, наследуется ли конкретное свойство по умолчанию («Унаследовано: да») или нет («Унаследовано: нет»).
Если для элемента не указано значение наследуемого свойства , элемент получает вычисленное значение этого свойства для своего родительского элемента. Только корневой элемент документа получает начальное значение, указанное в сводке свойств.
Типичным примером наследуемого свойства является свойство color
. С учетом стилевых правил:
… и наценка:
В этом абзаце есть выделенный текст .
… слова «выделенный текст» станут зелеными, поскольку элемент em
унаследовал значение свойства color
от элемента p
. Это не , а не получает начальное значение свойства (которое является цветом, который используется для корневого элемента, когда страница не указывает цвет).
Если для элемента не указано значение для ненаследуемого свойства , элемент получает начальное значение этого свойства (как указано в сводке свойств).
Типичным примером ненаследуемой собственности является свойство border
. С учетом стилевых правил:
p {граница: средне-твердые; }
… и наценка:
В этом абзаце есть выделенный текст .
… слова «выделенный текст» не будут иметь границы (так как начальное значение стиля границы
— нет
).
Ключевое слово inherit
позволяет авторам явно указать наследование.Он работает как с унаследованными, так и с ненаследуемыми свойствами.
Вы можете управлять наследованием сразу для всех свойств, используя сокращенное свойство all
, которое применяет его значение ко всем свойствам. Например:
p {
все: вернуться;
размер шрифта: 200%;
font-weight: жирный;
}
Это возвращает стиль свойства font
абзаца к пользовательскому агенту по умолчанию, если таблица стилей пользователя не существует, и в этом случае она используется вместо этого.Затем он удваивает размер шрифта и применяет жирный шрифт
из «полужирный»
.
- Значения CSS для управления наследованием:
наследование
,начальное
,снято
иоткат
- Представляем каскад CSS
- Каскад и наследование
- Ключевые концепции CSS:
Синтаксис CSS,
по правилу
Комментарии,
специфичность и
наследование,
коробка,
режимы компоновки и
модели визуального форматирования,
и падение маржи,
или начальный,
вычислено,
решено,
указано,
использовал,
и фактические значения.Определения синтаксиса значений,
сокращенные свойства
и заменил элементы.
Каскад и наследование — Изучение веб-разработки
Цель этого урока — развить ваше понимание некоторых из наиболее фундаментальных концепций CSS — каскад, специфичность и наследование — которые определяют, как CSS применяется к HTML и как разрешаются конфликты.
Хотя работа над этим уроком может показаться менее актуальной и немного более академичной, чем некоторые другие части курса, понимание этих вещей избавит вас от боли в дальнейшем! Мы рекомендуем вам внимательно проработать этот раздел и убедиться, что вы понимаете концепции, прежде чем двигаться дальше.
CSS означает Cascading Style Sheets , и это первое слово cascading невероятно важно для понимания — способ, которым ведет себя каскад, является ключом к пониманию CSS.
В какой-то момент вы будете работать над проектом и обнаружите, что CSS, который, по вашему мнению, должен быть применен к элементу, не работает. Обычно проблема заключается в том, что вы создали два правила, которые потенциально могут применяться к одному и тому же элементу. Каскад и тесно связанная с ним концепция специфичности — это механизмы, которые контролируют, какое правило применяется при возникновении такого конфликта.Какое правило стилизует ваш элемент, возможно, не то, что вы ожидаете, поэтому вам нужно понимать, как работают эти механизмы.
Здесь также важна концепция наследования , что означает, что некоторые свойства CSS по умолчанию наследуют значения, установленные для родительского элемента текущего элемента, а некоторые нет. Это также может вызвать поведение, которого вы не ожидали.
Давайте начнем с краткого обзора ключевых вещей, с которыми мы имеем дело, затем мы рассмотрим каждую по очереди и посмотрим, как они взаимодействуют друг с другом и с вашим CSS.Это может показаться набором сложных для понимания концепций. По мере того, как вы будете больше практиковаться в написании CSS, то, как он работает, станет для вас более очевидным.
Каскад
Таблицы стилей Каскад — на очень простом уровне это означает, что порядок правил CSS имеет значение; когда применяются два правила с одинаковой специфичностью, будет использоваться то, которое идет последним в CSS.
В приведенном ниже примере у нас есть два правила, которые могут применяться к h2
. h2
в конечном итоге окрашивается в синий цвет — эти правила имеют идентичный селектор и, следовательно, имеют одинаковую специфичность, поэтому побеждает последний в исходном порядке.
Специфичность
Специфика — это то, как браузер решает, какое правило применяется, если несколько правил имеют разные селекторы, но могут применяться к одному и тому же элементу. По сути, это мера того, насколько конкретным будет выбор селектора:
- Селектор элементов менее специфичен — он выберет все элементы этого типа, которые появляются на странице, поэтому получит более низкий балл.
- Селектор класса более специфичен — он выбирает только те элементы на странице, которые имеют определенное значение атрибута
class
— поэтому он получит более высокий балл.
Пример времени! Ниже у нас снова есть два правила, которые могут применяться к h2
. Нижний h2
окрашивается в красный цвет — селектор класса придает своему правилу более высокую специфичность, и поэтому оно будет применяться, даже если правило с селектором элементов отображается ниже в исходном порядке.
Мы объясним оценку специфичности и другие подобные вещи позже.
Наследование
Наследование также необходимо понимать в этом контексте — некоторые значения свойств CSS, установленные для родительских элементов, наследуются их дочерними элементами, а некоторые — нет.
Например, если вы установите для элемента color
и font-family
, каждый элемент внутри него также будет стилизован с этим цветом и шрифтом, если вы не применили к ним разные значения цвета и шрифта.
Некоторые свойства не наследуются — например, если вы установите для элемента ширину
, равную 50%, все его потомки не получат ширину 50% от ширины их родителя. Если бы это было так, использование CSS было бы очень неприятным!
Примечание: На страницах справки по свойствам MDN CSS вы можете найти окно технической информации под названием «Формальное определение», в котором перечислены некоторые точки данных об этом свойстве, включая то, унаследовано оно или нет. См., Например, раздел формального определения свойства цвета.
Эти три концепции (каскад, специфичность и наследование) вместе определяют, какой CSS к какому элементу применяется; в следующих разделах мы увидим, как они работают вместе. Иногда это может показаться немного сложным, но вы начнете запоминать их, когда станете более опытным с CSS, и вы всегда можете посмотреть подробности, если забудете! Даже опытные разработчики не помнят всех деталей.
В приведенном ниже видео показано, как можно использовать Firefox DevTools для проверки каскадности страницы, ее специфичности и многого другого:
Начнем с наследования.В приведенном ниже примере у нас есть
- с двумя уровнями неупорядоченных списков, вложенных в него. Мы дали внешнему
- s и тем, которые находятся внутри первого вложенного списка. Затем мы добавили специальный class-
во второй вложенный список и применили к нему другой цвет. Затем он наследуется через своих дочерних элементов.
— нет.Почему? На самом деле все три обязательно должны применяться, потому что правила, расположенные позже в исходном порядке, обычно переопределяют более ранние правила.Такие вещи, как ширина (как упомянуто выше), поля, отступы и границы, не наследуются. Если бы граница была унаследована дочерними элементами нашего списка, каждый отдельный список и элемент списка получили бы границу - вероятно, не такой эффект, который мы когда-либо хотели бы!
Какие свойства наследуются по умолчанию, а какие нет, во многом зависит от здравого смысла.
Управление наследованием
CSS предоставляет четыре специальных универсальных значения свойств для управления наследованием.Каждое свойство CSS принимает эти значения.
-
наследовать
- Устанавливает значение свойства, примененное к выбранному элементу, таким же, как у его родительского элемента. Фактически это «включает наследование».
-
начальный
- Устанавливает значение свойства, примененное к выбранному элементу, равным начальному значению этого свойства.
-
снято
- Сбрасывает свойство до его естественного значения, что означает, что если свойство наследуется естественным образом, оно действует как
наследование
, в противном случае оно действует какначальное
. -
вернуться
- Во многих случаях действует как
, сбрасывает
, однако возвращает свойство к стилю по умолчанию браузера, а не к значениям по умолчанию, примененным к этому свойству.
Мы можем просмотреть список ссылок и изучить, как работают универсальные ценности. Живой пример ниже позволяет вам поиграть с CSS и посмотреть, что происходит, когда вы вносите изменения. Игра с кодом - лучший способ разобраться с HTML и CSS.
Например:
- Ко второму элементу списка применен класс
my-class-1
.Это устанавливает цвет вложенного внутрь элемента - Вы понимаете, почему третье и четвертое звенья такого цвета? Третья ссылка имеет значение
, начальное значение
, что означает, что она использует начальное значение свойства (в данном случае черное), а не значение по умолчанию браузера для ссылок, которое является синим. Для четвертого установлено значениене установлено
, что означает, что текст ссылки использует цвет родительского элемента, зеленый. - Какая из ссылок изменит цвет, если вы определите новый цвет для элемента
a {color: red; }
?
Сброс всех значений свойств
Сокращенное свойство CSS
all
может использоваться для одновременного применения одного из этих значений наследования ко (почти) всем свойствам. Его значение может быть любым из значений наследования (наследует
,начальное
,не установлено
иливозвращается
).Это удобный способ отменить изменения, внесенные в стили, чтобы можно было вернуться к известной отправной точке, прежде чем начинать новые изменения.В приведенном ниже примере у нас есть две цитаты. Первый имеет стиль, примененный к самому элементу цитаты, второй имеет класс, примененный к цитате, который устанавливает значение
все
нане задано
.Попробуйте установить значение
для всех
на некоторые другие доступные значения и посмотрите, в чем разница.Теперь мы понимаем, почему абзац, вложенный глубоко в структуру вашего HTML, имеет тот же цвет, что и CSS, примененный к основному тексту, и из вводных уроков мы понимаем, как изменить CSS, применяемый к чему-либо в любой момент. в документе - путем присвоения CSS элементу или создания класса. Теперь мы внимательно рассмотрим, как каскад определяет, какие правила CSS применяются, когда несколько элементов могут стилизовать элемент.
Необходимо учитывать три фактора, перечисленных здесь в порядке возрастания важности.Более поздние отменяют более ранние:
- Заказ источника
- Специфичность
- Важность
Мы рассмотрим их, чтобы увидеть, как браузеры определяют, какой именно CSS следует применять.
Порядок источников
Мы уже видели, какое значение имеет порядок источников для каскада. Если у вас есть несколько правил с одинаковым весом, то победит то, которое идет последним в CSS. Вы можете думать об этом как о правилах, которые ближе к самому элементу, которые перезаписывают более ранние, пока последний не победит и не сможет стилизовать элемент.
Специфичность
Как только вы поймете, что порядок источника имеет значение, в какой-то момент вы столкнетесь с ситуацией, когда вы узнаете, что правило появляется позже в таблице стилей, но применяется более раннее, конфликтующее правило. Это связано с тем, что более раннее правило имеет на более высокую специфичность - оно более конкретное, и поэтому оно выбирается браузером в качестве того, которое должно стилизовать элемент.
Как мы видели ранее в этом уроке, селектор класса имеет больший вес, чем селектор элемента, поэтому свойства, определенные в классе, переопределяют свойства, применяемые непосредственно к элементу.
Здесь следует отметить следующее: хотя мы думаем о селекторах и правилах, которые применяются к тому, что они выбирают, перезаписывается не все правило, а только те же свойства.
Это поведение помогает избежать повторения в вашем CSS. Распространенной практикой является определение общих стилей для основных элементов, а затем создание классов для тех, которые отличаются друг от друга. Например, в таблице стилей ниже мы определили общие стили для заголовков уровня 2, а затем создали несколько классов, которые изменяют только некоторые свойства и значения.Первоначально определенные значения применяются ко всем заголовкам, затем более конкретные значения применяются к заголовкам с классами.
Давайте теперь посмотрим, как браузер будет вычислять специфичность. Мы уже знаем, что селектор элемента имеет низкую специфичность и может быть перезаписан классом. По сути, оценка в баллах присуждается различным типам селекторов, и их сложение дает вам вес этого конкретного селектора, который затем может быть оценен по сравнению с другими потенциальными совпадениями.
Степень специфичности селектора измеряется с использованием четырех различных значений (или компонентов), которые можно представить как тысячи, сотни, десятки и единицы - четыре однозначных числа в четырех столбцах:
- Тысячи : Оцените один балл в этом столбце, если объявление находится внутри атрибута
стиля
, также известного как встроенные стили. Такие объявления не имеют селекторов, поэтому их специфичность всегда равна 1000. - Сотни : Оцените по одному баллу в этом столбце за каждый селектор ID, содержащийся в общем селекторе.
- Десятки : Оцените по одному баллу в этом столбце за каждый селектор класса, селектор атрибута или псевдокласс, содержащийся внутри общего селектора.
- Единицы : Оцените по одному баллу в этом столбце за каждый селектор элемента или псевдоэлемент, содержащийся внутри общего селектора.
Примечание: Универсальный селектор (
*
), комбинаторы (+
,>
,~
, '') и псевдокласс отрицания (: не
) не влияют на специфичность.В следующей таблице приведены несколько отдельных примеров, которые помогут вам настроиться. Попробуйте пройти их и убедитесь, что вы понимаете, почему они имеют ту специфику, которую мы им придали. Мы еще не рассматривали селекторы подробно, но вы можете найти подробную информацию о каждом селекторе в справочнике по селекторам MDN.
Селектор тыс. Сот Десятки Единицы Общая специфичность h2
0 0 0 1 0001 h2 + p :: первая буква
0 0 0 3 0003 li> a [href * = "en-US"]>.встроенное предупреждение
0 0 2 2 0022 #identifier
0 1 0 0 0100 Без селектора, с правилом внутри атрибута стиля элемента
1 0 0 0 1000 Прежде чем двигаться дальше, давайте рассмотрим пример в действии.
Так что здесь происходит? Прежде всего, нас интересуют только первые семь правил этого примера, и, как вы заметите, мы включили их значения специфичности в комментарий перед каждым из них.
- Первые два селектора конкурируют за стиль цвета фона ссылки - второй выигрывает и делает цвет фона синим, потому что у него есть дополнительный селектор идентификатора в цепочке: его специфичность составляет 201 против 101.
- Третий и четвертый селекторы конкурируют за стиль цвета текста ссылки - второй выигрывает и делает текст белым, потому что, хотя у него на один селектор элементов меньше, отсутствующий селектор заменяется селектором класса, который стоит десять а не один.Таким образом, выигрышная специфичность составляет 113 против 104.
- Селекторы 5–7 конкурируют за стиль границы ссылки при наведении курсора. Селектор шесть явно проигрывает пяти со специфичностью 23 против 24 - у него на один селектор элементов в цепочке меньше. Селектор семь, однако, превосходит и пять, и шесть - у него такое же количество подселекторов в цепочке, как у пяти, но элемент был заменен на селектор класса. Таким образом, выигрышная специфичность - 33 против 23 и 24.
Примечание: Это только приблизительный пример для простоты понимания.Фактически, каждый тип селектора имеет свой уровень специфичности, который не может быть перезаписан селекторами с более низким уровнем специфичности. Например, сочетание миллиона селекторов класса не сможет перезаписать правила одного селектора id .
Более точный способ оценки специфичности - это индивидуальная оценка уровней специфичности, начиная с самого высокого и переходя к самому низкому, когда это необходимо. Только когда есть связь между оценками селекторов в пределах определенного уровня специфичности, вам нужно оценивать следующий уровень вниз; в противном случае вы можете игнорировать селекторы более низкого уровня специфичности, поскольку они никогда не могут перезаписать более высокие уровни специфичности.
! Important
Есть специальный фрагмент CSS, который можно использовать для отмены всех вышеперечисленных вычислений. Однако при его использовании следует быть очень осторожным -
! Important
. Это используется для того, чтобы сделать конкретное свойство и оценить наиболее конкретную вещь, тем самым отменяя обычные правила каскада.Взгляните на этот пример, где у нас есть два абзаца, один из которых имеет идентификатор.
Давайте рассмотрим это, чтобы увидеть, что происходит - попробуйте удалить некоторые свойства, чтобы увидеть, что произойдет, если вам трудно понять:
- Вы увидите, что значения третьего правила
color
иpadding
были применены, а для background-color
-
- Однако правила над ним выигрывают, потому что селекторы классов имеют более высокую специфичность, чем селекторы элементов.
- Оба элемента имеют
класс
излучше
, но второй имеетid
из, выигравший
тоже. Поскольку идентификаторы имеют даже более высокую специфичность , чем классы (у вас может быть только один элемент с каждым уникальным идентификатором на странице, но многие элементы с одним и тем же классом — селекторы идентификаторов очень специфичны в том, на что они нацелены), красный фон color и черная граница 1px должны быть применены ко второму элементу, причем первый элемент получает серый цвет фона и не имеет границы, как указано в классе. - Второй элемент имеет красный цвет фона, но без рамки . Почему? Из-за объявления
! Important
во втором правиле — включая это послеborder: none
означает, что это объявление будет иметь приоритет над значением границы в предыдущем правиле, даже если идентификатор имеет более высокую специфичность. - Объявления в таблицах стилей пользовательских агентов (например,грамм. стили браузера по умолчанию, используемые, когда не заданы другие стили).
- Обычные объявления в пользовательских таблицах стилей (настраиваемые стили, устанавливаемые пользователем).
- Обычные объявления в авторских таблицах стилей (это стили, установленные нами, веб-разработчиками).
- Важные объявления в авторских таблицах стилей
- Важные объявления в пользовательских таблицах стилей
цвет границы, отступа и шрифта. Цвет был применен к прямым дочерним элементам, но также и к косвенным дочерним элементам — непосредственным дочерним элементам
Примечание: Единственный способ переопределить это объявление ! Important
— это включить еще одно объявление ! Important
в объявление с такой же специфичностью позже в исходном порядке или с более высокой специфичностью.
Полезно знать, что существует ! Important
, чтобы вы знали, что это такое, когда встречаете его в чужом коде. Однако мы настоятельно рекомендуем никогда не использовать его без крайней необходимости. ! Important
изменяет способ нормальной работы каскада, поэтому может сделать отладку CSS-проблем действительно трудной для решения, особенно в большой таблице стилей.
Одна из ситуаций, в которой вам, возможно, придется использовать его, — это когда вы работаете на CMS, где вы не можете редактировать основные модули CSS, и вы действительно хотите переопределить стиль, который нельзя переопределить никаким другим способом.Но на самом деле не используйте его, если можете этого избежать.
Наконец, полезно также отметить, что важность объявления CSS зависит от того, в какой таблице стилей оно указано — пользователи могут устанавливать собственные таблицы стилей для переопределения стилей разработчика. Например, пользователь может быть слабовидящим и хочет установить размер шрифта на всех посещаемых веб-страницах в два раза больше обычного, чтобы облегчить чтение.
Конфликтующие объявления будут применяться в следующем порядке, более поздние будут иметь приоритет перед более ранними:
Таблицы стилей веб-разработчиков имеют смысл переопределять пользовательские таблицы стилей, поэтому дизайн можно сохранить, как задумано, но иногда у пользователей есть веские причины переопределить стили веб-разработчиков, как упоминалось выше — этого можно достичь с помощью ! Important
в их правилах.
В этой статье мы рассмотрели многое, но можете ли вы вспомнить самую важную информацию? Вы можете найти дополнительные тесты, чтобы убедиться, что вы сохранили эту информацию, прежде чем двигаться дальше — см. Проверка своих навыков: Каскад.
Если вы поняли большую часть этой статьи, то хорошо — вы начали знакомиться с фундаментальной механикой CSS. Далее мы подробно рассмотрим селекторы.
Если вы не до конца понимали каскад, специфичность и наследование, не волнуйтесь! Это определенно самая сложная вещь, которую мы рассмотрели до сих пор в курсе, и это то, что даже профессиональные веб-разработчики иногда находят сложной задачей.Мы советуем вам вернуться к этой статье несколько раз, продолжая изучать курс, и продолжать думать об этом.
Вернитесь сюда, если вы начнете сталкиваться со странными проблемами со стилями, которые не применяются должным образом. Это может быть проблема специфики.
Наследование CSS: Введение — SitePoint
В реальной жизни часто можно увидеть наследование в действии. Если не учитывается какой-либо другой фактор, часто бывает, что у высоких родителей есть высокие дети и так далее.Мы можем увидеть нечто подобное в CSS.
Если вы установите для элемента контейнера зеленый цвет, тогда, если какое-либо правило не отменяет это значение цвета, цвет всех элементов внутри контейнера будет зеленым. Механизм, посредством которого значение определенных свойств передается от родительских элементов к дочерним элементам, называется наследованием.
В этой статье вы узнаете о различных аспектах наследования и о том, как оно влияет на внешний вид различных элементов.
Чем полезно наследование CSS?
Наследование CSS значительно сокращает время и усилия, необходимые для создания веб-сайта. Представьте, сколько CSS вам нужно написать, чтобы установить цвет для всех дочерних элементов тега body
. Это займет много времени, будет подвержено ошибкам и будет сложно поддерживать. Точно так же вы можете представить себе, каким кошмаром было бы, если бы вам пришлось установить семейство шрифтов
или размер шрифта
для каждого дочернего элемента контейнера.
Посмотрите на следующую демонстрацию:
См. Пример наследования CSS Pen от SitePoint (@SitePoint) на CodePen.
Здесь я определил свойства font-family , font-size
и line-height
для элемента body
, но все эти значения наследуются различными элементами, вложенными в тело body
. Это обеспечивает единообразие макета без необходимости повторения одних и тех же свойств для нескольких элементов.
Унаследованы только определенные свойства
В реальной жизни не все атрибуты родителей передаются их детям.То же самое и в CSS; не каждое свойство CSS по умолчанию наследуется дочерними элементами. Фактически, если бы все свойства были унаследованы, эффект был бы аналогичен отсутствию наследования вообще, и вам пришлось бы написать много CSS, чтобы переопределить это поведение.
В качестве примера, если свойство border
было наследуемым, установка границы для одного элемента приведет к тому, что такая же граница появится на всех его дочерних элементах. Точно так же, если бы дети унаследовали свойство background-image
от своих родителей, результат был бы беспорядочным.Следующий пример CodePen демонстрирует, как такого рода вещи будут выглядеть с использованием значения ключевого слова CSS, которое я расскажу в следующем разделе:
Посмотрите, как будут работать границы, если они унаследованы по умолчанию от SitePoint (@SitePoint) на CodePen.
Принудительное наследование
Вообще говоря, вопрос о передаче собственности по наследству зависит от здравого смысла. Например, в дополнение к примерам, рассмотренным в предыдущем разделе, вы, вероятно, не хотите, чтобы все дочерние элементы элемента унаследовали значение заполнения своего родителя.Однако вы часто предпочитаете, чтобы цвет текста или шрифт, используемые для разных дочерних элементов контейнера, были одинаковыми.
В некоторых случаях конкретное свойство может не передаваться по наследству, но вы все равно можете захотеть, чтобы оно было унаследовано от родительского элемента. Этого можно достичь, установив для этого свойства значение , наследовать
для дочернего элемента:
.some-child {
цвет: наследовать;
}
Допустим, вы хотите, чтобы цвет всех элементов ссылок на вашем веб-сайте был таким же, как цвет, определенный для их родительского элемента.Есть несколько способов сделать это. Например, вы можете использовать разные классы для ссылок и элементов контейнера с разными цветами. Однако один из самых простых способов сделать это — использовать ключевое слово inherit
.
Как только свойство цвета элементов ссылки установлено на наследовать
, они начнут наследовать цвет своих родителей:
p {
цвет: # f44336;
}
ul {
цвет: # 3f51B5;
}
a {
цвет: наследовать;
}
Вот демонстрация:
См. Перо Использование ключевого слова `inherit` для принудительного наследования с помощью SitePoint (@SitePoint) на CodePen.
Наследование с использованием сокращенного кода CSS
Особенностью ключевого слова inherit
является то, что когда вы применяете его к сокращенному свойству, оно будет применяться ко всем под-свойствам, даже к тем, которые вы не могли понять сначала, вынуждены наследовать. Кроме того, сокращенно вы не можете указать, что отдельное вложенное свойство будет наследовать значение.
В качестве примера вы можете ожидать, что следующий CSS применит сплошную границу шириной 1 пиксель, цвет которой унаследован от родительского элемента.Однако декларация фактически недействительна:
.example {
граница: 1px сплошное наследование;
}
Точно так же вы не можете использовать сокращенные свойства, чтобы установить поля или отступы на определенное значение с одной стороны и унаследованное значение с другой стороны. Это снова сделает декларацию недействительной:
.example {
маржа: 10px наследовать 20px 15px;
}
Одним из решений этой проблемы является установка свойства, которое вы хотите наследовать, на некоторое произвольное значение, а затем использование наследования
с соответствующим полным свойством:
.пример {
маржа: 10px 0 20px 15px;
маржа-право: наследовать;
}
Отсутствующие сокращенные значения
При сокращении для любого недостающего под-свойства, значение которого не было указано явно, будет установлено его начальное (или значение по умолчанию) значение. Рассмотрим следующий CSS:
.container-a {
шрифт: курсив 1.2em / 1.75 Lato;
}
.container-a p {
шрифт: жирный 1em Lato;
}
Здесь текст абзаца не наследует значение font-style
из своего контейнера.Значение стиля шрифта будет фактически сброшено до исходного значения
нормального
. Следовательно, в этом случае, если вы хотите, чтобы родительский шрифт
был унаследован, но при этом убедитесь, что абзац остается жирным шрифтом
, вам придется использовать свойство font-weight
от longhand.
См. Наследование и сокращение CSS Pen от SitePoint (@SitePoint) на CodePen.
DevTools можно использовать для просмотра свойств, которые элемент наследует от своего родителя или от другого элемента вверх по дереву DOM.Как уже упоминалось, не все свойства родительского элемента наследуются. Также не все наследуемые свойства доходят до конца цепочки наследования, не будучи переопределенными другим правилом CSS где-то еще.
DevTools дает вам различные визуальные подсказки, чтобы легко различать все такие свойства, которые вы можете увидеть на снимке экрана ниже, взятом из CSS SitePoint:
Все свойства, которые не наследуются выбранным элементом, затенены.Свойства, которые были унаследованы, но были переопределены, отображаются перечеркнутым текстом.
Список унаследованных свойств CSS
Кажется, что нет единого окончательного источника, в котором перечислены все наследуемые свойства CSS, но ниже приведен список, который, вероятно, правильный, основанный на нескольких источниках:
- граница-развал
- межосевое расстояние
- сторона подписи
- цвет
- курсор
- направление
- пустых ячеек
- семейство шрифтов
- размер шрифта
- стиль шрифта
- вариант шрифта
- font-weight
- регулировка размера шрифта
- растяжка шрифта
- шрифт
- межбуквенный интервал
- высота строки
- изображение в стиле списка
- позиция стиля списка
- тип списка
- в виде списка
- детей-сирот
- цитат
- размер табулятора
- выравнивание текста
- выравнивание текста последнее
- текст-украшение-цвет
- отступ текста
- с выравниванием текста
- тень текста
- преобразование текста
- видимость
- белое пространство
- вдов
- разрыв слов
- межсловный интервал
- перенос слов
Существует также ряд наследуемых свойств CSS, связанных с речью, которые не включены в список выше.
Вот несколько источников списков унаследованного имущества:
Вы также можете просмотреть информацию об отдельном свойстве CSS в спецификации или в любом исчерпывающем справочнике CSS, и он обычно сообщает вам, унаследовано ли это свойство по умолчанию.
Заключение
Подводя итог тому, что я обсуждал: наследование позволяет избежать написания повторяющихся правил CSS для применения одного и того же набора свойств ко всем потомкам элемента. Это значительно упрощает процесс добавления стилей на веб-страницы и поэтому является отличной функцией CSS.
CSS также позволяет использовать ключевое слово inherit
для принудительного наследования свойств, которые не наследуются по умолчанию. DevTools обеспечивает легкий доступ ко всем свойствам, которые элемент наследует от своих предков. Это может помочь вам быстро найти решения распространенных проблем, связанных с макетом.
В чем разница между каскадированием и наследованием в CSS?
Чтобы понять разницу между наследованием и каскадированием, давайте разберемся с ними обоими на примере.
Наследование - это способ передачи значений свойств от родительских элементов к их дочерним элементам, давайте рассмотрим очень простой пример.
.parent {
размер шрифта: 20 пикселей;
высота строки: 150%;
}
.ребенок{
размер шрифта: 25 пикселей;
}
Из приведенного выше примера мы собираемся определить, какой будет высота строки дочернего элемента. Все мы знаем, что каждое свойство CSS должно иметь значение, даже если ни мы, ни разработчик, ни браузер не указываем его. В этом случае нет никакого каскадного значения, верно? Таким образом, при обработке определенного свойства для определенного элемента, такого как высота строки, первый вопрос, который задает механизм CSS, - есть ли каскадное значение, если да, то, конечно, это значение используется.Теперь, если нет каскадного значения, следующий вопрос: можно ли унаследовать свойство, это зависит от каждого свойства, одни свойства наследуются, а другие нет. В случае line-height это свойство наследуется, как мы видим из спецификации свойства.
https://developer.mozilla.org/en-US/docs/Web/CSS/line-height
Итак, если свойство наследуется, тогда значение этого свойства становится вычисленным значением его родительского элемента. Очень важно отметить, что значение, которое наследуется, составляет не просто 150%, а вычисленное значение.В данном случае это 150% от 20 пикселей, что составляет 30 пикселей. Таким образом, высота строки дочернего элемента также будет 30 пикселей, а не 150% от размера шрифта в 25 пикселей. Теперь, если это свойство не унаследовано, например, padding, то указанное значение станет начальным значением, которое также является специфическим для каждого свойства. В случае заполнения это просто ноль пикселей.
Now Cascading - это процесс объединения различных таблиц стилей и разрешения конфликтов между различными правилами и объявлениями CSS, когда к определенному элементу применяется более одного правила.Потому что, как вы, вероятно, уже знаете, объявление для определенного свойства стиля, такого как размер шрифта, может появляться в нескольких таблицах стилей, а также несколько раз внутри одной таблицы стилей.
Если вы хотите подробно прочитать о каскадировании в CSS, просто прочтите мой другой ответ о каскадировании.
Что означает «каскадирование» в CSS?
Используется и злоупотребляют - наследование CSS и неправильное использование каскада
Мы злоупотребляем моделью наследования CSS. Я сказал это.Я знаю, что буква C в CSS означает «каскадирование», но это не означает, что нам нужно каскадировать от простейшего селектора до сложного компонента. Слишком часто h3 начинается с базового уровня стилей из тега h3 корневого уровня, а затем получает второй слой, потому что он находится в определенной области страницы. Третье приложение применяется, потому что оно принадлежит к семейству компонентов, которые имеют общие стили. Наконец, поскольку h3 принадлежит к определенной вариации этого компонента, он получает 4-й слой стилей поверх него.
Одна разметка. 4 разных источника стилей, объединенных вместе. Звучит запутанно и безумно? Это может показаться безумием, но это далеко не редкость.
Вниз по кроличьей норе
Все начинается с того, что кто-то говорит: «Я не хочу писать CSS каждый раз, когда добавляю h3 ″. Итак, мы пишем:
h3 {
цвет: # fd7900;
размер шрифта: 1.8em;
высота строки: 1,1;
нижнее поле: .3em;
}
Сначала это отлично работает, но потом случается: владелец истории хочет изменить внешний вид всех.боковая панель h3.
.sidebar h3 {
цвет: # 8cc5e6;
размер шрифта: 2.2em;
нижняя обивка: .2em;
нижняя граница: сплошной черный 1px;
}
Нам не нужно менять все, только цвет, размер и границу. Итак, мы используем каскад CSS и настраиваем значения, которые необходимо обновить.
Шкаф, полный сбрасываемой обуви
Мы пытаемся проявить смекалку, разбивая небольшие функциональные возможности на многоразовые блоки боковой панели, поэтому мы решили создать несколько стилей блоков по умолчанию.Таким образом, все блоки, которые мы создаем сегодня и в будущем, могут наследовать одни и те же стили. У каждого блока есть h3, поэтому давайте посмотрим, как он будет оформлен.
. Блок
граница: 1px solid # 8cc5e6;
отступ: 0 15 пикселей;
}
.block h3 {
/ * Цвет был изменен с помощью .sidebar h3, установить его обратно * /
цвет: # fd7900;
/ * удаляем границу, добавленную .sidebar h3 * /
граница: нет;
/ * убираем маржу, установленную h3 * /
маржа: 0;
заполнение: .3em;
фон: # 8cc5e6;
маржа: 0-15 пикселей;
}
Наши блоки работают отлично.Теперь нас попросили создать альтернативный стиль блока, который использует исходный заголовок боковой панели, но имеет полностью серый фон.
/ *
Разметка
Мое название
...
* /
.alt-block {
/ * Удаляем границу из .block * /
граница: нет;
отступ: 15 пикселей;
фон: #eee;
}
.alt-block h3 {
/ * Необходимо установить цвет, установленный .block h3 * /
цвет: # 8cc5e6;
/ * Необходимо вернуть padding-bottom к стилям .sidebar h3 * /
нижняя обивка: .2em;
/ * Необходимо вернуть границу.стили боковой панели h3 * /
нижняя граница: сплошной черный 1px;
/ * Удаляем отрицательные поля и фон из .sidebar h3
но снова установите нижнее поле от корня h3 * /
маржа: 0 0 .3em;
/ * удалить фон из .sidebar h3 * /
фон: нет;
}
Что мы сделали?
Изображение
Вот! Были сделаны! История принята, код добавлен в мастер. Но какой ценой? Наш .alt-block h3 содержит только стили, которые отменяют или возвращаются к стилям, которые мы уже написали.
Вдобавок ко всему, наш заголовок теперь наследует стили от 4 разных селекторов, наш код раздут, производительность нашего сайта падает, а наша система стилей невероятно хрупка. Любое изменение в h3, .sidebar h3, .block h3 повлияет на .alt-block h3, предназначались мы для этого или нет.
Мой кодекс подавляется
Так что же именно произошло? В приведенном выше примере мы испытали 3 различных типа наследования CSS: наследование тегов , наследование местоположения и наследование классов .Давайте посмотрим, как работает каждый из них, почему они вызывают проблемы, и способы их устранения.
Наследование тегов
Мы используем HTML-теги для придания смысла нашим сайтам. Когда мы применяем стили к этим тегам, мы в конечном итоге смешиваем семантику и представление. Я не против применить к нашим тегам очень простой набор стилей по умолчанию, но в нашем примере мы столкнулись с проблемами, когда привязали готовые стили представления к тегу h3. Это не только запутало воду для всех других наших тегов h3tags, но также сделало невозможным повторное использование этих базовых стилей после переопределения.
Вместо того, чтобы полагаться на наследование тегов для распространения нашего базового стиля, мы должны переместить эти стили в повторно используемый класс или расширить его. Вы даже можете называть его .h2 или% h2, если хотите! Но главное - не привязывать презентацию к вашим базовым тегам, а вместо этого перейти к типографике с подпиской.
Наследование местоположения
Я много раз слышал этот аргумент относительно наследования местоположения: «Я хочу, чтобы каждый элемент h3 на боковой панели выглядел одинаково, и я не хочу, чтобы мне приходилось писать CSS каждый раз, когда мы создаем новый виджет боковой панели».
Этот тип мышления полностью противоречит мантре : компоненты должны быть автономными, многоразовыми и не иметь сведений о своем родительском контейнере . Использование наследования местоположения означает, что ваши стили заголовков зависят от того, находятся ли они на боковой панели (не являются автономными или многоразовыми), и что вам необходимо иметь глубокие знания о своем родительском контейнере, прежде чем писать стили.
Хотя я понимаю цель наследования местоположения, я лично видел, как он терпит неудачу во многих различных ситуациях.
- Кто-то попросит вас создать новый стиль заголовка для боковой панели, и последнее, что вам нужно сделать, это попробовать все 6 тегов заголовка (h2 - h6), чтобы увидеть, какой из них имеет наименьшее количество стили для переопределения.
- В конечном итоге вам будет предложено переместить компонент из области основного содержимого на боковую панель. Насколько вы хотите поспорить, что стили .sidebar h3 НИКОГДА не повлияют на перемещаемый вами .widget h3.
- Вы можете подумать, что при использовании селектора потомков (например,.sidebar> h3) решит все ваши проблемы, но теперь ваши стили зависят от порядка разметки, и нет возможности повторно использовать эти стили h3 где-либо еще на вашем сайте.
В конце концов, ваши стили будут более гибкими и менее подверженными взлому, если вы не будете полагаться на наследование местоположения.
Наследование класса
Наследование классов - это практика применения всей системы стилей к коллекции разметки через один класс. В нашем примере у нас есть.block, который является законченным компонентом, мы добавляем еще один набор стилей с помощью .alt-block. В терминах «объектно-ориентированного» это означает, что .alt-block тесно связан с .block, или что он «изменяет внутреннюю работу другого модуля или полагается на нее». Это не всегда плохо, но может быстро стать сложным и хрупким.
Представьте, что вы написали код .block, а затем кто-то из команды решил создать .my-calendar-widget, используя .block в качестве набора базовых стилей, т.е.е. a «полагается на модуль».
Заголовок моего календаря
...
Если у вас нет хорошо отлаженной системы документирования этих отношений, это становится тем, что я называю «угнанным наследованием». В нашем CSS нет указаний на то, что .block имеет другой компонент, тесно связанный с ним, поэтому мы будем иметь дело со случайными ошибками на нашей странице календаря каждый раз, когда будем обновлять .block.
Решение этого беспорядка состоит в том, чтобы отказаться от наследования классов и вместо этого разбить родительский класс на расширяемые части, включая контейнер, заголовки, текст и обработку изображений.Этот метод часто называют композицией, и я расскажу о нем всего в нескольких абзацах.
Проблема, унаследованная в системе
Наследование не является уникальным для CSS. Многие объектно-ориентированные языки программирования используют концепцию наследования для передачи свойств и методов от родителя к потомку. Многие из этих языков также подробно описывают подводные камни, связанные с этим подходом (Javascript, Java, Ruby). CSS может не быть языком программирования, как Ruby или Java, но есть много вещей, которые мы можем извлечь из этих языков, которые помогут нам справиться с наследованием в CSS.Давайте посмотрим на несколько из этих уроков ниже:
Множественное наследование
«Избегайте множественного наследования любой ценой, поскольку оно слишком сложно, чтобы его можно было надежно использовать. Если вы застряли в этом, будьте готовы узнать иерархию классов и потратить время на то, чтобы выяснить, откуда все идет ».
Если ваши компоненты используют разные классы комбинаций для достижения своих стилей (например, наш пример .block и .my-calendar-widget), становится очень трудно предвидеть, как изменение CSS одного компонента может повлиять на ваш сайт.Не имея возможности найти весь наш сайт (что для некоторых CMS практически невозможно), мы не можем узнать, какие компоненты используют класс, который мы в настоящее время редактируем, и как это изменение может взаимодействовать с другими классами, которые они используют.
Во-вторых, мы проводим слишком много времени, пытаясь понять иерархию стилей элемента. Откуда берутся стили? Тег, класс, родительский класс, местоположение, медиа-запрос или их комбинация? Когда каждый элемент имеет один источник приложения стиля, гораздо проще отлаживать и понимать ожидаемое поведение этого элемента.
Состав против наследования
«Используйте композицию для упаковки кода в модули, которые используются во многих различных несвязанных местах и ситуациях».
Даже при одиночном наследовании наш элемент .block все еще полностью зависит от каскада. Уберите блок .block с боковой панели, и он сломается. Измените заголовок на h4, и он сломается. Проблема в том, что каждый элемент внутри .block наследует стили родительского класса, расположение блока и сам тег HTML.Ему не предписываются стили из-за его семантического назначения, которое должно быть «заголовком».
Композиция - это идея, что компонент html может «содержать» другие стили, а не «наследовать» эти стили. Вы можете увидеть, что этот принцип широко используется в OOCSS, BEM и Sass @extends. Вместо слоев стилей, каждый из которых перекрывает предыдущий, эти подходы охватывают принцип единой ответственности с гиперцелевыми селекторами, которые хорошо выполняют одну и только одну работу.
Запускаем все в работу
Мы потратили много времени на изучение различных типов наследования и на то, как традиционные объектно-ориентированные принципы помогают нам выявлять проблемы в нашей модели наследования и находить решения.Теперь давайте посмотрим, как мы можем использовать Sass для создания этого элемента .block, используя композиционный подход.
Разметка
Обратите внимание на то, что каждое название имеет свой уникальный класс. Это позволяет нам настроить таргетинг на заголовок независимо от используемого тега.
<сторона>
Заголовок моего календаря
...
Заголовок моего блога
...
Заголовок моей новости
...
The Extends
Если вы новичок в Sass, расширение - это инструмент, который мы можем использовать для распространения набора стилей без применения презентационных классов или дублирования этих стилей. Обычной практикой является использование скрытых расширений, таких как% primary-header, чтобы исключить неиспользуемые стили из вашей таблицы стилей.
% primary-header {
размер шрифта: 1.8em;
высота строки: 1,1;
цвет: # fd7900;
маржа: .3em;
}
% secondary-header {
размер шрифта: 2.2em;
высота строки: 1,1;
цвет: # 8cc5e6;
маржа: 0 0 .3em;
нижняя обивка: .2em;
нижняя граница: сплошной черный 1px;
}
% block-header {
размер шрифта: 2.2em;
высота строки: 1,1;
цвет: # fd7900;
маржа: 0;
заполнение: .3em;
фон: # 8cc5e6;
маржа: 0-15 пикселей;
}
%блокировать {
граница: 1px solid # 8cc5e6;
отступ: 0 15 пикселей;
}
% alt-block {
отступ: 15 пикселей;
фон: #eee;
}
Стилизация каждого блока
Чтобы использовать одно из этих расширений, мы просто пишем @expan% extension-name внутри нашего селектора, а Sass позаботится обо всем остальном.
Обратите внимание, как каждый семантический селектор состоит из стилей, а не наследует их от своего тега, местоположения или родительского класса. Это позволяет нам «упаковать наш код и повторно использовать его во многих разных несвязанных местах и ситуациях».
.calendar-widget {
@extend% block;
}
.calendar-widget-title {
@extend% заголовок блока;
}
/*...*/
.latest-blogs {
@extend% alt-block;
}
.latest-blogs-title {
@extend% вторичный заголовок;
}
/*...*/
.последние новости {
@extend% alt-block;
}
.latest-news-title {
@extend% вторичный заголовок;
}
Скомпилированный CSS
В нашем скомпилированном CSS вы увидите, что скрытый заголовок extension% secondary-header заменен двумя расширяющими его классами. Вы также заметите, что мы никогда не использовали% primary-header, поэтому эти стили были опущены. Это одно из преимуществ бесшумных расширений.
.latest-blogs-title,
.latest-news-title {
размер шрифта: 2.2em;
высота строки: 1,1;
цвет: # 8cc5e6;
маржа: 0 0.3em;
нижняя обивка: .2em;
нижняя граница: сплошной черный 1px;
}
.calendar-widget-title {
размер шрифта: 2.2em;
высота строки: 1,1;
цвет: # fd7900;
маржа: 0;
заполнение: .3em;
фон: # 8cc5e6;
маржа: 0-15 пикселей;
}
.calendar-widget {
граница: 1px solid # 8cc5e6;
отступ: 0 15 пикселей;
}
.latest-blogs,
.последние новости {
отступ: 15 пикселей;
фон: #eee;
}
Единый источник стилей
Изображение
В этом CSS мы это признали.Последние-блоги-заголовки имеют сходство с .latest-news-title, и мы связали их через композицию.
Будет ли это раздувать наш CSS?
Одна из популярных жалоб на extends заключается в том, что он создает файлы CSS большего размера, чем другие подходы. Подход OOCSS или BEM будет очень похож на то, что мы сделали выше, за исключением того, что классы .alt-block и .secondary-header будут применяться непосредственно к разметке, а не расширяться через Sass. Хотя это правда, что такой подход сэкономит нам несколько байтов, преимущества расширений и то, что они делают для долговечности проекта, намного перевешивают небольшое дублирование.Бен Фрейн прекрасно выразился несколько недель назад, когда сказал:
«Для меня большая общая база кода CSS, состоящая из компонентов, которые во многих отношениях изолированы друг от друга, предпочтительнее, чем меньшая база кода CSS, состоящая из взаимозависимых и внутренне связанных стилей».
Если мы применим эти презентационные классы непосредственно к разметке, заголовок нашего блога и заголовок новости станут взаимозависимыми и внутренне связанными. То есть мы не можем изменить одно из них, не изменив другого.
Что старое, то снова новое
Я не являюсь специалистом в области традиционного программирования, поэтому впервые у меня появилась возможность погрузиться в разницу между наследованием и композицией. Поскольку я так хорошо изучил тему на таких языках, как Java и C ++, я часто обнаруживал, что читаю статьи, которые были почти такими же старыми, как и сама сеть! В этих статьях замечательно то, что они были на 100% актуальны даже 16 лет спустя. Из «Наследование или композиция: что выбрать?»:
«В отношениях наследования суперклассы часто называют« хрупкими », потому что одно небольшое изменение суперкласса может вызвать сбой и потребовать изменений во многих других местах кода приложения.”
Это как раз та проблема, с которой мы сталкиваемся, когда изменения в h3 переходят в наш .block h3 и вызывают регрессию в нашем коде.
Эти идеи не новы, но по мере развития Интернета и роста сложности наших проектов они становятся все более актуальными для нашей отрасли. Итак, что касается меня и своего кода, я собираюсь потратить больше времени на чтение о других языках, и аналогичные проблемы были решены дюжину лет назад, с которыми мы сейчас сталкиваемся с помощью CSS.
Наследование и каскадирование · Документы WebPlatform
Сводка
Это руководство объясняет наследование и каскад, две фундаментальные концепции CSS.
Введение
Наследование и каскад - две фундаментальные концепции CSS, которые важно понимать. Эти два понятия тесно связаны, но при этом различаются:
- Наследование связано с тем, как элементы в разметке HTML наследуют свойства от своих родительских (содержащих) элементов и передают их своим дочерним элементам.
- Каскад относится к объявлениям CSS, применяемым к документу, и к тому, как конфликтующие правила отменяют или не отменяют друг друга.
В этой статье дается обзор обеих концепций.
Наследование
Наследование - это механизм, с помощью которого определенные свойства передаются от родительского элемента к его дочерним элементам таким же образом, как и генетика: если у родителей голубые глаза, их дети, вероятно, также будут иметь голубые глаза.
Не все свойства CSS наследуются, потому что некоторые из них не имеют смысла. Например, поля и ширина не наследуются, поскольку маловероятно, что дочерний элемент требует тех же полей, что и его родительский.Представьте, что вы устанавливаете блок содержимого сайта равным 70% ширины окна браузера, а затем все его дочерние элементы принимают ширину 70% от своих родительских элементов? Создание макетов страниц с помощью CSS было бы кошмаром.
В большинстве случаев здравый смысл указывает, какие свойства наследуются, а какие нет: если вы не уверены, поищите все свойства, присутствующие в CSS2, в сводной таблице свойств спецификации CSS 2.1. Для свойств CSS3 обратитесь к спецификациям отдельных модулей CSS3, доступных на текущей рабочей странице CSS.
Почему полезно наследование
CSS имеет механизм наследования, потому что в противном случае правила CSS были бы избыточными. Без наследования необходимо было бы указывать стили, такие как семейство шрифтов, размер шрифта и цвет текста, индивидуально - для каждого отдельного типа элемента. Код станет раздутым и повторяющимся.
Используя наследование, вы можете указать свойства шрифта для элементов html
или body
, и стили будут унаследованы всеми остальными элементами.Вы можете указать цвета фона и текста для определенного элемента контейнера, и цвет текста будет автоматически унаследован всеми дочерними элементами в этом контейнере. Цвет фона не наследуется, но начальное значение для background-color
- transparent
, что означает, что фон родителя будет просвечивать. Эффект аналогичен внешнему виду страницы, если цвет фона был унаследован.
Примечание: подумайте, что бы произошло, если бы фоновые изображения были унаследованы.Каждый дочерний элемент будет отображать то же фоновое изображение, что и его родитель. Результат будет выглядеть как головоломка, составленная кем-то, у кого серьезные проблемы с наркотиками, поскольку фон будет перерисовываться внутри каждого последующего дочернего элемента.
Как работает наследование
Каждый элемент в документе HTML наследует все наследуемые свойства от своего родительского , кроме корневого элемента (
), у которого нет родительского элемента.
Будут ли унаследованные свойства иметь какой-либо эффект, зависит от других вещей, как описано далее в разделе о каскаде.Так же, как у голубоглазой матери может быть кареглазый ребенок, если у отца карие глаза, унаследованные свойства в CSS можно переопределить.
Пример наследования
Скопируйте следующий HTML-документ в новый файл в вашем любимом текстовом редакторе и сохраните его как inherit.html.
Наследование Заголовок
Абзац текста.
Если вы откроете документ в веб-браузере, вы увидите довольно скучный документ, отображаемый в соответствии со стилем вашего браузера по умолчанию.
Создайте новый пустой файл в текстовом редакторе, скопируйте в него следующее правило CSS и сохраните файл как style.css в том же месте, что и файл HTML.
html { шрифт: 75% Verdana, без засечек; }
Свяжите таблицу стилей с вашим HTML-документом, вставив следующую строку перед тегом
Сохраните измененный HTML-файл и перезагрузите документ в браузере.
Начертание шрифта изменится с браузера по умолчанию (часто установленного на Times или Times New Roman) на Verdana.
Если на вашем компьютере не установлена Verdana, текст отображается шрифтом без засечек по умолчанию, указанным в настройках вашего браузера. Текст также стал меньше; только три четверти его размера в не стилизованной версии. Правило CSS применяется только к элементу
.Он не определяет никаких правил для заголовков или абзацев, но весь текст теперь отображается в Verdana с размером 75% от его размера по умолчанию. Почему? По наследству. Свойство font
- это сокращенное свойство, которое задает целый ряд свойств, связанных со шрифтом.
Правило CSS определяет только два свойства - размер шрифта и семейство шрифтов - но это правило эквивалентно следующему:
html {
стиль шрифта: нормальный;
вариант шрифта: нормальный;
шрифт: нормальный;
размер шрифта: 75%;
высота строки: нормальный;
семейство шрифтов: Verdana, без засечек;
}
Все эти свойства наследуются, поэтому элемент
унаследует их от элемента
, а затем передаст их своим дочерним элементам - заголовку и тексту абзаца.Но обратите внимание, что с наследованием размера шрифта происходит что-то необычное.
Размер шрифта элемента
установлен на 75%, но 75% от какой ? Разумеется, размер шрифта
должен составлять 75% от размера шрифта его родительского элемента, а размер шрифта заголовка и абзаца должен составлять 75% от размера шрифта элемента
? Унаследованное значение - это не указанное значение - значение, введенное в таблице стилей, - а нечто другое, называемое вычисленным значением.
Вычисленное значение в случае размера шрифта представляет собой абсолютное значение, измеренное в пикселях. Для элемента
, у которого нет родительского элемента для наследования, процентное значение размера шрифта соответствует размеру шрифта по умолчанию, установленному в браузере. В большинстве современных браузеров размер шрифта по умолчанию составляет 16 пикселей. 75% от 16 равно 12, поэтому вычисленное значение размера шрифта для элемента
составляет около 12 пикселей.
И , что - это значение, которое наследуется
и передается в заголовок и абзац.(Размер шрифта заголовка больше, потому что браузер применяет некоторые собственные встроенные стили. Подробнее см. В разделе ниже о каскаде.)
Рассмотрим этот пример:
Добавьте еще два объявления к правилу в таблице стилей CSS:
html { шрифт: 75% Verdana, без засечек; цвет фона: синий; цвет белый; }
Сохраните файл CSS и перезагрузите документ в браузере. Теперь фон всего документа ярко-синий, а весь текст белый.Белый цвет текста наследуется элементом
body
- в данном случае заголовку и абзацу. Заголовок и абзац, однако, не наследуют фон, а вместо этого по умолчанию имеют значениеtransparent
, поэтому чистый визуальный результат - белый текст, отображаемый на синем фоне.Добавить еще одно новое правило в таблицу стилей:
h2 { размер шрифта: 300%; }
Сохраните и перезагрузите документ: это правило устанавливает размер шрифта заголовка.Процент применяется к унаследованному размеру шрифта - 12 пикселей, как мы обсуждали выше, - поэтому размер заголовка будет 300% от 12 пикселей или 36 пикселей.
Принуждение к наследованию
Вы можете принудительно наследовать - даже для свойств, которые не наследуются по умолчанию - с помощью ключевого слова inherit
. Однако используйте эту стратегию с осторожностью, поскольку версии Microsoft Internet Explorer до версии 7 включительно не поддерживают это ключевое слово.
Следующее правило заставит все абзацы унаследовать все свойства фона от своих родителей:
p {
фон: наследование;
}
Принудительное наследование - не обычная практика.Это может быть полезно для «отмены» объявления в конфликтующем правиле или для того, чтобы избежать жесткого кодирования определенных значений. В качестве примера рассмотрим типичное меню навигации:
Чтобы отобразить этот список ссылок в виде горизонтального меню, вы можете использовать следующие правила CSS:
#nav {
фон: синий;
цвет белый;
маржа: 0;
отступ: 0;
}
#nav li {
дисплей: встроенный;
маржа: 0;
заполнение: 0 0.5em;
граница справа: сплошная 1px;
}
#nav li a {
цвет: наследовать;
текстовое оформление: нет;
}
Здесь цвет фона всего списка установлен на синий в правиле для #nav
. При этом также устанавливается белый цвет переднего плана, и это свойство наследуется каждым элементом списка и каждой ссылкой. Правило для элементов списка устанавливает правую границу, но не указывает цвет границы, что означает, что будет использоваться унаследованный цвет переднего плана, белый. Для ссылок цвет : наследовать;
вызывает наследование и отменяет цвет ссылок браузера по умолчанию.
Конечно, вы можете указать цвет границы как белый, а цвет текста ссылки как белый, но прелесть разрешения наследования выполнять эту работу заключается в том, что необходимо обновить только одно место, чтобы изменить цвета, если вы решите обновить цвет схема позже.
Каскад
CSS - это аббревиатура от Cascading Style Sheets, поэтому неудивительно, что каскад является важной концепцией. Это механизм, который контролирует конечный результат, когда несколько конфликтующих объявлений CSS применяются к одному и тому же элементу.Порядок применения объявлений CSS определяется тремя основными концепциями:
- Важность
- Специфичность
- Заказ источника
Эти концепции описаны ниже.
Важность - это самое… э-э… важное. Если два объявления имеют одинаковую важность, то конкретное правило определяет, какое из них будет применяться. Если правила имеют одинаковую специфичность, то исходный порядок определяет результат.
Важность
Важность объявления CSS зависит от , где оно указано .Конфликтующие объявления будут применяться в следующем порядке, причем более поздние объявления имеют приоритет перед более ранними:
- Таблицы стилей пользовательского агента
- Обычные объявления в пользовательских таблицах стилей
- Обычные объявления в авторских таблицах стилей
- Важные объявления в авторских таблицах стилей
- Важные объявления в пользовательских таблицах стилей
Таблицы стилей пользовательского агента
Таблица стилей пользовательского агента - это встроенная таблица стилей браузера.В каждом браузере есть свои правила по умолчанию для отображения различных HTML-элементов, если пользователь или дизайнер страницы не указали стиль. Например, непосещенные ссылки обычно окрашены в синий цвет и подчеркнуты.
Пользовательская таблица стилей - это таблица стилей, которую указал пользователь . Не все браузеры поддерживают пользовательские таблицы стилей, но они могут быть очень полезны, особенно для пользователей с определенными типами нарушений. Например, человек с дислексией может иметь пользовательскую таблицу стилей, в которой указаны определенные шрифты и цвета, чтобы облегчить чтение.
Авторская таблица стилей - это то, что мы обычно называем, когда говорим «таблица стилей». Это таблица стилей, которую автор документа (или, что более вероятно, дизайнер веб-сайта) написал и связал (или включил).
Обычные и важные декларации
Нормальные объявления - это просто обычные объявления.
Напротив, это важные объявления, которые представляют собой объявления, за которыми следует директива ! Important
. Пользователь с дислексией может, например, захотеть, чтобы весь текст отображался в Comic Sans MS, если он считает, что этот шрифт легче читать.Тогда у него может быть таблица стилей пользователя, содержащая следующее правило:
* {
семейство шрифтов: "Comic Sans MS"! важно;
}
Важные объявления в пользовательской таблице стилей будут важнее всего остального, что логично. В этом случае, независимо от того, что указал дизайнер, и независимо от того, какое семейство шрифтов браузера установлено по умолчанию, все будет отображаться в Comic Sans MS. Отображение браузера по умолчанию будет применяться только в том случае, если эти объявления не отменены никакими правилами в таблице стилей пользователя или таблице стилей автора, поскольку таблица стилей пользовательского агента имеет самый низкий приоритет.
Честно говоря, большинству дизайнеров не нужно слишком много думать о важности, поскольку мы ничего не можем с этим поделать. Мы не можем узнать, есть ли у пользователя определенная таблица стилей, которая переопределяет наш CSS. Если они это сделают, у них, вероятно, есть очень веская причина для этого. Тем не менее, полезно знать, насколько это важно и как это может повлиять на представление наших документов.
Специфичность
Специфичность - это то, что каждый автор CSS должен понимать и обдумывать.Его можно рассматривать как меру того, насколько специфичен селектор правила. Селектор с низкой специфичностью может соответствовать многим элементам (например, *
, который соответствует каждому элементу в документе), в то время как селектор с высокой специфичностью может соответствовать только одному элементу на странице (например, #nav
, который соответствует только элемент с идентификатором id
из nav
).
Специфичность селектора можно легко вычислить, как мы увидим ниже. Если два или более объявлений конфликтуют для данного элемента, и все объявления имеют одинаковую важность, то «победит» тот, который в правиле с наиболее конкретным селектором.
Specificity состоит из четырех компонентов; назовем их a, b, c и d. Компонент «а» является наиболее заметным, а компонент «d» - наименее.
- Компонент «a» довольно прост: это 1 для объявления в атрибуте
стиля
(также известный как встроенный стиль), в противном случае это 0. - Компонент «b» - это количество селекторов
id и
в селекторе (те, которые начинаются с#
). - Компонент «c» - это количество селекторов атрибутов, включая селекторы классов, и псевдоклассов.
- Компонент «d» - это количество типов элементов и псевдоэлементов в селекторе.
После небольшого подсчета мы можем, таким образом, связать эти четыре компонента вместе, чтобы получить специфичность для любого правила. Объявления CSS в стиле атрибута
не имеют селектора, поэтому их специфичность всегда равна 1,0,0,0.
Давайте рассмотрим несколько примеров - после этого должно быть достаточно ясно, как это работает.
Селектор | a | b | c | d | Специфичность |
---|---|---|---|---|---|
h2 |
h2
9037 9037
foo
#bar
html> головка + корпус ul # nav * .home a: link
Рассмотрим последний пример более подробно. a = 0, поскольку это селектор, а не объявление в атрибуте стиля . Существует один селектор идентификатора (
#nav
), поэтому b = 1.Существует один селектор атрибутов ( .home
) и один псевдокласс (: ссылка
), поэтому c = 2. Существует пять типов элементов (
,
,
,
- и
Прежде всего, начните с добавления еще одного абзаца в ваш HTML-документ.
<тело>
Заголовок
Абзац текста.
Второй абзац текста.
Затем добавьте в таблицу стилей правило, чтобы текст абзаца имел другой цвет:
p { цвет: голубой; }
Теперь сохраните оба файла и перезагрузите документ в браузере; теперь должно быть два абзаца с голубым текстом.
Установите
id
для первого абзаца, чтобы его можно было легко настроить с помощью селектора CSS.<тело>
Заголовок
Абзац текста.
Второй абзац текста.
Продолжите, добавив правило для специального абзаца в вашей таблице стилей:
#special { цвет фона: красный; цвет: желтый; }
Наконец, сохраните оба файла и перезагрузите документ в браузере, чтобы увидеть теперь довольно красочный результат.
Добавьте новое правило в таблицу стилей в самом конце файла, например:
p { цвет фона: желтый; черный цвет; }
Сохраните и перезагрузите веб-страницу.Теперь у вас будет два правила , которые соответствуют всем абзацам. Они имеют одинаковую важность и специфику (поскольку селектор один и тот же), поэтому окончательным механизмом выбора победителя будет исходный порядок. Последнее правило указывает
цвет: черный
, и это переопределит цвет: голубой
из более раннего правила.- Передается ли по наследству граница
и
? Сначала подумайте - будет ли это смысл? - а затем найдите правильный ответ в спецификации CSS. - Если мы добавим
! Important
к объявлениюcolor: black
в последнем правиле в нашем примере таблицы стилей, повлияет ли это на цвет текста в первом, «специальном» абзаце? - Какой селектор более точен: «
#special
» или «html> head + body> h2 + p
»? - Как должна выглядеть пользовательская таблица стилей, чтобы наш тестовый документ отображался черным Comic Sans MS на белом фоне, независимо от авторской таблицы стилей?
), поэтому d = 5.Таким образом, окончательная специфичность составляет 0,1,2,5.
Примечание. Комбинаторы (например, >
, +
и пробел) не влияют на специфичность селектора. Универсальный селектор ( *
) также не имеет значения для специфики.
Примечание № 2: существует огромная разница в специфичности между селектором id
и селектором атрибута, который ссылается на атрибут id
. Хотя они соответствуют одному и тому же элементу, у них очень разные особенности. Специфичность #nav
составляет 0,1,0,0, а специфичность [id = "nav"]
- всего 0,0,1,0.
Давайте посмотрим, как это работает на практике.
Давайте посмотрим на декларации, применимые к двум абзацам.
Первое добавленное вами правило устанавливает голубой цвет текста для всех абзацев. Второе правило устанавливает красный цвет фона и желтый цвет текста для отдельного элемента, который имеет id
из special
. Ваш первый абзац соответствует обоим этим правилам; это абзац, и у него есть id
из special
.
Красный фон - не проблема, потому что он указан только для #special
.Однако оба правила содержат объявление свойства color
, что означает конфликт. Оба правила имеют одинаковое значение - они являются обычными декларациями в авторской таблице стилей, поэтому вы должны учитывать специфику двух селекторов.
Селектор первого правила -
, который имеет специфичность 0,0,0,1 в соответствии с приведенными выше правилами, поскольку он содержит один тип элемента. Селектор второго правила - #special
, специфичность которого равна 0,1,0,0, так как оно состоит из селектора id
.0,1,0,0 более специфичен, чем 0,0,0,1, поэтому цвет : желтый; Объявление
побеждает, и вы получаете желтый текст на красном фоне.
Заказ источника
Если два объявления влияют на один и тот же элемент, имеют одинаковую важность и специфику, последний отличительный знак - это порядок источника. Объявление, которое появляется позже в таблицах стилей, «выиграет» перед теми, которые были перед ним.
Если у вас есть одна внешняя таблица стилей, то объявления в конце файла переопределят те, которые встречаются ранее в файле, в случае конфликта.Конфликтующие объявления также могут возникать в разных таблицах стилей.
В этом случае порядок, в котором таблицы стилей связаны, включены или импортированы, определяет, какое объявление будет применяться, поэтому, если у вас есть две таблицы стилей, связанных в документе
, та, которая находится ниже, переопределит один связан с более высоким. Давайте посмотрим на практический пример того, как это работает.
Обратите внимание, что это новое правило не влияет на первый абзац.
Хотя новое правило появляется последним, его селектор имеет более низкую специфичность, чем тот, который используется для #special
.Это ясно показывает, насколько специфичность важнее порядка источника.
Сводка
Наследование и каскад - фундаментальные концепции, которые должен понимать каждый веб-дизайнер.
Наследование позволяет нам объявлять свойства высокоуровневых элементов и позволяет этим свойствам просачиваться вниз и стилизовать дочерние элементы. По умолчанию наследуются только некоторые свойства, но наследование может быть выполнено принудительно с помощью ключевого слова inherit
.
Каскад устраняет все конфликты, когда несколько объявлений влияют на данный элемент.Важные объявления имеют приоритет над менее важными. Среди объявлений, имеющих одинаковую важность, специфичность правила определяет, какое из них будет применяться.
При прочих равных, окончательное различие имеет порядок источников.
См. Также
Вопросы к упражнениям
Наследование CSS | Дорвард
Введение
Многие новички в CSS сбиты с толку наследованием; это часто
потому что они исходят из объектно-ориентированного программирования ( ООП, ) и ожидают, что CSS
работают аналогичным образом.
Этот документ пытается объяснить наследование CSS и представить
альтернативы объектно-ориентированному наследованию, чтобы продемонстрировать, почему это не так
необходимо.
Наследование CSS
Наследование CSS работает на основе свойств. При применении
элементу в документе свойство со значением "наследовать" будет
используйте то же значение, что и у родительского элемента для этого свойства.
Например, для этой таблицы стилей:
.foo {
цвет фона: белый;
черный цвет;
}
.бар {
цвет фона: наследовать;
цвет: наследовать;
шрифт: нормальный;
}
И этот фрагмент HTML:
Привет, мир. Это очень короткий
пункт!
Цвет фона элемента div белый, потому что
background-color установлено значение белого цвета. Цвет фона
абзац также белый, потому что свойство цвета фона
установлен для наследования, а цвет фона родительского элемента (
div) установлен в белый цвет.
Наследуемое значение не требует, чтобы родительский элемент имел
тот же набор свойств явно ; это работает от
вычисленное значение . В приведенном выше примере цвет
свойство абзаца имеет значение "наследовать", но вычисленное
значение "черное", потому что оно наследуется.
Может показаться, что набирать много, но по умолчанию
значение для многих свойств уже унаследовано, а для большинства других
(например, граница) вы обычно не хотите наследовать родительский
значение элемента.
Размышляя над этим, отмечу, что не все
свойства могут быть унаследованы.
Объектно-ориентированное наследование
Многие люди спрашивают в списках рассылки и в группах новостей о CSS,
можно сделать что-то вроде:
.foo {
цвет фона: белый;
черный цвет;
}
.бар {
Некоторая отсылка к приведенному выше стилю для .foo
шрифт: нормальный;
}
Это не так. Селектор - это просто селектор, в нем нет ничего особенного
о занятиях.Все стало бы довольно сложно, если бы у вас было .foo>
в качестве селектора для стиля, который вы хотите импортировать, или
.bar
несколько одинаковых селекторов.
Я не буду вдаваться в подробности того, как можно изменить CSS, чтобы
функциональность, не только не было бы недостатка поддержки среди сегодняшних
поколение браузеров (которые, вероятно, будут с нами надолго
прийти), но это не нужно. CSS уже дает нам инструменты, которые мы
необходимость.
Есть несколько подходов, которые мы могли бы использовать.
Несколько классов
Хорошее использование классов решит большинство проблем.Возьми
пример с блоками данных, плавающими на разных сторонах
холст.
.oddBoxOut {
ширина: 12em;
плыть налево;
заполнение: 0.5em;
маржа: 0,5em;
граница: сплошная черная 1px;
}
.evenBoxOut {
ширина: 12em;
float: right;
заполнение: 0.5em;
маржа: 0,5em;
граница: сплошная черная 1px;
}
Как видите, многие свойства дублируются в каждом определении,
так что очевидно, почему кому-то может понадобиться наследование в стиле объектно-ориентированного программирования.
Но есть и другое решение.Давайте быстро оглянемся на
HTML
спецификация:
- класс = cdata-list [CS]
- Этот атрибут назначает элементу имя класса или набор имен классов.
Любому количеству элементов может быть присвоено одно и то же имя или имена класса. Несколько
Имена классов должны быть разделены пробелами.
Значит, мы можем присвоить несколько имен классов одному элементу? Что
означает, что мы можем изменить таблицу стилей, чтобы она выглядела так:
.boxOut {
ширина: 12em;
заполнение: 0.5em;
маржа: 0,5em;
граница: сплошная черная 1px;
}
.oddBoxOut {
плыть налево;
}
.evenBoxOut {
float: right;
}
И тогда HTML будет выглядеть так:
Селекторы группировки
Один стиль может иметь несколько селекторов, назначенных ему через
использование группировки.
Чтобы вернуться к предыдущему примеру, мы сначала упростим HTML, чтобы
упомянуть только один класс:
Затем мы назначаем ему нужный CSS, но группируем общие
пары свойство / значение.
.oddBoxOut,
.evenBoxOut {
ширина: 12em;
заполнение: 0.5em;
маржа: 0,5em;
граница: сплошная черная 1px;
}
.oddBoxOut {
плыть налево;
}
.evenBoxOut {
float: right;
}
Эти два метода должны решить большинство проблем, о которых люди думают.
можно решить с помощью объектно-ориентированного наследования, но у нас все еще есть возможность
использования препроцессора.
Препроцессор
Принцип работы препроцессора очень прост. Вы используете программное обеспечение для
просмотреть файл и заменить помеченные области переменными.В результате
вы расширяете CSS, чтобы разрешить наследование в стиле OO, используя любой синтаксис
ты желаешь. Затем вы используете свое собственное программное обеспечение для создания обычного CSS.
со своего доморощенного языка.
Это очень простой (разработанный, чтобы быстро писать для
целей этого примера, чтобы не было так просто использовать, как могло бы быть)
препроцессор, написанный на Perl (поэтому вам понадобится Perl, чтобы использовать его). Вы можете
используйте его сами или просто возьмите его как пример того, как вы могли бы
продолжить в письменном виде или найти его третьим лицом.
Это не совсем практический пример, но он показывает, что
может быть сделано. Этот скрипт выводит на стандартный вывод, поэтому его можно
передается в файл по желанию.
#! / Usr / bin / perl# Скажите Perl предупредить меня, если я пишу плохой код
используйте строгий;
использовать предупреждения;
# Определите некоторые значения, которые я мог бы использовать
мой $ main_foreground_colour = "черный";
мой $ main_background_colour = "белый";
мой $ highlighted_foreground_colour = "белый";
мой $ highlighted_background_colour = "# 000033";
# Определить набор пар свойство / значение, которые я хочу
# использовать более одного раза.