Перейти до основного вмісту

Вкладені правила

Подібно до вкладеності тегів в HTML, в SASS можна вкладати CSS-селектори. це одна з найбільш корисних можливостей, яка також часто неправильно використовується. Вкладеність дозволяє робити одні оголошення правил всередині інших. Нижче наведений CSS і SCSS код оформлення секції із заголовком і абзацом.

main.css
.section {
width: 100%;
}

.section .title {
color: red;
}

.section .text {
font-size: 14px;
}

Синтаксис SCSS виглядає чистішим і менше повторюється. Після компіляції у стандартний CSS, ми отримаємо код як в main.css. Але в процесі розробки писати код буде зручніше.

Конкатенація селекторів

Символ & (амперсанд) дозволяє вказати, в яке місце необхідно підставити батьківський селектор. Запишемо імена класів з попереднього прикладу, використовуючи BEM-нотацію в CSS і SCSS.

main.css
.section {
width: 100%;
}

.section__title {
color: red;
}

.section__text {
font-size: 14px;
}

Розглянемо ще один приклад - оформлення посилання зі станами ховеру і фокусу.

main.css
.link {
color: black;
}

.link:hover {
color: red;
}

.link:focus {
color: red;
}

Що робити, якщо селектори для :hover і :focus в CSS згруповані? Без проблем групуємо в SASS, не забуваючи поставити амперсанд (&) там, де необхідно підставити батьківський селектор.

main.css
.link {
color: black;
}

.link:hover,
.link:focus {
color: red;
}

Правила вкладеності

Вкладеність селекторів - це чудовий спосіб заощадити час і спростити підтримку, але надмірна вкладеність гарантовано викличе проблеми з читабельністю коду.

Уявімо наступну розмітку кнопки з іконкою і текстом.

<button class="button" type="button">
<svg class="icon"></svg>
<span class="label">Замовити</span>
</button>

Запишемо якісь стилі в CSS і SCSS, і зробимо їх спеціально трохи складнішими, ніж потрібно.

main.css
.button {
color: red;
}

.button:hover {
color: blue;
}

.button__icon {
width: 20px;
height: 20px;
}

.button__icon:hover {
width: 50px;
height: 50px;
}

.button__label {
font-size: 16px;
}

.button:hover .button__icon {
background-color: teal;
}

.button:hover .button__label {
font-size: 20px;
}

Прочитати такий SCSS-код швидко досить складно, візуально втрачається зв'язок з батьківським селектором і, замість того щоб розбирати CSS-код, доводиться вчитуватися у синтаксис вкладеностей. Тобто, використовуючи можливості препроцесора, ми зробили гірше, більше - не завжди краще.

Створюйте нове правило для кожного блоку або елемента, а вкладеності і конкатенації використовуйте для оформлення станів і BEM-модифікаторів. Тобто користуйтеся здоровим глуздом, і робіть так як зручно, тому що SCSS-код пишеться для зручності розробника.

main.scss
// Правило для всієї кнопки
.button {
color: red;

&:hover {
color: blue;
}
}

// Правило для іконки
.button__icon {
width: 20px;
height: 20px;

&:hover {
width: 50px;
height: 50px;
}

.button:hover & {
background-color: teal;
}
}

// Правило для тексту
.button__label {
font-size: 16px;

.button:hover & {
font-size: 20px;
}
}