SASS vs CSS
CSS прошёл долгий путь с момента появления в 1996 году. В начале истории языка разработчикам приходилось использовать препроцессоры вроде Sass, облегчающие работу с языком. Среди них были переменные, функции, циклы и условия.
Сегодня CSS сильно отличается от того, что мы видели в 1996 году. С появлением таких функций, как переменные, медиа-запросы и вложенная стилизация, разработчикам больше не нужно полагаться на Sass и другие препроцессоры, как это было раньше.
Sass — это препроцессор CSS, существующий с 2006 года. Многие разработчики по всему миру используют его для создания сайтов любого размера. Он построен поверх обычного (или нативного) CSS, добавляя такие возможности, как миксины, функции и циклы. Итак, давайте рассмотрим синтаксис и его сравнение с нативным CSS.
Вложенные стили
Вложенность — это возможность, характерная для таких препроцессоров, как Sass. Некоторые разработчики перешли на Sass только из-за поддержки вложенной стилизации. Вложенность не только упрощает создание стиля, но и делает его более "естественным". Для примера представим, что у вас есть следующий HTML:
<aside>
<h3>Page Contents</h3>
<ul>
<li>Introduction</li>
<li>Using Loops in JavaScript</li>
<li>Writing Conditional statements</li>
</ul>
</aside>
Если вы хотите стилизовать элементы <li>
внутри элемента <ul>
, поскольку Sass поддерживает вложенность, вы можете сделать следующее:
ul
background-color: red
li
list-style: none
Раньше CSS не мог это сделать, и приходилось прибегать к следующему способу:
ul {
background-color: red;
}
ul li {
list-style: none;
}
Теперь вложенность поддерживается CSS, поэтому код будет выглядеть следующим образом:
ul {
background-color: red;
li {
list-style: none;
}
}
При анализе приведённого выше кода браузер автоматически добавляет пробелы между ul
и li
.
Это отлично работает, но как быть в ситуациях, когда нужно стилизовать вложенный псевдокласс? Следующий код не будет работать.
div {
background-color: red;
:hover {
text-decoration: underline;
}
}
Поскольку браузер автоматически добавляет пробелы между вложенным селектором и его родителем, результат анализа селектора будет выглядеть так: div :hover
. Чтобы предотвратить такое поведение, добавьте символ &
перед вложенным селектором.
div {
background-color: red;
&:hover {
text-decoration: underline;
}
}
Символ &
называется "селектором вложенности", определяющим прямую связь между дочерним элементом и его предком.
Функции и миксины в Sass
Функции — одно из главных преимуществ Sass. Многие функции Sass доступны во встроенных модулях, которые необходимо загрузить перед использованием. Загрузить функцию можно с помощью правила @use
.
Некоторые модули включают модуль sass:math
, позволяющий работать с числами, модуль sass:string
для работы со строками и модуль sass:color
, используемый для работы с цветом. Однако не все функции содержатся в модулях. Некоторые функции, например if
, доступны глобально.
Например, ниже показано, как можно манипулировать строками с помощью модуля sass:string
.
@use "sass:string"
div:after
display: block
content: string.quote(Hello)
В приведённом выше блоке кода мы загружаем модуль sass:string
с помощью директивы @use
, а затем после загрузки модуля применяем стилизацию к псевдоэлементу div:after
. Свойству content
присваивается результат выражения string.quote(Hello)
из загруженного модуля.
Это приведёт к следующему результату:
div:after {
display: block;
content: "Hello";
}
Прежде чем перейти к более сложному примеру, давайте рассмотрим, как определить пользовательскую функцию в Sass. Для определения пользовательских функций нужно написать @function
и указать имя функции.
Вы можете вернуть значение из функции с помощью правила @return
. Определим пользовательскую функцию, вычисляющую площадь квадрата в зависимости от длины его стороны. Длина стороны — это значение, передаваемое в функцию в качестве параметра.
@function calculate-square-area($side-length)
@return $side-length * $side-length
div
width: calculate-square-area(40)
height: calculate-square-area(40)
Приведённый выше код приводит к следующему результату:
div {
width: 1600;
height: 1600;
}
Теперь рассмотрим, как можно создать нечто более сложное с помощью функций и миксинов в Sass. Миксины определяются с помощью директивы @mixin
. Как и функции, они могут принимать параметры, но, в отличие от функций, они не возвращают значение.
Вместо этого миксины пригодятся, когда необходимо сгруппировать связанные правила стиля. Посмотрите на следующий код и попробуйте догадаться, что происходит:
@use "sass:string"
// Функция для создания класса кнопки на основе типа кнопки
@function generate-button-class($type)
@return string.quote("button-" + $type)
// Определение стиля кнопки
@mixin button-style($type)
.#{generate-button-class($type)}
padding: 10px
border: 1px solid #333
background-color: if($type == "primary", #3498db, #e74c3c)
color: #fff
text-decoration: none
display: block
cursor: pointer
&:hover
background-color: darken(if($type == "primary", #3498db, #e74c3c), 10%)
// Применение стилей кнопок к различным типам кнопок
@include button-style("primary")
@include button-style("secondary")
В приведённом выше коде происходит довольно много вещей, поэтому давайте разберём его на части. Во-первых, функция generate-button-class
принимает аргумент $type
и конкатенирует его со строкой "button-".
Далее миксин button-style
получает параметр $type
и использует интерполяцию .#{generate-button-class($type)}
для вставки результата функции generate-button-class
в строку.
Синтаксис интерполяции (#{<выражение>}
) удобен, когда нужно динамически генерировать имена классов или значения свойств в строке.
Глобальная функция if()
проверяет, является ли параметр $type
"primary", и устанавливает background-color
значение #3498db
, если условие true
, и #e74c3c
в противном случае.
И наконец, директива @include
используется для применения стилей, определённых в миксине. В результате приведённого выше блока кода должно получиться следующее:
.button-primary {
padding: 10px;
border: 1px solid #333;
background-color: #3498db;
color: #fff;
text-decoration: none;
display: block;
cursor: pointer;
}
.button-primary:hover {
background-color: #217dbb;
}
.button-secondary {
padding: 10px;
border: 1px solid #333;
background-color: #e74c3c;
color: #fff;
text-decoration: none;
display: block;
cursor: pointer;
}
.button-secondary:hover {
background-color: #d62c1a;
}
Функции и At-правила в CSS
CSS обладает набором встроенных функций, обеспечивающих дополнительную функциональность для стилизации элементов. Хотя эти функции очень мощные, они несколько ограничены по сравнению с широкими возможностями, предлагаемыми препроцессорами вроде Sass.
Среди встроенных функций CSS можно отметить linear-gradient
для создания градиентных фонов, calc
для выполнения вычислений в значениях свойств, а также функции min
и max
для работы с минимальными и максимальными значениями. В отличие от Sass, в CSS нет возможности определить пользовательскую функцию.
В CSS предусмотрена поддержка at-правил, представляющих собой специальные инструкции, предваряемые символом "@", которые изменяют поведение CSS. Некоторые из наиболее популярных at-правил, которые можно встретить в современной кодовой базе, включают: @media
, @font-face
, @keyframes
, @supports
и @import
. Вот как можно использовать каждое из них:
@media
: используется для применения стилей, основанных на параметрах устройства или предпочтениях пользователя, таких как размер экрана или цветовые возможности.@media screen and (max-width: 600px) {
body {
font-size: 14px;
}
}@font-face
: определяет пользовательские шрифты, которые могут быть недоступны в системе пользователя.@font-face {
font-family: 'MyCustomFont';
src: url('my-custom-font.woff2') format('woff');
font-weight: normal;
font-style: normal;
}@keyframes
: Определяет анимацию с помощью серии ключевых кадров.@keyframes slide-in {
from {
transform: translateX(-100px);
}
to {
transform: translateX(0px);
}
}
.slide-in-animation {
animation: slide-in 1s ease-in-out;
}@supports
: Проверяет, поддерживает ли браузер определённую функцию или свойство, прежде чем применять стили.@supports (display: grid) {
.grid-container {
display: grid;
}
}@import
: Импортирует внешнюю таблицу стилей в текущую.@import url("external-stylesheet.css");
Инструменты сборки и рабочий процесс
Для применения Sass в современной кодовой базе JavaScript необходимо, чтобы на компьютере был установлен Node.js и менеджер пакетов Node (NPM). С NPM установка Sass проста — достаточно выполнить в терминале следующую команду:
npm install -g sass
После успешной установки Sass необходимо использовать компилятор Sass для конвертирования .sass файла в .css файл, который сможет разобрать браузер. Общий синтаксис выглядит следующим образом:
sass <путь-к-sass-файлу> <css-файл-с-результатом>
Если вы хотите конвертировать styles.sass
в styles.css
, сделайте следующее:
sass styles/styles.sass styles/styles.css
Использование Sass с инструментами сборки, такими как Webpack, требует наличия загрузчиков, таких как css-loader и sass-loader, а также загрузчик MiniCssExtractPlugin.
CSS, в отличие от Sass, не требует дополнительного этапа сборки. CSS — это язык стилей, понятный веб-браузерам, и его не нужно компилировать или обрабатывать, прежде чем он будет интерпретирован браузером.
Взвешивая плюсы и минусы: Sass vs. CSS
Подведём итоги.
Преимущества Sass
- Мощные возможности: Sass представляет мощные возможности, расширяющие возможности CSS. Переменные, миксины и вложенность обеспечивают более организованную и удобную структуру таблиц стилей. Подобная модульность помогает эффективно управлять и обновлять стили в рамках всего проекта.
- Обширное сообщество: Sass существует уже более 10 лет, и за это время у него появилось большое и активное сообщество разработчиков. Поддержка сообщества способствует появлению ресурсов, документации и сторонних инструментов, облегчающих использование Sass. В сообществе вам и другим разработчикам будет проще находить решения и делиться передовым опытом/лучшими практиками.
- Отлаженный рабочий процесс: Препроцессор Sass следует хорошо отлаженному рабочему процессу. Благодаря таким возможностям, как партиалы и импорт, разработчики могут разделять таблицы стилей на управляемые компоненты, что упрощает поддержку и масштабирование стилей в больших проектах.
Недостатки Sass
- Дополнительный шаг сборки: Одним из главных недостатков использования Sass является необходимость дополнительного этапа сборки. Перед развёртыванием стилей в продакшене код Sass необходимо скомпилировать в стандартный CSS. Это усложняет и требует дополнительных инструментов и настроек в рабочем процессе разработки.
- Кривая обучения: Разработчикам, только начавшим работать с Sass, придётся пройти кривую обучения, чтобы понять и эффективно использовать его возможности. Несмотря на значительные преимущества, вы можете воспринять ранние инвестиции в изучение Sass как недостаток, особенно если вы больше привыкли к традиционному CSS.
Преимущества CSS
- Простой синтаксис: Синтаксис CSS прост и понятен. Эта простота делает его доступным для разработчиков любого уровня подготовки. Запись стилей непосредственно в CSS не требует предварительной обработки, что позволяет реализовать их сразу же.
- Бесшовная интеграция: Стили, написанные на CSS, легко интегрируются с HTML. Нет необходимости в дополнительной сборке или компиляции. Такая простая интеграция упрощает процесс разработки и позволяет быстро тестировать и внедрять стили.
Возможные недостатки CSS
- Ограничения в возможностях: Хотя CSS покрывает все основы, ему не хватает некоторых расширенных возможностей, предоставляемых препроцессорами вроде Sass. Отсутствие миксинов может сделать таблицы стилей менее модульными и более сложными для поддержки в больших проектах. Ранее эти ограничения включали переменные и вложенность, но на текущий момент не реализованными остались только миксины.
- Поддержка браузером расширенных возможностей: Некоторые расширенные возможности, особенно связанные с препроцессорами, могут иметь различный уровень поддержки браузерами в CSS. Вы должны знать об этих ограничениях, когда выбираете CSS вместо более функциональных альтернатив. Например, хотя большинство современных браузеров поддерживают вложенные стили, не все пользователи имеют последние версии своих браузеров. Поэтому парсер может неправильно интерпретировать вложенные стили.
Sass vs. CSS: Что нужно учесть
- Сложность проекта: Поскольку Sass предлагает широкий набор возможностей, таких как миксины, пользовательские функции и вложенность, он часто ярко проявляет себя в больших проектах, требующих высокой степени организации и масштабируемости. Возможность разбивать стили на модульные компоненты становится всё более выгодной по мере роста сложности проекта.
- Оценка команды: Оценка текущей квалификации команды поможет решить, какой инструмент добавить в проект. Если команда хорошо разбирается в Sass, использование его возможностей может значительно повысить производительность и качество кода. Но если CSS соответствует опыту команды или если есть ограничения по времени, ограничивающие кривую обучения, то лучшим выбором может стать использование CSS.
Заключение
Принимая решение между Sass и CSS, нужно учитывать все нюансы проекта и опыт команды. CSS прошёл долгий путь, и для большинства случаев использования может оказаться, что в препроцессоре вроде Sass нет необходимости. Помните, что всегда можно поэкспериментировать с обоими инструментами, чтобы понять, какой из них подходит вам или вашему проекту больше всего. Главное — найти то, что лучше всего подходит именно вам и вашей уникальной ситуации.