Статьи

Основы Sass: @ -rules и директивы

@ -Rule и директивы в Sass — это магистральные функции, о которых вы должны хотя бы знать, особенно когда это касается правила @import. Некоторые из этих @ -rules являются расширениями CSS @ -rules, в то время как другие являются специфическими директивами Sass. В любом случае лучше знать, для чего эти правила и как они работают, если вы собираетесь работать с Sass.

@импорт

Sass расширяет правило CSS @import, чтобы он мог импортировать файлы SCSS / Sass. Обычно мы используем это правило для импорта нашего Sass в один мастер-файл. Мы включаем этот мастер-файл в качестве основного CSS-файла в проект, чтобы использовать все сводные правила. Импорт файла дает доступ к любым миксинам или переменным, включенным в файлы.

Sass по умолчанию ищет другие файлы Sass в текущем каталоге, а затем в каталоге файлов Sass в Rails. Вы также можете указать дополнительные каталоги, используя опцию пути загрузки. Если вы используете Compass, вы можете указать каталог, изменив значение sass_dir в config.rb.

@import ищет файл Sass для импорта, но скомпилирует с правилом CSS @import при следующих условиях:

  • Расширение файла .css
  • Имя файла начинается с htp: //
  • Имя файла является URL ()
  • У @import есть медиа-запросы

Если расширение файла — .scss или .sass файл будет импортирован. Если расширение отсутствует, Sass попытается найти файл, который соответствует имени и правильному расширению. Например:

 @import "sample.scss"; @import "sample"; 

Оба эти оператора @import действительны и будут импортировать файл sample.scss. Второй импорт также импортирует sample.sass, если он существует.

Мы также можем импортировать несколько файлов в одном операторе @import, включив файлы в список через запятую.

 @import "sample1", "sample2", "sample3"; 

При импорте файлов необходимо соблюдать осторожность, поскольку они должны быть импортированы в правильном порядке. Например, допустим, у нас есть файл myVariables который включает переменные в нашем проекте. Если у нас есть другой файл с именем myStyles который использует эти переменные, файл myVariables должен быть импортирован первым.

 @import "myStyles"; @import "myVariables"; 

Если мы импортируем в этом порядке, мы получим ошибку, так как myStyles попытается использовать переменные, которые еще не были определены.

 @import "myVariables"; @import "myStyles"; 

Это правильный способ импорта, поскольку переменные, myStyles файле myStyles , уже импортированы.

Частичные @import

При импорте файла SCSS / Sass он будет компилироваться в файл с тем же именем CSS. Обычно мы хотим импортировать отдельные файлы SCSS / Sass в один основной файл CSS против нескольких файлов CSS. Для этого нам нужно импортировать файлы как частичные. Мы превращаем файл SCSS / SASS в частичное, добавляя подчеркивание перед именем. Подчеркивание говорит Sass не компилировать файл как отдельный CSS-файл, а объединить его с текущим файлом, который содержит оператор @import.

Когда мы импортируем эти части, нам не нужно включать подчеркивание. myVariables мы изменили myVariables на _myVariables . Мы импортировали бы файл таким же образом.

 @import "myVariables"; 

Разница в том, что файл myVariables.css не будет создан, файл будет объединен с основным файлом CSS. Важно отметить, что нельзя включать в каталог частичное и не частичное имя с одинаковыми именами. Мы не можем иметь _myVariables.scss и myVariables.scss в одном месте.

Вложенный @import

Большую часть времени у нас будет @import на верхнем уровне нашего документа, мы можем включить их в наши правила. Импортированные правила будут вложены туда, где они были импортированы. Например, допустим, у нас есть test имени файла со следующим правилом

 .try { color: blue; } 

Мы можем вложить этот импорт в наш основной файл.

 #why { @import "test"; } 

Это скомпилируется в:

 #why .try { color: blue; } 

Такие директивы, как @mixin, которые разрешены только на базовом уровне документа, не могут быть в файлах с вложенным импортом. Точно так же вы не можете вкладывать @import в mixins или управляющие директивы.

@СМИ

@media ведет себя так же, как правила CSS @media, за исключением того, что они могут быть вложены в правила CSS. Когда директивы @media вложены в правила CSS, они всплывают на верхний уровень таблицы стилей.

 .container { width: 60%; @media (min-width: 200px) and (max-width:600px) { width: 100%; } } 

Будет компилировать в:

 .container { width: 60%; } @media (min-width: 200px) and (max-width: 600px) { .container { width: 100%; } } 

Как видите, мы получили отдельное правило для нашего медиазапроса, даже если он был вложен в класс .container . Мы также можем вкладывать запросы @media в другие. Запросы будут объединены с использованием and .

 @media screen { .main { @media (max-width: 600px) { width: 100%; } @media (min-width: 700px) { width: 70%; } } } 

Что дает нам

 @media screen and (max-width: 600px) { .main { width: 100%; } } @media screen and (min-width: 700px) { .main { width: 70%; } } 

Как видите, два медиа-запроса были созданы. Наконец, мы можем использовать выражения Sass, такие как переменные, функции и операторы, для имен и значений объектов.

 $format: screen; $mobile: 500px; $tablet: 800px; $desktop: 1200px; @media #{$format} { .menu { @media (max-width: $mobile) { width: 100%; } @media (max-width: $tablet) { width: 60%; } @media (max-width: $desktop) { width: 30%; } } } 

Как вы можете видеть, мы используем интерполяцию с нашей переменной $format и вкладываем наши запросы. Мы используем различные переменные устройства для построения остальных наших запросов. Это дает нам:

 @media screen and (max-width: 500px) { .menu { width: 100%; } } @media screen and (max-width: 800px) { .menu { width: 60%; } } @media screen and (max-width: 1200px) { .menu { width: 30%; } } 

@extend

Иногда при оформлении страницы у вас может быть элемент, который должен иметь все стили другого элемента, а также собственные стили. Допустим, у нас было два класса для текста, один обычный и один для выделенного текста.

 .main { color: black; font-size: 12px; } .emphasis { font-weight: bold; } 

Это работает достаточно хорошо, но чтобы использовать выделенный текст, мы должны сделать это:

 <div class="main emphasis"> 

Помните, что мы можем использовать Sass, чтобы уменьшить количество набираемого текста. Директива @extend позволяет нам иметь один элемент, наследующий стили другого.

 .master { color: black; font-size: 12px; } .emphasis { @extend .master; font-weight: bold; } 

Мы использовали @extend для переписывания стилей сверху, что дает нам:

 .master, .emphasis { color: black; font-size: 12px; } .emphasis { font-weight: bold; } 

Как видите, .emphasis включен в .master а также имеет стили, которые применяются только к выделенному тексту. Теперь, чтобы использовать этот класс, нам просто нужно включить класс .emphasis .

С помощью директивы @extend мы можем расширять сложные селекторы, иметь несколько @extends, цепочку @extends и многое другое. Я мог бы написать целую статью о @extends, для получения дополнительной информации о @extends ознакомьтесь с документацией Sass .

Используйте @extend с осторожностью, так как @extend CSS может стать раздутым, и из-за того, как работает директива, вы можете создать действительно плохой CSS. Хьюго написал пост о том, почему он избегает использовать @extend, и более подробный пост .

@ На корню

Директива @ at-root создает правила в корне документа, а не вкладывается в их родительский элемент.

 .top { .first { font-size: 12px; } @at-root { .second { font-size: 14px; } .third { font-size: 16px; } } .fourth { font-size: 18px; } } 

Который компилируется в:

 .top .first { font-size: 12px; } .second { font-size: 14px; } .third { font-size: 16px; } .top .fourth { font-size: 18px; } 

Директива @ at-root работает с одной строкой или блоком селекторов. Как вы можете видеть, селекторы, вложенные в @ at-root, находятся в корне документа. Другие селекторы вложены в .top .

Директива @ at-root также позволяет вам выйти за пределы директив с помощью (without:...) или (with:...) . Например.

 @media print { .copy { color: black; @at-root (without: media) { width: 100%; } } } 

Которые дают нам:

 @media print { .copy { color: black; } } .copy { width: 100%; } 

Директива @ at-root также имеет without , что может позволить нам создать отдельный стиль без запроса @media.

@debug

Директива @debug выводит значение выражения Sass в стандартный поток вывода ошибок. Например:

 @debug 10px + 20px; 

Когда я сохраняю файл, вывод записывается в выходной поток моей команды наблюдения.

 1 DEBUG: 30px 

@warn

Директива @warn выводит значение выражения Sass в стандартный поток вывода ошибок.

 $wrn: 20px; @warn "#{$wrn}"; 

Он будет отображать значение выражения, а также номер строки предупреждения.

@ошибка

Директива @error возвращает значение выражения Sass как ошибки снова в стандартный поток ошибок

 $test: 1px; @error "#{$test}"; 

Это отобразит ошибку, номер строки и значение в стандартном потоке ошибок.

Вывод

Мы выделили ряд @ -правил и директив, о которых вы, возможно, не знали. Возможно, вы их не найдете много, но всегда полезно знать все возможности ваших инструментов.