code
Хотя существуют другие препроцессоры CSS, Sass уже давно является самым популярным вариантом в веб-сообществе. Он многофункциональный, стабильный и мощный. Более того, большое сообщество пользователей означает, что поддержка и советы со стороны сообщества помогут решить любую проблему. В этой статье мы предлагаем 10 лучших советов для большей эффективности от использования Sass.
Возможность отражать вложенность иерархии стиля HTML в CSS, возможно, является самым большим преимуществом, которое Sass как препроцессорв в сравнении с регулярным CSS. Это избавляет вас от постоянных повторений кода, упрощает поддержку проекта в будущем и код гораздо удобнее читается, поскольку вы можете точно видеть, какое правило относится к какому селектору:
// Обычный CSS
.foo { .. }
.foo ul { .. }
.foo ul li { .. }
// Sass
.foo {
..
ul {
..
li { ..}
}
}
При вложенности вы можете использовать символ &
для ссылки на родительский элемент. Это здорово помогает при написании стилей CSS. Во-первых, вы можете аккуратно вставлять псевдо-состояния или элементы:
.foo {
background-color: red;
&:hover { background-color: blue; }
&:after { content: 'bar'; }
}
... ну, и во-вторых, избавииться от надоедливого переписывания селекторов и классов:
.foo {
background-color: red;
&.bar { background-color: green; }
.ie &.bar { background-color: yellow; }
}
// =>
.foo { background-color: red;}
.foo.bar { background-color: green; }
.ie .foo.bar { background-color: yellow; }
Все переменныев Sass начинаются с символа $
за которым следует наименование переменной без пробела:
$breakpoint-sm: 576px;
Такой подход делает работу с глобальными значениями такими как цвета, шрифты и Which makes handling global values such as colours, fonts and контрольные точки (breakpoint) невероятно легко.
В Sass, переменные также могут быть записаны как объект. Например объект с записанными в него переменными для breakpoint'а:
$grid-breakpoints: (
sm: 576px,
md: 768px,
lg: 992px
);
Для получения (извлечения) переменных, записанных в объект можно импользовать функцию Sass map-get
которая возвращает переменные по ключу, передаваемого в функцию в качестве аргумента. В примере ниже будем использовать эту функцию для определения значения max-width
для медиа запроса:
@function breakpoint-var($breakpoint) {
@return map-get($grid-breakpoints, $breakpoint);
}
@media (max-width: breakpoint-var(lg)) {
}
// => @media (max-width: 992px) {
//
// }
И, хотя, сейчас CSS имеет функцию var()
, которая позволяет создавать простые переменные с префиксом --
, но препроцессор Sass намного эффективнее.
Миксины предоставляют мощь переиспользования кода в CSS. С миксинами вместо того, чтобы в таблице стилей переписывать один ии тот же код несколько раз вы можете просто включить миксину в стиль элемента:
@mixin foo() {
border: 1px solid red;
}
.bar {
@include foo();
}
// =>
// .bar { border: 1px solid red; }
Вы можете также настроить параметры для миксин так что можно будет использовать одни и те же стили, но с необходимыми изменениями аргументов, передаваемых в миксины. Вы также можете настроить значения параметров по умолчанию для таких аргументов:
@mixin foo($width: 1px, $color: red) {
border: 1px solid red;
}
.bar {
@include foo();
}
.bax {
@include foo(5px, blue);
}
// =>
// .bar { border: 1px solid red; }
// .baz { border: 5px solid blue; }
Функции и миксины часто могут быть взаимозаменяемыми и достигать одного и того же результата, но смысл их применения несколько отличаются. Как и во многих вопросах программирования, главным здесь является логика использования: миксины используются преимущественно для включений, а функции - больше для получения возвращаемых значений. Например, функция breakpoint-var()
, которую мы использовали ранее, возвращает значение, чего не делают миксины.
Это, если так можно выразится, бриллиант, для сокращения дублирования кода в CSS, и позволяя классам совместно использовать один набор свойств.
.foo {
color: black;
border: 1px solid black;
}
.bar {
@extend .foo;
background-color: red;
}
// =>
.foo, .bar {
color: black;
border: 1px solid black;
}
.bar { background-color: red; }
Вы можете даже передать через расширение стили нескольких селекторов:
@extend .foo, .bar;
Кроме того, использование расширений отчасти помогает оптимизировать использование классов в HTML-коде:
// Без @extend
.foo {
background-color: red;
border: 1px solid blue;
color: black;
}
.bar { background-color: green; }
<div class="foo bar">...</div>
// С @extend
.foo {
background-color: red;
border: 1px solid blue;
color: black;
}
.bar {
@extend .foo;
background-color: green;
}
<div class="bar">...</div>
Единственный недостаток - это резкое увеличение размера таблицы стилей.
Нет ничего более неприятного или вызывающего головную боль, чем слишком большая таблица стилей, особенно если вы работаете только с одной ее частью. К счастью, Sass позволяет вам разделить файл таблицы стилей на несколько файлов, а затем использовать @import
, чтобы импортировать стили тогда, когда они понадобятся.
Например, если вы хотите импортировать отдельные стили для кнопок, мы можемназвать файл _buttons.scss
и затем просто добавить @import buttons
в основной файл с таблицами стилей Sass. Точно также, как и с директивой @extend
вы можете импортировать множество файлов, заделеяя их названия запятой:
@import 'buttons', 'forms';
Вы можете импортировать внутрь селектора:
.foo {
@import 'bar';
}
И можно сделать даже так:
@import 'utils/mixins';
.foo {
@import 'components/buttons';
}
Это предоставляет вам полную свободу при построении архитектуры стилей вашего проекта.
Вы можете выполнять циклы в Sass, используя три основных правила:
@for - цикл для заданного количества итераций с доступом
к индексу на каждой итерации цикла
@while - повторение цикла до тех пор, пока
верно условие
@each - проверка каждого элемента в списке
Если у вас есть опыт работы с JavaScript (или большинством языков программирования), вы должны быть ознакомлены с принципами работы циклов. Например, вся система Flex-grid от Bootstrap встроена в Sass, используя циклы. Более простой пример показывает как с помощью цикла можно быстро создать ступенчатую анимацию затухания для элементов, использующих тэг nth-child
:
.foo {
@for $i from 1 through 5 {
&:nth-child( #{i} ) {
opacity: 1;
transition: opacity .5s;
transition-delay: #{($i * .05) + .05}s;
}
}
}
Цикл @each
отлично работает с мощной функцией, называемой интерполяцией - способ использования содержимого значений, которые вы зацикливаете (синтаксис # {VALUE}
). Итак, если мы хотим настроить стиль для заголовка, используя переменную объекта с ключами и значениями, мы могли бы сделать следующее:
$fonts: (
h1: 24px,
h2: 20px,
h3: 16px
);
@each $element, $size in $fonts {
#{$element} {
font-size: $size;
line-height: ($size * 1.5);
}
}