Вложенные правила · Less. Путеводитель для новичков
В хорошо структурированных таблицах стилей нет необходимости присваивать каждому элементу классы. Достаточно лишь более подробно описывать стили элементов, используя возможность вкладывать селекторы в другие селекторы. К слову, такие селекторы называются вложенными и представляют собой объёмную структуру.
Пример 2.2.1
Ниже приведён так называемый «подробный CSS», в котором представлена модель вложенности одних селекторов в другие селекторы.
.global-header {
background-color: #f5f5f5;
color: #443d3d;
border-bottom: 1px solid #ddd;
}
.global-header h2 {
margin-top: 0;
margin-bottom: 0;
font-size: 4rem;
}
.global-header h2 small {
font-size: 2rem;
}
.global-header .header-actions {
background-color: #fff;
padding-top: 10px;
padding-bottom: 10px;
text-align: center;
}
Решение проблем
Все это хорошо, но ровно до тех пор, пока имена классов короткие, глубина вложенности не велика, а ваши глаза в состоянии уследить за этой структурой. Лично я, до тех пор, пока не стал пользоваться CSS-препроцессорами, писал код именно так, попутно разделяя CSS-файл на логические блоки и пытаясь уследить за его чистотой. Это удобно и практично, но мне быстро надоедало сортировать код по вложенности, и моя таблица стилей иногда была похожа на мешанину из букв и цифр. Разумеется, что перед финальной сборкой проекта все это исправлялось, но это не тот случай, на который хочется тратить время.
Представьте себе оглавление простейшей книги, например, такое:
1. Глава 1. Это моя первая глава книги
1.1. Это мой первый рассказ о том, что я сделал
1.1.1. Немного подробнее о том, что я сделал
1.2. Это мой второй рассказ о том, что я сделал
1.Х. ...
Здесь довольно легко понять, что пункт 1.1 — это следствие первого пункта. Но тем не менее, если переписать это в более читабельном формате, можно сэкономить время на обработке цифр в голове.
Абстрактно, можно представить следующий формат:Это моя первая глава книги
Это мой первый рассказ о том, что я сделал
Немного подробнее о том, что я сделал
Это мой второй рассказ о том, что я сделал
Именно такая модель вложенности присутствует в Less, когда один селектор, в прямом смысле слова, вкладывается в другой селектор. Таким образом получается легко поддерживаемая, читаемая и приятная глазу структура. Если же попытаться спроецировать такую модель на CSS-код, то она будет иметь вид:
.class-1 {
property: value;
.class-2 {
property: value;
}
.class-3 {
property: value;
}
}
Для большей наглядности я предлагаю обратиться к конкретному примеру, в котором я постараюсь сопоставить классический CSS и Less код.
Пример 2.2.2
Здесь я переписал код из примера 2.2.1, заменяя классический синтаксис на препроцессорный.
.global-header {
background-color: #f5f5f5;
color: #443d3d;
border-bottom: 1px solid #ddd;
h2 {
margin-top: 0;
margin-bottom: 0;
font-size: 4rem;
small {
font-size: 2rem;
}
}
.header-actions {
background-color: #fff;
padding-top: 10px;
padding-bottom: 10px;
text-align: center;
}
}
На изображении ниже представлена модель вложенности, описываемая в этом примере. Для наглядности и понимания сути происходящего экран разделен на две части, где слева код написан на препроцессорном языке, а справа на «чистом» CSS.
Мысли и советы
Согласитесь, теперь ваш код становится интуитивно понятным и удобным для чтения. В такой структуре сложно запутаться и потеряться среди селекторов, ведь здесь чётко видна их вложенность и не нужно помнить имя родительского селектора — за нас это делает компилятор.
Предостережение!
Постарайтесь запомнить раз и навсегда, что вкладывать селекторы друг в друга можно бесконечно, но делать это строго не рекомендуется! Многие разработчики советуют следить за тем, чтобы структура, в общем случае, не превышала трёх вложений. Нет необходимости вкладывать селекторы, начиная от родительского, на такую глубину. Максимально допустимый уровень, в крайних случаях, пять вложений. Старайтесь избегать крайних случаев, если это действительно не требуется.
Почему этот вложенный стиль css не применяется?
стиль:
.airport-selections {
margin-top: 10px;
.airport-input {
width: 200px;
}
}
html:
<div>
<label for="airport-from">
Departure:
</label>
<input type="text">
</div>
Если я их не вложу, то ширина входных данных будет установлена на 200. Это также происходит со всеми стилями на странице.
Поделиться Источник rwb 26 сентября 2015 в 21:24
2 ответа
- Стиль не применяется
<tr> <td class=main align=left> <div id=menu> <ul id=navbar> … </ul> </div> </td> </tr> #menu { border: 1px solid #D9D4D4; border-radius: 4px; margin: 100px 0px 0px 20px; width: 120px; } Почему стиль меню не применяется к div? Если я эксплицитно…
- Почему мой стиль jQueryMobile CSS применяется к связанной странице?
Я использую стиль jQuery CSS в основной части моего сайта . Это прекрасно работает. Теперь у меня также есть подкаталог моего сайта , который не должен использовать этот стиль. Когда я вручную перемещаю свой браузер в подкаталог веб-сайта, никакой стиль не применяется, что мне и нужно. Однако,…
2
Ваш CSS недействителен, нет такой вещи, как вложенность в CSS. Только меньше или Sass, но до этого Вам еще далеко.
Если вы хотите выбрать элементы внутри других, используйте
. father .child{
yourstyle
}
Все элементы с классом child изнутри всех элементов с классом father получат стиль, примененный к ним.
.airport-selections {
margin-top: 10px;
}
.airport-input {
width: 200px;
}
/*or
.airport-selections .airport-input {
width: 200px;
}
*/
<div>
<label for="airport-from">Departure:</label>
<input type="text">
</div>
1
Без прекомпилятора CSS не существует такой вещи, как вложенные стили CSS.
Проверьте SASS или LESS для вложенности и других вариантов. Но то, что у вас есть, не делает того, что вы думаете.
Поделиться Cooper Buckingham 26 сентября 2015 в 21:29
Похожие вопросы:
Почему стиль css не применяется к модальному?
По какой-то причине стиль css не применяется к модальному React. Есть какая-нибудь причина? render() { return ( <div> <Modal defaultOpen={this.props.isShowing} className=openmodal>…
CSS Стиль Не Применяется
Я пишу веб-приложение ASP.NET, и у меня возникают проблемы с применением стилей CSS. В настоящее время у меня есть главная страница и одна страница контента. Моя главная страница получает стиль CSS,…
CSS стиль не применяется к TextBox в GridView ItemTemplate
У меня есть TextBox в GridView ItemTemplate . Я добавил к нему стиль css , используя CssClass=txtboxAlignRight , но когда я запускаю свою страницу, стиль не применяется. У меня есть еще один TextBox…
Стиль не применяется
<tr> <td class=main align=left> <div id=menu> <ul id=navbar> . .. </ul> </div> </td> </tr> #menu { border: 1px solid #D9D4D4; border-radius: 4px;…
Почему мой стиль jQueryMobile CSS применяется к связанной странице?
Я использую стиль jQuery CSS в основной части моего сайта . Это прекрасно работает. Теперь у меня также есть подкаталог моего сайта , который не должен использовать этот стиль. Когда я вручную…
CSS стиль не применяется к HTML
Я не знаю, почему мой стиль не применяется. *HTML !DOCTYPE html> <html> <head> <meta http-equiv=content-type content=text/html; charset=utf-8/> <meta name=description…
CSS стиль применяется несколько раз
Из отладчика chrome: element.style { } #title a:link,a:visited,a:hover,a:active { color: #FF33CC; text-decoration: none; } (Все, что ниже этого, пробито насквозь) nav…
Почему стиль css не применяется после трансклюзии?
Почему стиль не применяется к В следующем коде я использую ng-transclude . Трансклюзия работает нормально, только проблема в том, что класс .box не применяется к span . Почему это так?…
Почему этот стиль jquery .css не применяется?
Я пытаюсь понять, почему свойство <ul> element .css не применяется из консоли отладчика в Chrome… там написано:: Uncaught TypeError: $(…).css is not a function Это простой код HTML:…
css классов появляется, но стиль не применяется -REACTSTRAP — CSS модулей
Я создал приложение, используя create-react-app. Я использую модули CSS, настраивая файлы webpack. когда я использую reactstrap Bootstrap классы появляются, но стиль не применяется. Следующие…
Вложенные классы в стилях Html, Css самого внутреннего класса
если в HTML есть 3-4 вложенных класса, то как лучше всего упомянуть самый внутренний класс при стилизации в CSS?
<div>
<form>
<input type="text" name"Firstname" value="First Name">
<a href="some link"> Sign up</a>
</form>
Теперь, когда я хочу стилизовать кнопку регистрации, что я должен написать в css, должен ли я упомянуть «. head signUp» или я должен написать «.head newmem signup»
html cssПоделиться Источник
2 ответа
- Заключающая ссылку на экземпляр внешнего класса внутреннего класса из внешнего внутреннего класса
Каждый экземпляр внутреннего класса lives в экземпляре своего внешнего класса. Вопрос в том, как ссылаться на экземпляр внешнего класса, учитывая экземпляр внутреннего класса, когда у внутреннего класса нет члена, указывающего на его экземпляр внешнего класса? Например: в следующем примере метод…
- Внутренние и вложенные классы
Oracle документация (в приведенной ниже ссылке) гласит, что: Нестатические вложенные классы (внутренние классы) имеют доступ к другим членам заключающего класса, даже если они объявлены закрытыми. Но в приведенном ниже примере я создал объект objin (внутреннего класса), и он не мог получить доступ…
1
Вам не нужно упоминать родительский класс. Вы можете получить доступ к дочернему классу напрямую.
В том случае, если у вас есть две формы , скажем class="newmem"
и еще одна class="oldmem"
, и обе имеют <a href="some link"> Sign up</a>
, и вы хотите внести изменения в другую без id
, вы можете сделать: .oldmem .SignUp { }
и только та, которая находится под упомянутым вами родителем, будет затронута.
Поделиться JackDoe 03 мая 2018 в 05:04
0
Сказав .classname (имя класса-это то, что называется вашим классом.) Не имеет значения, является ли он вложенным, на него все равно ссылаются, как и на любой другой элемент.
Поделиться Random Channel 03 мая 2018 в 03:18
Похожие вопросы:
Вложенные Классы C++
Возможные Дубликаты : вложенные классы C++ управление доступом к вложенным классам в C++ Я немного запутался в том, какой доступ имеет вложенный класс к членам заключающего класса. Каковы его…
В java могут ли внутренние классы наследовать от абстрактного класса, определенного вне внешнего класса внутреннего класса?
В java могут ли внутренние классы наследовать от абстрактного класса, определенного вне внешнего класса внутреннего класса? Также могут ли абстрактные классы реализовывать конструкторы?
Как вы определяете вложенные классы класса?
В Ruby, как вы определяете вложенные классы класса?
Заключающая ссылку на экземпляр внешнего класса внутреннего класса из внешнего внутреннего класса
Каждый экземпляр внутреннего класса lives в экземпляре своего внешнего класса. Вопрос в том, как ссылаться на экземпляр внешнего класса, учитывая экземпляр внутреннего класса, когда у внутреннего…
Внутренние и вложенные классы
Oracle документация (в приведенной ниже ссылке) гласит, что: Нестатические вложенные классы (внутренние классы) имеют доступ к другим членам заключающего класса, даже если они объявлены закрытыми….
Можно ли сказать, что метод-локальный класс является типом внутреннего класса?
Поскольку мы не можем использовать модификатор static с локальным классом, определенным внутри метода, и поскольку нестатические вложенные классы являются внутренними классами, мы, вероятно, могли…
C++ вложенные классы
Я просмотрел некоторые статьи SO, но не нашел ничего (пока), что полностью отвечало бы моему вопросу. Прошу прощения, если этот ответ уже где-то существует. Сначала немного предыстории. .. Я хочу…
Горячая замена кода на классы, содержащие вложенные классы
Я пытаюсь динамически применить изменения кода к приложению Java, которое я отлаживаю с помощью Eclipse. Все работает так, как и ожидалось для всех классов, кроме одного. Сделав любое незначительное…
Какова цель внутреннего класса в kotlin?
Я новичок в kotlin. я прохожу через вложенные понятия класса и внутреннего класса в kotlin. Ниже приведен пример вложенного класса . fun main(args: Array<String>) { val demo =…
Доступ к статической переменной внешнего класса из статического внутреннего класса
Я изучаю вложенные классы. Я просто хочу знать, почему я не могу получить доступ к статической переменной внешнего класса из статического внутреннего класса, используя его экземпляр. class MyListner…
Применение мультиклассов в CSS
Введение в мультиклассы.
В данной статье мы познакомимся с так называемыми сложными селекторами, особенностями их применения. Для более простого восприятия материала рекомендуем просмотреть пятый видео урок из курса HTML & CSS.
Для начала вспомним, что таблицы стилей собираются из наборов правил, которые содержат один или несколько селекторов и конечно же содержат блок определений. Блок определений ограничен фигурными скобками и содержит в себе перечень свойств и выбранных для них значений.
Селектором может быть любой элемент или HTML-тег, для которого возможно задание неких правил форматирования. Принцип определения селекторов довольно простой и имеет следующий синтаксис: Name {Style_rules}.
Здесь Name – это имя любого элемента на вашей странице, а Style_rules – описание правил стиля, которые вы собираетесь применить к элементу.
Отдельно обратим ваше внимание на универсальный селектор, который используют, когда требуется установить стиль абсолютно для всех элементов, присутствующих в веб-документе. Он имеет следующий синтаксис:
<head>
<title>CSS title>
<style>
/*Используем универсальный селектор, который обозначается «*» */
* {
color:forestgreen;
}
style>
head>
<body>
Text1
<p>Text2p>
<div>Text3div>
<br />
<span>Text4span>
body>
В случае, когда необходимо одновременно задать один стиль для двух и более элементов, их перечисляют через запятую:
<head>
<title>CSStitle>
<style>
/*Используем перечисление селекторов p, div */
p, div {
color:forestgreen;
}
style>
head>
<body>
Text1
<p>Text2p>
<div>Text3div>
<br />
<span>Text4span>
body>
В случае, когда необходимо задать уникальное имя для элемента и по нему изменить его стили или обратиться через JavaScript, целесообразно использовать идентификатор, изредка называемый «ID селектором».
Поскольку при создании html-документа невозможно отказаться от определенной иерархии вложенности, важно задуматься о том, чтобы стили для вложенных элементов применялись корректно. Целесообразно воспользоваться конструкцией из вложенных селекторов. В самом простом случае получим следующую конструкцию: name1 name2 {Style_rules}, где name1 – родительский элемент, name2 – дочерний (вложенный) тег. При этом подразумевается следующая разметка <name1><name2>…name2>name1>.
<head>
<title>CSStitle>
<style>
div p {
background-color: darkgrey;
color: red;
font-size: 20px;
}
style>
head>
<body>
<p>Параграф 1 p>
<div>
<p>Параграф 2 p>
div>
body>
Стоит помнить, что стили, предопределенные для тега div, также возымели бы свое действие на содержимое тега p, также допускается произвольный уровень вложенности тегов.
Данная конструкция имеет следующий синтаксис: #Name { Style rules }. Стоит помнить, что имена идентификаторов должны быть уникальными, дабы не вызывать коллизий при обращениях, начинаться с латинских символов, в них разрешено включать символы дефиса и нижнего подчеркивания «-», «_». Когда необходимо применить стили из идентификатора определенному тегу, используется атрибут id, которому передается значение – имя идентификатора без решетки.
<head>
<title>CSStitle>
<style>
#id1 {
background-color: #ffd800;
color: #ff0000;
font-size: 40px;
}
style>
head>
<body>
<p>Параграф 2 p>
body>
Порой при определении идентификатора используется конструкция name#id_name {Style rules}, где name может обозначать любой тег. Подобная конструкция ограничивает возможность применения стилей, определенных в идентификаторе только к тегам, одноименным указанному в определении.
Что касается применения классов, они актуальны тогда, когда необходимо задать правила форматирования для определенного селектора или же для нескольких элементов. Существуют следующие варианты использования классов:
.class_name {Style rules}
Класс, определенный таким образом, можно связать с любым тегом, достаточно воспользоваться атрибутом class и передать в его значении имя нашего класса.
Name.class_name {Style rules}
Таким образом накладываются ограничения на применение правил из класса лишь в одноименных тегах Name.
<head>
<title>CSStitle><style>
.myFirstClass {
background-color: darkcyan;
color: darkgreen;
font-size: 40px;
}
div.mySecondClass {
background-color: darkcyan;
color: darkgreen;
font-size: 20px;
}
style>
head>
<body>
<p>Параграф 1 p>
<p>Параграф 1p>
<div>Параграф 1 div>
body>
Работая с классами, стоит помнить о том, что любому элементу можно добавить сразу несколько классов, просто перечисляя их в атрибуте class без каких-либо знаков пунктуации, через пробел. При этом к текущему элементу будут применятся стили, описанные в каждом из классов в блоке правил.
<head>
<title>CSStitle>
<style>
.myFirstClass {
background-color: darkcyan;
}
.mySecondClass {
color: darkgreen;
font-size: 20px;
}
style>
head>
<body>
<p>Параграф 1 p>
body>
Прибегая к мультиклассам, стоит помнить об особенности их работы с повторяющимися правилами, т. е. одноименными свойствами, которые описаны в разных классах и имеют различные значения.
Укажем несколько одинаковых свойств с разными значениями и посмотрим, какие из них будут применены к элементу:
<style>
.myFirstClass {
background-color: darkcyan;
color: darkgreen;
font-size: 40px;
}
.mySecondClass {
background-color: darkgrey;
color: red;
font-size: 20px;
}
style>
Как видим, значения спорных свойств были взяты из того класса, который был описан в коде ниже. Если сменим их очередность, получим следующий результат:
<style>
.mySecondClass {
background-color: darkgrey;
color: red;
font-size: 20px;
}
.myFirstClass {
background-color: darkcyan;
color: darkgreen;
font-size: 40px;
}
—style>
Что касается порядка обьявления используемых классов в атрибуте class непосредвенно в самом теге, он не имеет значения:
<p>Параграф 1p>
<p>Параграф 1p>
Эти две строки возымеют одинаковое воздействие на форматирование параграфа.
Вложенные правила в LESS | IT-блог о веб-технологиях, серверах, протоколах, базах данных, СУБД, SQL, компьютерных сетях, языках программирования и создание сайтов.
Привет, посетитель сайта ZametkiNaPolyah.ru! Этой записью я открываю новую рубрику: Верстка сайтов и ее раздел Препроцессор LESS. HTML код имеет строгую иерархию, разметка HTML документа описывает HTML элементы страницы и позволяет описать иерархию элементов или иначе их вложенность. К сожалению CSS стили не обладают иерархией и их написание не требует от разработчика описывать иерархию вложенности, поэтому код CSS не всегда удобно редактировать с этой точки зрения.
Вложенные правила в LESS
Препроцессор LESS элегантно решает проблему иерархии элементов на странице при помощи вложенных правил. Вложенные правила в LESS не столько сокращают CSS код, сколько структурируют его. В этой записи мы попробуем поработать с вложенными правилами LESS и поговорим о том, что собой представляют вложенные правила, естественно, будет и пример использования вложенных правил LESS.
Для чего нужны вложенные правила в LESS и чем они облегчают написание CSS кода
Содержание статьи:
CSS препроцессор LESS позволяет использовать вложенные правила. Вложенные правила в LESS используются для минимизации CSS кода, а так же позволяют наследовать одним CSS селекторам стили других CSS селекторов. Помимо того, что вложенные правила LESS позволяют наследовать стили одного CSS класса другим, они еще и позволяют использовать имя класса, как свойство для другого класса.
Вложенные правила в LESS могут хранить несколько значений и повторно использоваться в коде сколько вам угодно раз. Думаю, слов достаточно, и мы можем переходить к примеру использования вложенных правил в LESS.
Пример использования вложенных правил в LESS.
Когда мы разбирались установкой LESS компилятора на Windows, мы установили Node.js, который необходим для работы LESS. Теперь нам нужно создать HTML страницу и сохранить его в папке nodejs.
<!DOCTYPE html> <html lang=»en»> <head> <meta charset=»UTF-8″> <title>Вложенные правила в LESS</title> <link rel=»stylesheet» type=»text/css» href=»style.css» /> </head> <body> <div> <h2>Первый заголовок</h2> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Voluptatum quasi sunt molestias non suscipit ab accusantium totam necessitatibus aliquam in ex impedit quis neque deleniti ullam repudiandae eveniet, et quisquam. </p> <div> <h2>Второй заголовок</h2> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Veritatis, quibusdam, dolores! Fugit aperiam, dolores alias tempore, a consequatur dolorem, illo quis rerum quaerat totam. Vel non recusandae magni, eveniet ipsa.</p> </div> </div> </body> </html>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
<!DOCTYPE html>
<html lang=»en»>
<head>
<meta charset=»UTF-8″>
<title>Вложенные правила в LESS</title>
<link rel=»stylesheet» type=»text/css» href=»style.css» />
</head>
<body>
<div>
<h2>Первый заголовок</h2>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Voluptatum quasi sunt molestias non suscipit ab accusantium totam necessitatibus aliquam in ex impedit quis neque deleniti ullam repudiandae eveniet, et quisquam.</p>
<div>
<h2>Второй заголовок</h2>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Veritatis, quibusdam, dolores! Fugit aperiam, dolores alias tempore, a consequatur dolorem, illo quis rerum quaerat totam. Vel non recusandae magni, eveniet ipsa.</p>
</div>
</div>
</body>
</html> |
Этот документ мы сохраним с именем index. html в папке nodejs. Как видите, структура HTML документа простая: здесь указан язык, используемый в HTML документе; есть HTML декларация, которая говорит браузеру, что это HTML 5; есть название HTML документа в тэге <title>. Тело HTML документа имеет два HTML блока <div> c HTML атрибутами class, два HTML заголовка <h2> и два HTML параграфа <p>.
И теперь давайте зададим несколько стилей через LESS файл и скомпилируем его, чтобы посмотреть, как работают вложенные селекторы в LESS:
.content{ h2{ font-size: 14px; color: orange; } p{ font-size: 30px; color:blue; } .main{ h2{ font-size: 14px; color:orange; } p{ font-size: 30px; color:blue; } } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
.content{
h2{
font-size: 14px;
color: orange;
}
p{
font-size: 30px;
color:blue;
}
.main{
h2{
font-size: 14px;
color:orange;
}
p{
font-size: 30px;
color:blue;
}
}
} |
Обратите внимание на фигурные скобки по ним прослеживается четкая иерархия содержимого HTML документа, сразу видно, что блок main лежит внутри блока content, а внутри блока main есть h2 и p. Это первое. Теперь скомпилируйте LESS код в CSS командой:
lessc style.less style.css
lessc style.less style.css |
На выходе вы получите таблицу стилей с именем style.css и следующим содержимым:
.content h2 { font-size: 14px; color: orange; } .content p { font-size: 30px; color: blue; } .content .main h2 { font-size: 14px; color: orange; } .content .main p { font-size: 30px; color: blue; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
.content h2 {
font-size: 14px;
color: orange;
}
.content p {
font-size: 30px;
color: blue;
}
.content .main h2 {
font-size: 14px;
color: orange;
}
.content .main p {
font-size: 30px;
color: blue;
} |
Обратите внимание: код CSS несколько более объемен, чем тот код, что мы написали в LESS файле. Два вывода о вложенных правилах LESS:
- Вложенные правила LESS делают код короче.
- Вложенные правила LESS дают возможность писать иерархические стили, соблюдая иерархию HTML документа.
Результаты работы вложенных правил в LESS
Результат работы вложенных правил LESS вы можете увидеть, открыв файл index. html в браузере, если вы сделали все, как в примере, то браузер покажет вам такую же картинку, как вы видите ниже.
Результат работы вложенных правил LESS
Мы разобрались с вложенными правилами LESS и увидели, что вложенные правила сокращают объем написанного кода и создают иерархию CSS селекторов по аналогии с HTML кодом, тем самым LESS расширяет возможности CSS.
Вложенные теги HTML — gadgetshelp,com
Если вы посмотрите на разметку HTML для любой веб-страницы сегодня, вы увидите элементы HTML, содержащиеся в других элементах HTML. Эти элементы, которые находятся «внутри» других элементов, известны как вложенные элементы , и они необходимы для создания любой веб-страницы сегодня.
Что значит вкладывать теги HTML?
Самый простой способ понять вложение — это думать о HTML-тегах как о полях, в которых содержится ваш контент. Ваш контент может включать в себя текст, изображения и связанные медиа. HTML-теги — это блоки вокруг содержимого. Иногда вам нужно разместить коробки внутри других коробок. Эти «внутренние» коробки вложены в другие.
Если у вас есть блок текста, который вы хотите выделить внутри абзаца, у вас будет два HTML-элемента, а также сам текст.
Пример: это предложение текста.
Этот текст — то, что мы будем использовать в качестве нашего примера. Вот как это будет написано в HTML:
<p> Пример. Это текстовое предложение. </ p>
Чтобы сделать предложение слова жирным, добавьте открывающие и закрывающие теги до и после этого слова.
<p> Пример. Это <strong> предложение </ strong> текста. </ p>
Как видите, у нас есть один блок (абзац), который содержит содержание предложения, плюс второй блок ( пара сильных тегов), который отображает это слово как жирный.
Когда вы вкладываете теги, закрывайте теги в том порядке, в котором вы их открыли. Сначала вы открываете <p>, а затем <strong>, что означает, что вы изменили его и закрыли </ strong>, а затем </ p>.
Еще один способ думать об этом — снова использовать аналогию с блоками. Если вы поместите коробку в другую коробку, вы должны закрыть внутреннюю, прежде чем сможете закрыть внешнюю или содержащую коробку.
Добавление дополнительных вложенных тегов
<p> Пример. Это <strong> предложение </ strong> текста, а также текст <em>, выделенный курсивом </ em>. </ p>
Вы можете видеть, что наш внешний блок <p> теперь содержит два вложенных тега — <strong> и <em>. Они оба должны быть закрыты, прежде чем та коробка, в которой они находятся, может быть закрыта.
<div>
<p> Пример. Это <strong> предложение </ strong> текста, а также текст <em> курсив </ em>. </ p>
<p> Это еще один абзац. < / p>
</ div>
В этом случае у нас есть коробки внутри коробок! Самым внешним полем является <div> или деление . Внутри этого поля есть пара вложенных тегов абзаца , а внутри первого абзаца у нас есть следующая пара тегов <strong> и <em>.
Почему вы должны заботиться о вложенности
Главная причина, по которой вы должны заботиться о вложенности, — это если вы собираетесь использовать CSS. Каскадные таблицы стилей полагаются на то, что теги должны быть последовательно вложены в документ, чтобы он мог определить, где начинаются и заканчиваются стили. Неправильное вложение мешает браузеру знать, где применять эти стили. Давайте посмотрим на некоторые HTML:
<div class = "main-content">
<p> Пример. Это <strong> предложение </ strong> текста, а также текст <em>, выделенный курсивом </ em>. </ p>
<p > Это <a href="/index.html"> другой абзац </a>. </ P>
</ div>
Используя приведенный выше пример, если мы хотим написать стиль CSS, который будет влиять на ссылку внутри этого раздела, и только на эту ссылку (в отличие от любых других ссылок в других разделах страницы), нам потребуется использовать вложение для записи этот стиль как таковой:
. main-content a {
color: # F00;
}
Другие соображения
Доступность и совместимость с браузерами тоже важны. Если ваш HTML-код неправильно вложен, он не будет таким же доступным для программ чтения с экрана и более старых браузеров — и он может даже полностью нарушить визуальный вид страницы, если браузеры не смогут понять, как правильно отобразить страницу, поскольку элементы и теги HTML не на своем месте.
Наконец, если вы хотите написать полностью правильный и правильный HTML, вам нужно использовать правильное вложение. В противном случае каждый валидатор пометит ваш HTML как неправильный.
30 CSS-селекторов, которые вы должны знать
Поговорим о CSS селекторах. Помимо обычного обращения к элементам через имя класса, id и название html тегов, можно использовать специальные комбинации и команды. Рассмотрим их в статье подробнее. Некоторые селекторы поддерживаются всеми браузерами, некоторые только самыми новыми версиями браузеров.
1. * — выделение всех элементов
* {
margin: 0;
padding: 0;
}
Начнем с простых селекторов, и затем рассмотрим более сложные. Многие разработчики используют его для того, чтобы скинуть у всех элементов значения margin
и padding
. На первый взгляд это удобно, но все-таки в рабочем коде так лучше не делать. Этот CSS-селектор слишком сильно грузит браузер.
Его также можно использовать для выделения всех дочерних элементов, определенного контейнера.
#container * {
border: 1px solid black;
}
В данном случае выделяться все дочерние элементы блока #container
. Старайтесь не злоупотреблять им.
Совместимость
- IE6 +
- Firefox
- Chrome
- Safari
- Opera
2. #X
#container {
width: 960px;
margin: auto;
}
Знак решетки перед CSS-селектором выделит нам элемент с id="container"
. Это очень просто, но будьте аккуратны при использовании id.
Спросите себя: мне абсолютно необходимо выделение по id?
id жестко привязывают стиль к элементу и не дает возможности повторного использования. Более предпочтительным будет использование классов class=""
, названий тэгов или даже псевдо-классов.
Совместимость
- IE6 +
- Firefox
- Chrome
- Safari
- Opera
3 .Х
.error {
color: red;
}
Это CSS-селектор класса Х. Разница между id и классом заключается в том, что одному классу может принадлежать несколько элементов на странице. Используйте классы, когда вы хотите применить стиль к нескольким однотипным элементам. При использовании id вам придется писать стиль для каждого отдельного элемента.
Совместимость
- IE6 +
- Firefox
- Chrome
- Safari
- Chrome
4. Х Y
li a {
text-decoration: none;
}
CSS-селектор дочерних элементов встречается чаще всего. Если вам надо выделить элементы определенного типа из множества дочерних элементов, используете этот селектор. Например, вам надо выделить все ссылки, которые находятся в элементе li
. В этом случае используйте этот селектор.
Не следует делать CSS-селекторы вида Х Y Z A B.error
. Всегда спрашивайте себя, а обязательно ли для выделения данного элемента писать такой громоздкий CSS-селектор.
Совместимость
- IE6 +
- Firefox
- Chrome
- Safari
- Chrome
5. X
a { color: red; }
ul { margin-left: 0; }
Что делать, если вы хотите, чтобы охватить все элементы данного типа на странице? Будьте проще, используйте CSS-селектор типа. Если вы должны выделить все неупорядоченные списки, используйте ul {}
Совместимость
- IE6 +
- Firefox
- Chrome
- Safari
- Opera
6. X:visited and X:link
a:link { color: red; }
a:visted { color: purple; }
Мы используем псевдо-класс :link
, для выделения всех ссылок, на которые еще не кликнули.
Если же нам надо применить определенный стиль у уже посещенным ссылкам, то используем псевдо-класс :visited
.
Совместимость
- IE7 +
- Firefox
- Chrome
- Safari
- Opera
7. Х+Y
ul + p { color: red; }
Выделяет последующий элемент. Он будет выбирать только элемент типа Y, который идет сразу после элемента Х. В примере текст первого абзаца после каждого ul
будет красного цвета.
Совместимость
- IE7 +
- Firefox
- Chrome
- Safari
- Chrome
8. Х>Y
div#container > ul { border: 1pxsolidblack; }
Разница между стандартными Х Y и X > Y
состоит в том, что рассматриваемый CSS-селектор будет выбирать только непосредственные дочерние элементы. Например, рассмотрим следующий код.
<divid="container">
<ul>
<li> Элемент списка
<ul>
<li> Дочерний элемент</li>
</ul>
</li>
<li> Элемент списка </li>
<li> Элемент списка </li>
<li> Элемент списка </li>
</ul>
</div>
CSS-селектор #container > ul
выберет только ul
, которые являются непосредственными дочерними элементами div с id =container
. Он не выберет, например, ul
, являющиеся дочерними элементами первых li .
Поэтому можно получить выигрыш в производительности используя данный CSS-селектор. В самом деле, это особенно рекомендуется при работе с jQuery или другими библиотеками, выбирающими элементы на основе правил CSS -селекторов.
Совместимость
- IE7 +
- Firefox
- Chrome
- Safari
- Opera
9. Х ~ Y
ul ~ p { color: red; }
Этот CSS-селектор очень похож на X + Y, однако, является менее строгим. При использовании ul + p
будет выбрать только первый элемент, идущий за Х. В данном случае будут выбраны все элементы p, идущие на ul.
Совместимость
- IE7 +
- Firefox
- Chrome
- Safari
- Opera
10. X[title]
a[title] { color: green; }
В CSS-селекторах также можно использовать атрибуты. Например в данном примере мы выделили все ссылки, имеющие атрибут титле. Остальные ссылки останутся не затронутыми.
Совместимость
- IE7 +
- Firefox
- Chrome
- Safari
- Opera
11. X [href=»Foo»]
a[href="http://yandex.ru"] { color: #ffde00; }
Все ссылки, которые ссылаются на yandex.ru будут золотыми. Все остальные ссылки останутся неизменными неизменным.
Обратите внимание, что на кавычки. Не забудьте так же делать в jQuery и других JavaScript библиотеках, в которых элементы выбираются по CSS-селекторам. По возможности, всегда используйте CSS3 CSS-селекторы.
Хорошее правило, но слишком строгое. Что же делать, если ссылка ведет не непосредственно на yandex.ru, а например на http://yandex.ru/page1? В этих случаях мы можем использовать регулярные выражения.
Совместимость
- IE7 +
- Firefox
- Chrome
- Safari
- Chrome
12. X [HREF *= «yandex. » — наиболее часто используемый в регулярных выражениях символ. Он используется для обозначения начала строки. Если мы хотим охватить все тэги, у которых href начинается с http, нам надо использовать CSS-селектор, приведенных выше.
Обратите внимание, что мы не ищем «http://». Это не правильно, поскольку не учитываются адреса, начинающиеся с https://
А если мы хотим задать стиль только для ссылок, ведущих на фотографию? Нужно искать конец строки.
Совместимость
- IE7 +
- Firefox
- Хром
- Safari
- Опера
14. X [href$=». JPG»]
a[href$=".jpg"] { color: red; }
Опять же, мы используем символ регулярного выражения «$» для обозначения конца строки. В данном мы ищем ссылки, которые ссылаются на jpg-файлы, или url-ы, в конце у которых стоит «.jpg».
Совместимость
- IE7 +
- Firefox
- Хром
- Safari
- Опера
15. X[data-*=»foo»]
a[data-filetype="image"]{ color: red; }
Как же нам теперь написать CSS-селектор, который бы выделял ссылки на все виды изображений? Например, мы могли бы написать так:
a[href$=".JPG"],
a[href$=". JPEG"],
a[href$=".PNG"],
a[href$=".GIF"] {
color: red;
}
Но это геморрой и неэффективно. Другим возможным решением является применение пользовательских атрибутов. Почему бы нам не добавить наш собственный атрибут data-filetype в каждую ссылку?
<ahref="path/to/image.jpg"data-filetype="image"> Ссылка на изображение </a>
Теперь мы можем выделить такие ссылки при помощи данного CSS-селектора:
a[data-filetype="image"] { color: red; }
Совместимость
- IE7 +
- Firefox
- Хром
- Safari
- Опера
16. X[foo~=»bar»]
a[data-info~="external"] { color: red; }
a[data-info~="image"] { border: 1pxsolidblack; }
А вот кое-что особенное. Не все знают об этом CSS-селекторе. Тильда (~) позволяет выделить определенный атрибут из списка атрибутов, разделенных запятой.
Например, мы можем задать наш собственный атрибут data-info, в котором указывать несколько ключевых слов через пробел. Так, мы можем указать, что ссылка является внешней и что она ссылается на изображение.
"<a href="path/to/image.jpg" data-info="external image"> Click Me </a>
Вот, Html-код на месте, теперь напишем стили.
/ * Выбираем ссылки с атрибутом data-info, содержащий значение "external"* /
a[data-info~="external"] { color: red; }
/ * И которые содержат значения "image"* /
a[data-info~="image"] { border: 1pxsolidblack; }
Неплохо, да?
Совместимость
- IE7 +
- Firefox
- Хром
- Safari
- Опера
17. X:checked
input[type=radio]:checked { border:1pxsolidblack; }
Этот псевдокласс выделяет только элементы пользовательского интерфейса, такие как переключатель или флажок. Причем те, которые отмечены/выбраны. Очень просто.
Совместимость
- IE9 +
- Firefox
- Хром
- Safari
- Опера
18. X:after
Псевдоклассы :before и :after очень крутые. Создается впечатление, что каждый день появляются новые способы их эффективного использования. Они просто генерируют контент вокруг выбранного элемента.
Многие познакомились с этими псевдоклассами при работе с clear-fix hack.
.clearfix:after {
content: "";
display: block;
clear: both;
visibility: hidden;
font-size: 0;
height: 0;
}
. clearfix {
*display: inline-block;
_height: 1%;
}
Этот хак использует :after чтобы добавить пробел после элемента, а запретить его обтекание.
Согласно спецификации CSS3, вы должны использовать два двоеточия (::). Однако, можно использовать и одно двоеточие для совместимости.
Совместимость
- IE8 +
- Firefox
- Хром
- Safari
- Опера
19. X:hover
div:hover { background: #e3e3e3; }
Хотите применить стиль к элементу, когда наводите на него мышкой? Тогда этот CSS-селектор для вас.
Имейте в виду, что старые версии Internet Explorer применяют :hover только к ссылкам.
Этот CSS-селектор часто используют для того, чтобы поставить border-bottom на ссылки, когда на них наводят мышкой.
a:hover { border-bottom: 1pxsolidblack; }
border-bottom: 1px solid black;
выглядит лучше, чем text-decoration: underline;
Совместимость
- IE6 + (В IE6: hover должен быть применен к ссылке)
- Firefox
- Хром
- Safari
- Опера
20. X:not(selector)
div:not(#container) { color: blue; }
Псевдокласс отрицания бывает очень полезным. Скажем, я хочу выбрать все div, за исключением того, который имеет id = container . Приведенный выше код справиться с этим!
Или, если бы я хотел выбрать все элементы, за исключением p.
*:not(p) { color: green; }
Совместимость
- IE9 +
- Firefox
- Хром
- Safari
- Опера
21. X::псевдоэлемент
p::first-line {
font-weight: bold;
font-size: 1.2em;
}
Мы можем использовать псевдо элементы, чтобы оформлять фрагменты элементов, такие как первая строка, или первая буква. Имейте в виду, что они должны быть применены к элементам уровня блока для того, чтобы вступили в силу.
Псевдо-элемент задается двумя двоеточиями: ::
Выбираем первую букву в параграфе
p::first-letter {
float: left;
font-size: 2em;
font-weight: bold;
font-family: cursive;
padding-right:2px;
}
Этот код выберет все параграфы, и в них в свою очередь выберет первые буквы и применит к ним этот стиль.
Выбираем первую строку в абзаце
p::first-line {
font-weight: bold;
font-size: 1.2em;
}
Аналогичным образом благодаря ::first-line мы задаем стиль первой строки в абзаце.
«Для совместимости с существующими таблицами стилей, браузер должен понимать прежнее обозначения псевдо элементов с одним двоеточием, введенные в CSS 1, 2 (:first-line, :first-letter, :before and :after). Эта совместимость не допускается для новых псевдо-элементов, введенных в этой спецификации» Источник
Совместимость
- IE6 +
- Firefox
- Хром
- Safari
- Опера
22. X:nth-child(n)
li:nth-child(3) { color: red; }
Раньше мы не могли выделить, например, третий дочерний элемент? nth-child решает это!
Обратите внимание, что nth-child принимает целое число в качестве параметра, однако отсчет ведется не с 0. Если вы хотите выбрать второй пункт списка, используйте li:nth-child(2) .
Мы даже можем выбрать каждый четвертый элемент списка, просто написав {0}li:nth-child(4n){/0}.
Совместимость
- IE9 +
- Firefox 3,5 +
- Хром
- Safari
23. X:nth-last-child(n)
li:nth-last-child(2) { color: red; }
Что делать, если у вас огромный список элементов в ul , а нем нужно выбрать третий элемент с конца? Вместо того, чтобы писать li:nth-child(397), можно использовать nth-last-child.
Этот метод почти идентичен приведенному выше, однако отсчет ведется с конца.
Совместимость
- IE9 +
- Firefox 3,5 +
- Хром
- Safari
- Опера
24. X:nth-of-type(n)
ul:nth-of-type(3) { border: 1pxsolidblack; }
Бывает, что надо выбрать не дочерний элемент, а элемент определенного типа.
Представьте себе, что на странице пять неупорядоченных списков. . Если вы хотите применить стиль только к третьему ul, не имеющему уникального id, нужно использовать nth-of-type.
Совместимость
- IE9 +
- Firefox 3,5 +
- Хром
- Safari
25. X:nth-last-of-type(n)
ul:nth-last-of-type(3) { border: 1pxsolidblack; }
Мы можем также использовать nth-last-of-type, отсчитывая элементы с конца.
Совместимость
- IE9 +
- Firefox 3,5 +
- Хром
- Safari
- Опера
26. X:first-child
ul li:first-child { border-top: none; }
Этот псевдокласс выбирает первый дочерний элемент. Часто используется чтобы убрать border в первом и последнем элементе списка.
Совместимость
- IE7 +
- Firefox
- Хром
- Safari
- Опера
27. X:last-child
ul > li:last-child { color: green; }
В противоположность :first-child :last-child
выбирает последний дочерний элемент.
Совместимость
- IE9 + (Да да, IE8 поддерживает
:first-child
, но не поддерживает:last-child
. Microsoft-у привет! ) - Firefox
- Хром
- Safari
- Опера
28. X:only-child
div p:only-child { color: red; }
Вы не часто встретите этот псевдокласс, тем не менее он существует.
Он позволяет вам выбрать элементы, которые являются единственными дочерними. Например, применим приведенный выше стиль к этому html-коду:
<div>
<p> Один параграф.</p>
</div>
<div>
<p> Два параграфа </p>
<p> Два параграфа </p>
</div>
Будет выбран p только первого div`a, потому что он единственный дочерний элемент.
Совместимость
- IE9 +
- Firefox
- Хром
- Safari
- Опера
29. X:only-of-type
li:only-of-type { font-weight: bold; }
Очень интересный псевдокласс. Он затрагивает элементы, не имеющие соседей в пределах родительского элемента. В качестве примера выберем ul только с одним элементом в списке.
Единственное решение заключается в использовании only-of-type .
ul > li:only-of-type { font-weight: bold; }
Совместимость
- IE9 +
- Firefox 3,5 +
- Хром
- Safari
- Опера
30. X:first-of-type
first-of-type выбирает первый элемент заданного типа. Чтобы лучше понять, посмотрим на пример.
<div>
<p> Параграф </p>
<ul>
<li> Пункт 1 </li>
<li> Пункт 2 </li>
</ul>
<ul>
<li> Пункт 3 </li>
<li> Пункт 4 </li>
</ul>
<div>
А теперь попытайтесь понять как выделить пункт 2.
Решение 1
ul:first-of-type > li:nth-child(2) { font-weight: bold; }
Решение 2
p + ul li:last-child { font-weight: bold; }
Решение 3
ul:first-of-type li:nth-last-child(1) { font-weight: bold; }
Совместимость
- IE9 +
- Firefox 3,5 +
- Хром
- Safari
- Опера
Источник статьи: http://net. tutsplus.com/tutorials/html-css-techniques/the-30-css-selectors-you-must-memorize/
Избегайте вложенных селекторов для более модульного CSS — TheSassWay.com
Мы уже писали об опасности слишком глубокой вложенности ваших селекторов CSS. Правило начала — хорошее правило, позволяющее избежать некоторых искаженных селекторов CSS. Но на самом деле есть много преимуществ в том, чтобы пойти дальше этой концепции. Что происходит, если вы избегаете вложенности почти для всех ваших основных селекторов?
Контекстные селекторы
Во-первых, давайте поговорим о том, почему это может быть хорошей идеей.Одна из самых сильных сторон CSS — это возможность стилизовать элементы по-разному в зависимости от контекста. Например:
.post { маржа: 2em 0; .заглавие { размер шрифта: 2em; шрифт: нормальный; } } .sidebar .post { маржа: 1em 0; .заглавие { размер шрифта: 1.2em; font-weight: жирный; } }
Приведенный выше код является базовым примером того, как можно по-разному оформить сообщение в блоге в зависимости от того, находится оно на боковой панели или нет.
На первый взгляд такая контекстная мощь может показаться очень хорошей идеей.Вы можете использовать тот же HTML-код на боковой панели вашего сайта, что и в основной части сайта, и получить очень разные стилистические результаты.
Но что произойдет, если вы захотите использовать стили, которые вы написали для сообщений на боковой панели в индексе архива или что-то подобное? Ой! Наш контекстный код нужно будет обновить для нового контекста.
Now Sass предоставляет множество мощных инструментов, которые могут упростить совместное использование стилей в различных контекстах, но это часто связано с дополнительными затратами на сложность.Если вы вообще заботитесь о написании поддерживаемого кода, вы избежите сложности любой ценой.
Более модульный вариант
Давайте запишем эти стили более модульно:
. post { маржа: 2em; .заглавие { размер шрифта: 2em; шрифт: нормальный; } } .резюме { маржа: 2em; .заглавие { размер шрифта: 1.2em; font-wieght: жирный; } }
Хот-дог! Так-то лучше. Теперь мы сделали наши правила более общими и не слишком сильно влияли на контекст.Теперь у нас есть два отдельных «модуля» CSS. Сообщение и резюме. Сводку можно использовать для элементов боковой панели или в нашем архивном указателе.
Но мы можем улучшить этот код и дальше. Класс заголовка по-прежнему используется в контексте. Все, что нужно, — это объявить более общее правило заголовка, и ваши стили могут быть отброшены.
Столкновение миров
Предположим, вы решили создать заголовок страницы и объявили правило следующим образом:
.title { размер шрифта: 3em; font-weight: жирный; красный цвет; }
Не задумываясь о том, как вы уже использовали title в других контекстах, вы создали правило, которое будет влиять на все другие элементы, которые также используют класс «title».Этот пример немного надуманный, но в реальном мире такое столкновение стилей является обычным явлением. В проектах, над которыми я работал в прошлом, в которых используется этот стиль кодирования, часто бывает, что кто-то добавляет новое правило где-то еще, которое вытесняет стили в других контекстах. В больших проектах такие «ошибки» бывает трудно отловить до того, как код будет запущен в производство.
Итак, как мы можем упростить наш код и в то же время добавить ясности? Как это:
.page-title { размер шрифта: 3em; font-weight: жирный; красный цвет; } // Сообщения .Почта { маржа: 2em 0; } .Заголовок поста { размер шрифта: 2em; шрифт: нормальный; } // Сводки .резюме { маржа: 1em 0; } .summary-title { размер шрифта: 1.2em; font-weight: жирный; }
А! Намного лучше! Это сводит к минимуму вероятность того, что другие правила будут конфликтовать с теми, которые мы только что определили, и помогает гарантировать, что наши модули CSS будут выглядеть одинаково в любом контексте.
Контекст и модульность
Ключевое слово здесь контекст . Если вы цените модульность, вы будете стремиться избегать контекстных стилей.Бывают случаи, когда контекст может быть полезен. Они часто требуются для адаптивного дизайна и тем. Но вы должны быть очень осознанными, выбирая использование контекстных стилей. Если вы используете их, не задумываясь, вы можете обнаружить, что ваш код чрезвычайно сложно поддерживать, а случайные ошибки появляются чаще, чем вам хотелось бы.
Также стоит отметить, что если вы обнаружите, что регулярно используете вложение, вам следует подумать, может ли его удаление упростить ваш код.
Заключение
Надеюсь, вы не сочтете эти идеи слишком спорными.Если вы хотите узнать больше о модульном CSS, я настоятельно рекомендую взглянуть на электронную книгу Джонатана Снука по этой теме и последовать примеру Гарри Робертса в CSS Wizardry.
Combinators — Мастерская по макету CSS
Добавление класса или идентификатора — не единственный способ изменить стиль некоторых частей документа. Наши более сложные селекторы дают вам возможность выбирать элементы в зависимости от того, где они находятся в документе. Первый набор селекторов, на который мы можем взглянуть, — это комбинаторы.Есть четыре разных комбинатора, и они работают, комбинируя другие селекторы.
Мастер-класс по макету CSS: комбинаторы
Селектор потомков
Выбрать все элементы, являющиеся потомками указанного родителя.
Когда вы используете селектор-потомок, вы можете указать родительский селектор, а затем элемент, который хотите стилизовать. Итак, если у меня есть такая разметка:
Содержимое
Содержимое внутри блочного класса.
Если бы я выбрал элемент p с помощью селектора элементов, который бы стилизовал оба абзаца — один внутри div с классом box, а также тот, который снаружи. Чтобы стилизовать только p внутри .box, я использую селектор потомков.
. Коробка п {}
Здесь .box
— это указанный родительский элемент, а p — это селектор внутри этого родителя, к которому мы собираемся применить стили CSS.
В списке может быть более одного потомка. Например, выбор только элементов li, которые являются дочерними по отношению к элементу ul
внутри родительского элемента с классом box.
.box ul li {}
Вышеупомянутый селектор не выбрал бы элемент li, если бы он находился внутри ol
. С длинными цепочками селекторов вы снова можете попасть в ловушку создания CSS, который очень трудно использовать повторно. Если ваши селекторы содержат более трех элементов, это часто указывает на то, что существует лучший способ структурировать ваш CSS.
Селектор детей
Выбрать все элементы, которые являются непосредственными дочерними элементами указанного родителя
Селектор потомков будет нацелен на всех потомков, даже если есть другие элементы между родителем и потомком. Например, если мы возьмем следующую разметку:
- Пункт первый
- Пункт второй
- Пункт 2а
- Пункт 2b
- Пункт третий
Если мы использовали селектор потомков:
.шт. ли {}
При этом будут выбраны все элементы li
, вложенные в первую ul
и вложенные в ul внутри li для элемента 2. Если вместо этого использовать дочерний селектор:
.items> li {}
При этом будут выбраны только элементы li
, которые являются прямым потомком . items
. Если между ними есть другой элемент, то li
не будет выбран. Примером того, где вы можете использовать этот метод, является удаление маркеров списка из внешнего списка, но сохранение их для вложенных списков.
.items> li {
стиль списка: нет;
}
Соседний брат
Выбрать элементы, которые являются соседними элементами элемента
Селектор смежного родственного элемента — это полезный селектор, который позволяет выбирать элемент, когда он находится рядом с другим элементом. Вот как мы можем работать с такими вещами, как составные заголовки в CSS.
Часто просят сделать абзац, который идет сразу после заголовка, каким-либо образом, чтобы выделить его.Это может быть достигнуто с помощью соседнего брата, следующий селектор выбирает элемент p только тогда, когда он идет после h3.
h3 + p {}
Конечно, их можно комбинировать. Если вы хотите, чтобы это происходило только для содержимого внутри оболочки с классом .box
, вы можете объединить селектор-потомок со смежным родственником.
. Коробка h3 + p {}
Вышеупомянутый селектор выберет только элемент p, который идет после элемента h3, где оба находятся внутри чего-то с классом.коробка.
General Sibling
Выбрать элементы, которые являются родственниками элемента
Общий селектор одноуровневых элементов работает аналогично соседнему одноуровневому элементу, но выбирает всех одноуровневых элементов, следующих за указанным элементом, даже если они не находятся рядом друг с другом. Этот селектор был добавлен на уровень 3 модуля «Селекторы».
Если я хочу выбрать все элементы p, которые идут после h3, я бы использовал:
h3 ~ p {}
Это выберет абзацы, но не заголовки, списки или что-то еще.
Основы Sass: Вложение — SitePoint
Когда вы только начинаете использовать Sass, одна из первых функций, о которых вы услышите, — это вложение. Одна из причин, по которой мы можем использовать препроцессор, состоит в том, чтобы уменьшить объем набора текста, который нам необходим для создания правил CSS. Вложенность позволяет нам использовать ярлыки для создания наших правил. Проблема всех хороших инструментов в том, что всегда есть возможность их неправильного использования.Вложение ничем не отличается, поскольку чрезмерное использование может привести к созданию сложных, неуправляемых таблиц стилей.
Что такое Nesting
Вложенность позволяет писать селекторы, имитирующие структуру вашего HTML. Это позволяет вам использовать ярлыки для создания вашего CSS. Например:
div {
п {
черный цвет;
}
}
Это простейшее вложение. Элемент div
включает элемент P. Это, в свою очередь, будет компилироваться в.
div p {цвет: черный; }
Мы могли бы также дать div
его собственные свойства.
div {
размер шрифта: 14 пикселей;
п {
черный цвет;
}
}
Это, в свою очередь, компилируется в два отдельных правила, одно для отдельного блока div
, а другое для элемента p
внутри блока div
.
div {font-size: 14px;}
div p {цвет: черный; }
Как использовать раскрой
Вложение стилей достаточно простое. Вы просто заключаете селектор (или селекторы) в фигурные скобки другого селектора.
.parent {
.ребенок {
}
}
Вложенность может расширяться на сколько угодно уровней. Это означает, что вы можете вкладывать элементы внутри элемента, который, в свою очередь, вложен внутрь другого элемента.
.first-level {
.второй уровень {
.third-level {
.fourth-level {
}
}
}
}
На самом деле нет ограничений на количество уровней, на которые вы можете вкладывать элементы. Главное помнить: то, что вы можете что-то делать, не означает, что вы должны.Как правило, рекомендуется не влезать глубже трех уровней. Все, что больше этого, начинает влиять на читаемость кода. Sass помогает нам быстрее писать CSS, а не создавать кучу стилей, которые невозможно поддерживать. Например
.page {
семейство шрифтов: без засечек;
.содержание {
цвет фона: черный;
.text {
цвет белый;
размер шрифта: 12 пикселей;
.Заголовок {
font-weight: жирный;
a {
цвет синий;
&: посетил {
цвет: зеленый;
}
&: hover {
красный цвет;
}
&: active {
цвет: желтый;
}
}
}
}
}
}
Выглядит достаточно невинно с вложенностью на пять уровней.Взгляд на скомпилированный вывод показывает проблемы со слишком глубоким вложением.
.page {font-family: sans-serif; }
.page .content {цвет фона: черный; }
.page .content .text {цвет: белый; размер шрифта: 12 пикселей; }
.page .content .text .headline {font-weight: жирный; }
.page .content .text .headline a {цвет: синий; }
.page .content .text .headline a: посетил {цвет: зеленый; }
.page .content .text .headline a: hover {цвет: красный; }
.page .content .text .headline a: active {цвет: желтый; }
Это представляет проблему, если мы изменим структуру одной из наших веб-страниц.Допустим, мы изменили .content на .article. Все базовые классы придется переписать, поскольку все они зависят от нахождения внутри .content.
У нас также есть проблемы с тем, что правила, которые мы создаем, полезны только в одной части нашего кода. Если мы хотим использовать стили для .text где-то еще на нашем сайте, мы не можем, поскольку . text привязан к элементам, которые его окружают.
Ссылка на родительские селекторы
В приведенном выше ужасном примере мы используем амперсанд &, чтобы указать, где нужно разместить родительский селектор.: Используется в приведенном выше примере для создания псевдокласса элемента привязки.
a {
цвет синий;
&: посетил {
цвет: зеленый;
}
&: hover {
красный цвет;
}
&: active {
цвет: желтый;
}
}
Это компилируется в
a {цвет: синий; }
а: посетил {цвет: зеленый; }
a: hover {цвет: красный; }
а: активный {цвет: желтый; }
Сам по себе он очень удобен для чтения и, как следствие, может обслуживаться кем угодно.Вы также можете использовать & для создания составных селекторов. Для этого после амперсанда добавляется суффикс. Например:
.col {
& -span1 {ширина: 8,33%; }
& -span2 {ширина: 16,66%; }
& -span3 {ширина: 24,99%; }
}
Что дает нам
.col-span1 {ширина: 8,33%; }
.col-span2 {ширина: 16,66%; }
.col-span3 {ширина: 24,99%; }
Как видите, родительский селектор находится там, где находится амперсанд.
Вложенные объекты
Sass также обеспечивает сокращение для написания стилей с использованием пространств имен CSS.Обычно при установке свойств в одном и том же пространстве имен, например, border
, мы должны записать отдельные свойства в нашу таблицу стилей. С помощью Sass мы можем один раз написать пространство имен и вложить его свойства.
.example {
граница: {
стиль: штриховой;
ширина: 30 пикселей;
цвет синий;
}
}
Это компилируется в
.example {
стиль границы: пунктирная;
ширина границы: 30 пикселей;
цвет границы: синий;
}
Как видите, пространство имен добавлено к свойствам. В отличие от приведенного выше примера, нам не нужно было включать &, чтобы граница отображалась в правильном месте.
Заключение
Теперь, когда вы знаете, что такое вложение, используйте его ответственно. Иногда при создании проекта мы можем упустить из виду масштаб того, что мы создаем. При вложении с помощью Sass легко создать кошмар удобочитаемости. Когда и как использовать вложенность — решать вам, если вы решите пройти 8 уровней, во что бы то ни стало, сделайте это. Просто будьте готовы к долгим ночам работы, если проект требует капитального ремонта.
стратегий для сохранения низкой специфичности CSS
Сохранение низкой специфичности CSS для всех селекторов в вашем проекте — достойная цель. Обычно это признак относительной гармонии. Вы не боретесь против самого себя, и у вас есть много возможностей для отмены стилей, когда вам это нужно. Специфика селекторов имеет тенденцию увеличиваться со временем, и для этого есть жесткий потолок. Я уверен, что мы все чувствовали боль! Important тегов и встроенных стилей.
Так как же нам сохранить низкую специфичность с течением времени?
Дайте себе класс, который вам нужен
Возможно, вы пишете селектор с высокой специфичностью, потому что переопределяете уже существующий селектор.Возможно, элемент, который вы пытаетесь выбрать, размещен на нескольких страницах, поэтому вы выбираете его из более высокого класса:
.section-header {
/ * обычные стили * /
}
body.about-page .section-header {
/ * переопределение с более высокой специфичностью * /
}
Как бы вы ни относились к этому, поймите, что специфика — это , подкрадывающаяся сюда. Чтобы предотвратить это, есть ли способ изменить имя класса для того элемента, который вы пытаетесь стилизовать напрямую? Иногда может быть полезно создание некоторых вспомогательных функций на стороне сервера или переменных для создания классов, чтобы избежать логики в представлениях.
<заголовок>
Что может выводить один класс или оба, по желанию.
.section-header {
/ * обычные стили * /
}
.about-section-header {
/ * переопределение с той же специфичностью * /
/ * возможно расширение стандартного класса * /
}
Рассмотрите исходный порядок таблиц стилей
Возможно, вы применяете дополнительное имя класса для обработки переопределения стиля за вас.
<заголовок>
Но там, где вы пишете свои стили переопределения с .section-header-about
, фактически переопределяются существующим классом. Это может произойти из-за порядка выбора в таблице стилей. Оба селектора имеют одинаковую специфику, поэтому правила от того, какой из них объявлен последним, выиграли.
Исправление, которое означает просто обеспечение того, чтобы где бы вы ни писали, ваш класс переопределения появился позже. Вы можете организовать свои таблицы стилей примерно так:
@import "сторонние библиотеки и прочее";
@import "глобальный материал";
@import "раздел-материал";
@import "определенные-вещи-и-потенциальные-переопределения";
Уменьшите специфичность переопределяемого объекта
Вы знаете, что они говорят об оставлении вещей лучше, чем вы их нашли.Ты должен это сделать.
Если у элемента есть идентификатор и именно он стилизован, можно ли его удалить? Обязательно выполните поиск #that по всему проекту, прежде чем это делать. Он может использоваться как JS-перехватчик (отлично), и в этом случае вы должны оставить его в покое и либо добавить класс, либо использовать класс, уже включенный в него для CSS.
Не избегайте классов, начинающихся с
Известно, что я использовал селектор вроде:
.module> h3 {
}
Это будет работать, пока они не захотят особый стиль для этого элемента h3. Вы можете ввести свою разметку и выглядеть так:
Специальный заголовок
Но к сожалению:
.module> h3 {
/ * обычные стили * /
}
.уникальный {
/ * Я проиграю эту битву за специфичность * /
}
.module .unique {
/ * Это будет работать, но специфика подкрадывается! * /
}
Подкрашивание специфичности происходит из-за того, что нас кусает исходный селектор.Вот почему почти все методики CSS рекомендуют плоские структуры типа:
Это может показаться более утомительным, потому что вам могут не понадобиться эти классы прямо сейчас. Но, не избегая этой работы (не поленитесь!), Крючки, которые у вас появятся позже, могут спасти ваше горе.
Используйте каскад
По мере старения проекта становится все более опасным изменять селекторы со специфичностью low , потому что они потенциально могут повлиять на большее количество вещей и иметь непредвиденные последствия.
#im #just .gonna [do] .this .to .be #safe {
/ * плачет (ಥ_ʖಥ) * /
}
Но сила CSS влияет на большее количество вещей. Надеемся, что наличие прочной основы, на которой вы строите, означает, что когда-либо потребуется меньше переопределений. Стратегиями для этого могут быть такие вещи, как…
Используйте библиотеку паттернов и / или руководство по стилю, и / или атомарный дизайн
Библиотека паттернов (что-то вроде этой) может означать, что у вас есть то, что вы ищете, когда вам это нужно. Нужны вкладки? Вот и все, это устоявшийся способ сделать это.И он, вероятно, построен таким образом, чтобы специфика уже была легкой, поэтому переопределить не будет слишком сложно.
Атомарный дизайн (книга) может помочь вам в создании вашего сайта (или библиотеки шаблонов), поэтому, даже если у вас нет полного шаблона для того, что вам нужно, у вас есть строительные блоки под ним.
Руководство по стилю может спасти вас, потому что оно может налагать определенные правила, касающиеся специфики, в попытке спасти вас от самого себя.
Рассмотрите возможность подписки на типографику
В то же время, когда вы пытаетесь использовать каскад и задать интеллектуальные значения по умолчанию для множества элементов, иногда вам может потребоваться применить некоторые из этих интеллектуальных значений по умолчанию.Например, элемент списка часто используется для навигации и внутри содержимого. Стили для них будут кардинально отличаться. Так почему бы не начать с чистого листа и не применять стили текста только при необходимости.
/ * глобальный сброс стилей * /
ul, ol, li {
стиль списка: нет;
маржа: 0;
отступ: 0;
}
/ * преобразование стилей текста в текстовое содержимое * /
.text-content {
h2, h3, h4 {
}
п {
}
ul {
}
ol {
}
/* так далее */
}
Это действительно увеличивает специфичность этих текстовых селекторов, но это означает, что правила, специально предназначенные для текста, не влияют больше, чем они должны быть, и меньше необходимости в переопределении.
Проблемы вне вашего контроля
Возможно, какой-то сторонний код ожидает или внедряет определенный HTML на вашу страницу. Вы должны с этим работать. Вы все равно можете попробовать использовать селекторы с минимальной специфичностью. Вы можете оставлять комментарии в коде, указывая, почему селекторы такие. Вы можете использовать селекторы с низкой специфичностью, но используйте переопределения! Important. Вы можете спросить людей, ответственных за неидеальный код, могут ли они его исправить.
Слегка уточните специфику и обратите внимание на нее
Если вам нужно ввязаться в конкретный бой, вместо того, чтобы хвататься за кувалду, например ID или! Important, попробуйте что-нибудь более легкое.
Квалификатор тега — это минимально возможное обновление специфичности.
ul.override {
/* Я выигрываю */
}
.обычный {
}
Но ограничение селектора конкретным тегом — странный ограничивающий фактор. Было бы разумно просто добавить вместо этого дополнительный класс. Если другое имя не имеет смысла, при необходимости можно использовать тот же класс.
.nav.override {
}
.override.override {
}
.nav {
}
То, что вложение — это хорошо, не означает, что специфичность должна повышаться.
Вложение в препроцессоры иногда не рекомендуется, потому что оно упрощает написание избыточных селекторов.Но вложение иногда просто визуально удобно в таблице стилей, потому что оно группирует вещи вместе, облегчая чтение и усвоение.
Богдан Кокотко недавно напомнил мне, что амперсанд в Sass может использоваться, по сути, для создания пространств имен, а не для составных селекторов.
.what {
красный цвет;
&-так {
цвет: зеленый;
&-Когда-либо {
цвет синий;
}
}
}
.what {
красный цвет;
}
.и что {
цвет: зеленый;
}
.what-so-ever {
цвет синий;
}
Одноклассная обертка
Довольно действенный способ обработки переопределения — использовать существующий элемент обертывания над областью, к которой необходимо применить переопределения стиля, или добавить новый.
... существующий материал ...
Теперь у вас есть возможность переопределить любой существующий стиль, добавив только один класс в селектор.Это ползучесть специфики, но попытка удержать ее на низком уровне.
.override .existing {
}
Только один раз
Если вы когда-нибудь отменяете переопределение, это хорошее место, чтобы остановиться и подумать еще раз.
Можете ли вы дать себе только один класс, который вы можете использовать вместо этого? Единственное переопределение может быть эффективным, как изменение шаблона вместо создания нового шаблона. Отмена переопределения — это путь к замешательству и дальнейшим столкновениям.
В следующий раз сделай лучше
Если вас укусили проблемы со спецификой, даже если исправить их сейчас непрактично, по крайней мере, теперь вы знаете, что это проблематично, и в следующий раз можно подойти к делу иначе.
вложенных элементов — HTML — Форумы Codecademy
Добро пожаловать. Вот еще кое-что, на что вы должны обратить внимание…
специфичность — это таблица взвешенных баллов . Вот почему мы всегда видим, что это написано как 0 0 0 1
.
Это одна строка таблицы, где каждый столбец имеет разную важность, крайний левый столбец имеет наибольшее значение, а крайний правый — наименьшее. Общие селекторы попадают в последний столбец.
Столбцы суммируются, но никогда не переносятся в соседний столбец. Общая сумма остается в этом столбце.
Когда два правила селектора вступают в конфликт, балл слева является более предпочтительным, и его правило выбора имеет приоритет над любым другим, действовавшим ранее. Это относится к каскаду, но это тоже другая история, не имеющая отношения к вложенности.
Очевидно, что вложение относится к родительско-дочерним отношениям, потомкам предусмотрено любое количество уровней. Я надеюсь, что термин уровень должен быть понятен?
Оказывается, жизненно важно понимать вышесказанное и то, как это лежит в основе обхода DOM .
Представьте себе нейрохимическое вещество, предназначенное для размещения только одной формы прорези в клетке мозга, и несколько или многие или все клетки имеют эту прорезь. Море этих химикатов может прикрепиться к любой случайной ячейке.При достаточном количестве химического вещества все ячейки гарантированно будут заняты этим слотом. Вот как CSS работает в DOM. Он декларативен и повсеместен.
п
Независимо от того, сколько элементов абзаца содержится в документе, ни один из них не выйдет за пределы этого селектора.
Специфичность и каскад — это то, как мы ее переопределяем.
р: первенец
определенно переопределит общий селектор. p
имеет специфичность, 0 0 0 1
, где вышеупомянутое — 0 0 1 1
.
Как нам получить этот взвешенный балл? Подсчитайте кусочки в селекторе. Столбец типа получает 1 для p
, столбец класса получает 1 для : first-child
. Теперь не имеет значения, насколько велико число в крайнем правом столбце. Единственное, что переопределит это, — это селектор со специфичностью 2 или более в столбце класса или значением больше нуля в любом столбце слева.
Обратите внимание, что ни у одного из общих правил никогда не было шанса противостоять этому правилу псевдокласса?
div p
имеет специфичность, 0 0 0 2
, потому что имеет два селектора типа.Единственное, что он более специфичен, чем p
, но может переопределить этот селектор.
div div p
со специфичностью, 0 0 0 3
, может отменить это. Это все еще комбинатор потомков , хотя, как мы видели, он полностью универсален. Помните, универсальные селекторы широко распространены. Они достигают повсюду.
Итог и причина, по которой поощряются универсальные селекторы, заключаются в том, чтобы во всех учетных записях сохранить низкую специфичность. Используйте минимум конкретики, чтобы ваши правила работали.Сделайте это своей мантрой, и CSS всегда будет вашим другом. Когда вы дойдете до написания сценариев и использования JavaScript для опроса и управления DOM, это станет мощным инструментом для продвижения вперед. Знайте, как писать селекторы, которые достигают своих целей.
Sass nesting — Бесплатное руководство по изучению HTML и CSS
Syntax
В Sass правил вложенности CSS позволяет определять селекторов иерархии :
. title {
сильный{}
Эм{}
}
Это будет скомпилировано в:
.заглавие{}
.title strong {}
.title em {}
Поскольку strong
и em
появляются как в пределах правила .title
(между двумя фигурными скобками {
}
), оба будут иметь с добавлением с родительским селектором . Название
.
Назначение гнезд
Поскольку приоритет CSS может быть сложным, при написании селекторов обычно используется , специфичный , путем объединения нескольких классов / тегов, чтобы правила CSS не отменяли друг друга.
.description {}
.description p {}
.description p a {}
.description p a: hover {}
.description p strong {}
.description table {}
.description table tr {}
.description таблица tr: nth-child (2n) {}
таблица описания th,
.description table td {}
.description table td.empty,
.description table th.empty {}
.description table th {}
Чтобы предотвратить перезапись .description
, давайте воспользуемся амперсандом и
:
.description {
п{}
п а {}
p a: hover {}
p сильный {}
Таблица{}
таблица tr {}
таблица tr: nth-child (2n) {}
таблица th,
таблица td {}
таблица th {}
стол тд.пустой,
таблица th.empty {}
}
Вы можете пойти еще дальше, заменив & p
и & table
на и
, чтобы создать вложенных селекторов :
.description {
п{
a {
&: hover {}
}
сильный{}
}
Таблица{
tr {
&: nth-child (2n) {}
}
th,
td {
&.пустой{}
}
th {}
}
}
Помните HTML-вложение ? Отступ в Sass позволяет воспроизвести вложенных HTML-элементов.
Обратите внимание, как мы записали table
и . empty
только один раз, например, .
Он сгенерирует именно тот CSS, с которого мы начали:
.description {}
.description p {}
.description p a {}
.description p a: hover {}
.description p strong {}
.description table {}
.description table tr {}
.description таблица tr: nth-child (2n) {}
таблица описания th,
.description table td {}
.description table td.empty,
.description table th.empty {}
.description table th {}
Родительский селектор амперсанда
Когда вы вкладываете селекторы в Sass, он в основном добавляет пространство между родительским селектором и дочерним селектором .Итак:
// scss
.parent {
.ребенок{}
}
// становится в css
.parent .child {}
Пространство между .parent
и .child
определяет иерархию . : этот селектор нацелен на элементы HTML с class = "child"
, вложенным в class = " родитель "
.
А что, если вы хотите использовать псевдоселекторы , например : hover
? Или вы хотите иметь селектор с объединенными классами ? Вы можете использовать амперсанд , который является ярлыком для родительского селектора:
// scss
.parent {
&: hover {}
& .other-class {}
}
// становится в css
.parent: hover {}
.parent.other-class {}
Обратите внимание на то, что нет пробела между .parent
и : hover
или .other-class
.
.parent.other-class
будет нацеливаться на элементы HTML, которые имеют class = "parent other-class"
.
Полный пример
.post-content {}
.post-content a {}
.post-content a: hover {}
.пост-контент в сторону {}
. post-content blockquote {}
.post-content код {}
.post-content h4 {}
.post-content h4 a {}
.post-content h5 {}
.post-content h5: до {}
.post-content h5: после {}
.post-content p {}
.post-content p: first-child {}
.post-content p: last-child {}
.post-content ul {}
.post-content ul ul {}
.post-content ul ul ul {}
.post-content dl {}
.post-content dl: before {}
.post-content dl dt {}
.post-content dl dd {}
.post-content pre {}
Предварительный код .post-content {}
.post-content table {}
.post-content table tr {}
.таблица пост-контента tr: nth-child (2n) {}
.post-content table th,
.post-content таблица td {}
.post-content table th {}
.post-content таблица td.empty,
.post-content таблица th.empty {}
.post-content код таблицы {}
.post-content table pre {}
.post-content table pre: before {}
.post-content {
a {
&: hover {}
}
в стороне{}
цитата {}
код{}
h4 {
а {}
}
h5 {
&:перед{}
&:после{}
}
п{
&:Первый ребенок{}
&:последний ребенок{}
}
ul {
ul {
ul {}
}
}
dl {
&:перед{}
dt {}
дд {}
}
pre {
код{}
}
Таблица{
tr {
&: nth-child (2n) {}
}
th,
td {
&.пустой{}
}
th {}
код{}
pre {
&:перед{}
}
}
}
Вы можете вставить один тип списка в другой. Это особенно полезно для схемы, отображаемой с помощью упорядоченных списков, где вам может понадобиться несколько уровней элементов. Хотя вы можете стилизовать вложенные списки с помощью классов или идентификаторов, есть более простой способ. Для стилизации вложенных списков:
Рисунок 15.22. Здесь есть четыре вложенных списка: один в элементе списка Введение, один в элементе «Развитие», один в элементе «Кульминация» и один, выделенный и выделенный жирным шрифтом, внутри элемента ультиматума «Мальчик дает девушке» (который находится внутри элемента «Кульминация»).Советы
|