Препроцессоры SCSS и Sass
Sass и SCSS это препроцессоры метаязыка, который компилируется в CSS. Как и HAML, данные препроцессоры значительно облегчают написание кода CSS, структурируют его, обеспечивают удобные механизмы работы.
Sass (Syntactically Awesome Stylesheets) и SCSS похожи по синтаксису, но Sass обеспечивает более строгий стиль написания, a scss – более простой, с возможностью писать в коде стандартный CSS код.
Установка
Для установки препроцессора воспользуемся Ruby. Запустите командную строку с Ruby (start command promt with ruby). Наберите команду
gem install sass
и дождитесь окончания установки. Если установка прошла удачно – продолжим работу.
Для создания CSS файла на основе Sass файла давайте создадим в рабочей папке файл style.sass (это обычный текстовый файл, созданный с помощью блокнота) и запишем в него тестовый код:
1 2 |
.new color: red |
В запущенной консоли, перейдите в рабочую папку, где расположен файл style.sass и выполните код:
sass styles.sas style.css
При отсутствии ошибок, препроцессор Sass создаст скомпилированный файл style.css который содержит следующий код:
1 2 |
.new { color: red; } |
Постоянно компилировать код, при каждом внесении изменений – очень неудобно. Для того, чтобы sass сам следил за изменениями в файле наберите команду:
sass ‑‑ watch style.sass:style.css
Компилятор перейдет в режим наблюдения за файлов style.sass и при каждых сохраненных изменениях в нем, перекомпилирует style.css
. Для выхода из режим наблюдения необходимо нажать Ctrl
+ C
.
При каждой компиляции в консоль будет выводится информация о изменениях и ошибках компиляции. Следите за выводом команды и исправляйте ошибки. Если компиляция прошла успешно, то консоль выведет:
>>> Change detected to: style.sass
write style.css
write style.css.map
Синтаксис Sass
Как и для HAML, {}
и без использования точек с запятой в конце строки свойств. Для обозначения вложения необходимо делать отступ. Вид отступа: пробел, два пробела, tab не влияют на результат, единственное требование – применять одинаковый пробел на всем документе.
Рассмотрим пример кода Sass:
1 2 3 4 5 6 |
.one font-size: 14px font-weight: bold span color: red |
Результат компиляции:
1 2 3 4 5 |
.one { font-size: 14px; font-weight: bold; } .one span { color: red; } |
Наследование
Как видно из примера выше, отступами можно задать вложенность селекторов без повторения самих селекторов при написании.
Еще пример:
1 2 3 4 5 6 |
.portfolio border: 1px solid #9799a7 ul list-style: none li float: left |
Результат:
1 2 3 4 5 6 |
.portfolio { border: 1px solid #9799a7; } .portfolio ul { list-style: none; } .portfolio li { float: left; } |
Вложенные свойства
Когда мы работаем с CSS есть много свойств, которые применяются комплексно. Например, чаще всего вместе применяют, font-family
, font-size
, font-weight
и так далее.
Для написания комплексных свойств есть хорошее сокращение:
1 2 3 4 5 |
div font: family: Baskerville, Palatino, serif style: italic weight: normal |
Результат работы препроцессора Sass:
1 2 3 4 |
div { font-family: Baskerville, Palatino, serif; font-style: italic; font-weight: normal; } |
Медиазапросы
При подходе в проектировании сайта от desktop к mobile в самом конце файла CSS дописываются медиазапросы, а верстальщик судорожно вспоминает какие свойства нужно менять. Sass позволяет использовать другой подход, добавляя медиазапросы сразу после описания элемента.
1 2 3 4 5 6 7 8 |
.container width: 960px @media screen and (max-width: 960px) width: 100% .wrap width: 80% @media screen and (max-width: 960px) width: 70% |
Результат компиляции
1 2 3 4 5 6 7 8 9 10 11 |
.container { width: 960px; } @media screen and (max-width: 960px) { .container { width: 100%; } } .wrap { width: 80%; } @media screen and (max-width: 960px) { .wrap { width: 70%; } } |
Согласитесь, не самый удобный код. Для решения этой проблемы существуют средства автоматизации. Например Sass::MediaQueryCombiner, который комбинирует медиазапросы и дописывает их в конце файла.
Родительский селектор
Для псевдоклассов очень удобным является ссылка на родителя:
1 2 3 4 |
a color: #0087cc &:hover color: #ff7b29 |
Результат в CSS
1 2 3 4 |
a { color: #0087cc; } a:hover { color: #ff7b29; } |
Комментарии
Обычный комментарий, который останется после компиляции аналогичен комментарию в CSS: /**/
.
Однако есть возможность добавлять комментарии только к sass файлу, для этого используется два слеша: //
1 2 3 4 5 6 |
/* Normal comment */ div background: #333 // Omitted comment strong display: block |
Результат:
1 2 3 4 5 6 |
/* Normal comment */ div { background: #333; } strong { display: block; } |
Переменные
Вот мы и добрались до одного из самых удобных нововведений: переменные в Sass. Имя переменной описывается значком $
и самим идентификатором. После чего присваиваем значение. Затем в коде вместо свойств используем переменную.
При компиляции переменные не выводятся, появляется лишь их результат.
1 2 3 4 5 6 |
$font1 : 24px $ff : 'Arial' p font-family: $ff font-size: $font1 |
Результат:
1 2 3 |
p { font-family: "Arial"; font-size: 24px; } |
Интерполяция переменных
В некоторых случаях нужно значение переменных использовать как имя класса, id, либо свойства. Для этого используют фигурные скобки #{имя_переменной}.
1 2 3 4 5 6 |
$font1 : font-family $ff : p .#{$ff} #{$font1}: Arial font-size: 64px |
Результат:
1 2 3 |
.p { font-family: Arial; font-size: 64px; } |
Вычисления
При необходимости Sass может выполнять арифметические действия: сложение, вычитание, умножение и деление и округление.
Сложение использует знак плюс + и может быть завершено как с единицами измерения, так и без. За базовую единицу измерения принимается величина стоящая после первого слагаемого. Так 40px + 5 будет равно 45 px.
Аналогично сложению ведет себя и вычитание.
Умножение и остаток от деления может быть произведено, если только один из операторов (первый) имеет единицы измерения.
1 2 3 4 |
width: 40px + 6 width: 40px - 6 width: 40px * 6 width: 40px % 6 |
Результат:
1 2 3 4 |
width: 46px; width: 34px; width: 240px; width: 4px; |
Деление
Деление обладает рядом особенностей, которые продемонстрированы в примере ниже.
1 2 3 4 5 6 7 |
p width: 100px / 10 width: (100px / 10) width: (100px / 10px) $width: 100px width: $width / 10 width: 5px - 100px / 10 |
Результат:
1 2 3 4 5 6 |
p { width: 100px/10; width: 10px; width: 10; width: 10px; width: -5px; } |
Обратите внимание, что при делении двух операторов с единицами измерения, результат будет безразмерный.
Препроцессоры и системы контроля версий являются незаменимыми инструментами в групповой разработке.