web-разработка

Препроцессор Sass

Sass — это метаязык на основе CSS, предназначенный для увеличения уровня абстракции CSS-кода и упрощения файлов каскадных таблиц стилей. Язык Sass имеет два синтаксиса:
  1. sass — отличается отсутствием фигурных скобок, в нём вложенные элементы реализованы с помощью отступов;
  2. SCSS (Sassy CSS) — использует фигурные скобки, как и сам CSS.
Sass — это один из наиболее развитых и стабильных CSS препроцессоров, а также один из самых популярных препроцессоров у профессионалов.

Преимущества Sass

1. Совместимость с различными версиями CSS, благодаря которой можно использовать любые CSS библиотеки в проекте;
2. Огромное количество разнообразных функций на любой случай жизни. Таким богатым функционалом могут похвастаться немногие CSS препроцессоры;
3. Sass — это один из самых старых CSS препроцессоров, вобравший большой опыт за долгие годы своего существования;
4. Замечательная возможность использовать Sass фреймворки, упрощающие жизнь разработчику. Один из таких фреймворков — Bourbon;
5. Синтаксис. Можно выбрать один из двух синтаксисов — упрощенный (SASS) и развернутый CSS-подобный (SCSS).

Синтаксис Sass

# SASS - синтаксис отступов

$font-stack:    Helvetica, sans-serif
$primary-color: #333
 
body
  font: 100% $font-stack
  color: $primary-color
# SCSS - синтаксис расширения

$font-stack:    Helvetica, sans-serif;
$primary-color: #333;
 
body {
  font: 100% $font-stack;
  color: $primary-color; 
}

Вложенные правила

Одна из ключевых особенностей Sass — вложенные правила, которые облегчают процесс создания и редактирования вложенных селекторов. Пример:
#header
  background: #FFFFFF

  .error
    color: #FF0000
  
  a
    text-decoration: none
    &:hover
      text-decoration: underline
Будет транслировано в:
#header {
   background: #FFFFFF; 
}
#header .error {
   color: #FF0000; 
}
#header a {
   text-decoration: none; 
}
#header a:hover {
   text-decoration: underline; 
}

Переменные

Sass позволяет работать с переменными. В CSS они обозначаются двойным тире (—), а в препроцессорах знаком доллара ($).
$number: 1;
$color: #ff0000;
$text: "tproger forever.";
$text: "IT forever." !default;
$nothing: null;

Амперсанд

В SCSS используется директива &. Пример:
#p {
  color: black;
  a {
    font-weight: bold;
    &:hover {
      color: red;
    }
  }
}
С помощью символа & можно явно указать, где должен быть вставлен родительский селектор. Результат компиляции Sass (из предыдущего примера) в CSS ниже:
#p {color: black;}
#p a {font-weight: bold;}
#p a:hover {color: red;}

Миксины

Миксины объявляются директивой @mixin. После неё должно стоять имя миксина и, опционально, его параметры, а также блок, содержащий тело миксина.
Например, можно определить миксин flexible(), который далее будет включён, например, в класс .centered-elements следующим образом:
@mixin flexible () {
    display: flex;
    justify-content: center;
    align-items: center;
  }
  
.centered-elements {
    @include flexible ();
    border: 1px solid gray;
  }
Теперь каждый раз после применения класса .centered-elements к HTML-элементу, последний будет преобразован во Flexbox.
Миксины могут также содержать селекторы, в том числе со свойствами. А селекторы могут содержать ссылки на родительский элемент через амперсанд (&).

Арифметические операции

Как и в стандартном CSS, доступны операции сложения, вычитания, умножения и деления, но в отличии от классического CSS синтаксиса, необязательно использовать функцию calc().

Операторы сравнения

x==y возвращает true, если x и y равны
x!=y возвращает true, если x и y не равны
x>y возвращает true, если x больше, чем y
x=y возвращает true, если x больше или равно y
x<=y возвращает true, если x меньше или равно y
Создадим миксин, который будет применять свойство padding, если его значение больше значения margin:
@mixin spacing($padding, $margin) {
    @if ($padding > $margin) {
        padding: $padding;
    } @else {
        padding: $margin;
    }
}

.container {
    @include spacing(10px, 20px);
}

Строки

В CSS определено 2 типа строк: с кавычками и без. Sass распознаёт и то, и другое. В итоге можно получить в CSS тот тип строк, который использовали в Sass.
В некоторых случаях можно добавить строки в допустимые значения CSS без кавычек, но только если добавленная строка является завершающим элементом.
p {
    font: 50px Ari + "al"; // Компилируется в 50px Arial
}
Пример ниже демонстрирует, как делать не надо:
p {
    font: "50px" + Arial; // ОШИБКА!
}
Можете складывать строки разных типов, если в них нет пробелов. Пример ниже не будет скомпилирован. Пример:
p:after {
    content: "Верните Линуса " + Торвальдса!; // ОШИБКА!
}

Операторы управления потоками

В SCSS есть функции (fucntion()) и директивы (@directive). Функции обычно заключаются в скобки, следующие сразу за её именем. А директива начинается с символа @.
Подобно JavaScript, SCSS позволяет работать со стандартным набором операторов управления потоками.

if()

if() — это функция (и иногда основа искусственного интеллекта). Её использование выглядит довольно примитивным: оператор вернёт одно из двух обозначенных в условии значений. Пример:
/* Использование функции if() */
if (true, 1px, 2px) => 1px;
if (false, 1px, 2px) => 2px;

@if

@if — это директива, использующаяся для разветвления на основе условия. Пример:
/* Использование директивы @if */
p {
    @if 1 + 1 == 2 { border: 1px solid;  }
    @if 7 < 5      { border: 2px dotted; }
    @if null       { border: 3px double;  }
}

Директива @for

Директива @for выводит набор стилей заданное число раз. Для каждого повторения используется переменная-счётчик для изменения вывода. Директива @for итерируется 5 раз:
@for $i from 1 through 5 {
    .definition-#{$i} { width: 10px * $i; }
}
Результат компиляции в CSS:
.definition-1 { width: 10px; }
.definition-2 { width: 20px; }
.definition-3 { width: 30px; }
.definition-4 { width: 40px; }
.definition-5 { width: 50px; }

Директива @each

Директива @each устанавливает $var в каждое из значений списка или словаря и выводит содержащиеся в ней стили, используя соответствующее значение $var. Пример:
@each $animal in img1, img2, img3, img4 {
    .#{$animal}-icon {
        background-image: url("/images/#{$animal}.png")
    }
}
Результат компиляции в CSS:
.platypus-icon { 
    background-image: url("/images/img1.png"); 
}
.lion-icon { 
    background-image: url("/images/img2.png"); 
}
.sheep-icon { 
    background-image: url("/images/img3.png"); 
}
.dove-icon { 
    background-image: url("/images/img4.png"); 
}

Директива @while

Директива @while принимает выражение SassScript и циклично выводит вложенные в неё стили, пока выражение вычисляется как true.
Она может быть использована для создания более сложных циклов, чем таких, для которых подходит @for, хотя она бывает необходима довольно редко. Например:
$index: 5;
@while $index > 0 {
    .element-#{$index} { width: 10px * $index; }
    $index: $index - 1;
}
Результат компиляции:
.element-5 { width: 50px; } 
.element-4 { width: 40px; } 
.element-3 { width: 30px; } 
.element-2 { width: 20px; } 
.element-1 { width: 10px; } 

Функции в Sass/SCSS

Используя Sass/SCSS можно использовать функции так же, как и в других языках. Создадим функцию three-hundred-px(), возвращающую 400px.
@function three-hundred-px() {
    @return 400px;
}

.name {
    width: three-hundred-px();
    border: 1px solid gray;
    display: block;
    position: absolute;
}
После применения класса .name ширина элемента будет равна 400 пикселям.
Самоучитель по CSS