В данной заметке опишу самые часто используемые возможности SCSS.
Примеры работы с SCSS
Подключение других файлов
@import "reset.scss";
- вставляет содержимое файла reset.scss в указанное место скомпилированного css.
Переменные:
$main_color : #ff00ff; .block { background-color: $main_color; }
Переменные можно вынести в отдельный конфигурационный файл и подключить его через @import "config.scss";.
Комментарии
Кроме стандартных
/* Текст комментария */
Есть возможность добавить комментарии которые не пойдут в скомпилированный css файл:
// Служебный комментарий
Вложенность
Базовое использование:
.block { margin-bottom: 20px; .link { color : green; } }
Также поддерживаются стандартные операторы, такие как >, +...
.block { .link { color : green; } >.link { color : aqua; } }
Если внутри правила нужно обратиться к самому элементу, например, для hover, нужно использовать &:
.block { &:hover { background-color: magenta; } }
Другой случай, когда можно использовать &, это наличие дополнительного класса, скажем .block.active:
.block { &:hover { background-color: magenta; } &.active { background-color: chocolate; } }
Еще можно воспользоваться такой записью div &, для обозначения вложенности:
.link { div & { border: 1px solid red; } }
- эта запись эквивалентна:
div { .link { border: 1px solid red; } }
в результате компиляции обоих вариантов поручим:
div .link { border: 1px solid red; }
Такой способ записи служит именно для упрощения компоновки кода.
Шаблоны
Синтаксис:
%tplPromoBlock { background-color: #C0C0C0; width: 200px; height: 150px; margin: 0 auto; padding: 100px; }
Дальше его можно добавить нужному блоку @extend %tplPromoBlock;:
.block { margin-bottom: 20px; &:hover { background-color: magenta; } @extend %tplPromoBlock; }
Стоит обратить внимание на:
Шаблоны нужно размещать вначале кода, иначе их значение нельзя будет переопределить свойствами блока.
Вместо шаблона %tplPromoBlock; можно использовать обычный класс .PromoBlock;, разница в том, что шаблон не добавляется в скомпилированный css как отдельный блок.
Миксины (mixin)
Миксины очень похожи на функции, т.к. в них можно предавать переменные и на выходе будет результат их выполнения.
Объявление:
@mixin soBGColor($color) { background-color: $color; }
Вызов происходит через @include:
%tplPromoBlock { @include soBGColor(#C0C0C0); }
Математические выражения
Также есть возможность использовать математические операции, например посчитать ширину блока:
%tplPromoBlock { @include soBGColor(#C0C0C0); width: 300px / 1200px * 100%; }
учитывая, что вычисления могут быть внутри миксинов и зависеть от переданных параметров, то возможностей открывается масса.
Циклы:
Также есть возможность использовать циклы:
@for $i from 1 through 3 { .item-#{$i} { width: 2em + $i; } }
Общий код:
index.html (Download)
<!doctype html> <html lang="ru"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <link rel="stylesheet" href="styles/main.css"> </head> <body> <div class="block_1"> <p> <a class="link" href="#">Link 1</a> </p> <p> <a class="link" href="#">Link 2</a> </p> <a class="link" href="#">Link -!-</a> </div> <div class="block_2"> <p> <a class="link" href="#">Link 3</a> </p> <p> <a class="link" href="#">Link 4</a> </p> </div> </body> </html>
main.scss (Download)
// Подключение "reset" @import "reset.scss"; // Настройки по умолчанию: @import "config.scss"; @mixin soBGColor($color) { background-color: $color; } /* Main */ body { color: $main_color; } %tplPromoBlock { @include soBGColor(#C0C0C0); width: 300px / 1200px * 100%; height: 150px; margin: 0 auto; padding: 100px; } .block_1 { margin-bottom: 20px; .link { color : green; } >.link { color : aqua; } &:hover { @include soBGColor(magenta); } &.active { @include soBGColor(chocolate); } @extend %tplPromoBlock; } .block_2 { .link { color : blue; } @extend %tplPromoBlock; } //.link { // div & { // border: 1px solid red; // } //} @for $i from 1 through 3 { .item-#{$i} { width: 2em + $i; } }
config.scss (Download)
$main_color : #ff00ff;