SASS/SCSS: переменные, миксины, функции, @use и @forward
↑ 1.3 CSS и SASS · ← Предыдущая · → Следующая
Зачем это на собесе
SCSS — стандарт препроцессора; ждут знания модульной системы
@useвместо@import.
Объяснение
// _tokens.scss
$breakpoints: (sm: 640px, md: 768px, lg: 1024px);
$radius: 8px;
// _mixins.scss
@use "sass:map";
@use "tokens" as t;
@mixin respond($bp) { @media (min-width: map.get(t.$breakpoints, $bp)) { @content; } }
@mixin truncate { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
@function rem($px, $base: 16) { @return math.div($px, $base) * 1rem; }
// component.scss
@use "mixins" as m;
.card {
border-radius: t.$radius;
&__title { @include m.truncate; font-size: m.rem(18); }
&--featured { border: 2px solid var(--accent); }
@include m.respond(md) { display: grid; }
&:hover { box-shadow: 0 2px 8px rgb(0 0 0 / .15); }
}
@each $name, $color in (success: green, danger: red) { .text-#{$name} { color: $color; } }
%placeholder { color: gray; } // @extend
.a { @extend %placeholder; }| Возможность | Пример |
|---|---|
| Переменные | $color: #333 |
| Вложенность | &:hover, &__el |
| Миксины | @mixin/@include |
| Функции | @function, встроенные map.get, math.div, color.adjust |
| Управляющие директивы | @if, @each, @for, @while |
| Модули | @use, @forward |
| Наследование | @extend с %placeholder |
Модули: @use "file" as alias подключает с пространством имён и один раз (без побочного дублирования CSS); @forward — реэкспорт модуля (файл-«барабан» index.scss). @import устарел (глобальные имена, повторная загрузка). Деление: math.div вместо /.
Нюансы и подводные камни
- Глубокая вложенность увеличивает специфичность и размер CSS.
@extendв сложном контексте генерирует неожиданные селекторы.- Переменные SASS не реагируют на смену темы в рантайме — для тем используйте CSS-переменные.
- Не превращайте препроцессор в слой «магии»: логика — в миксинах с понятными именами.
- Quasar: переменные темы задаются в
quasar.variables.scss.
Практика
- Создайте миксин
respondи функциюrem. - Организуйте стили на
@use/@forwardсindex.scss. - Сгенерируйте утилитарные классы цветов через
@each.
Вопросы с ответами
Чем @use отличается от @import?
@useсоздаёт пространство имён и подключает модуль один раз,@import— глобальный и устарел.
Для чего
@forward?Для реэкспорта содержимого модуля из другого файла.