@ -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}";
Это отобразит ошибку, номер строки и значение в стандартном потоке ошибок.
Вывод
Мы выделили ряд @ -правил и директив, о которых вы, возможно, не знали. Возможно, вы их не найдете много, но всегда полезно знать все возможности ваших инструментов.