Gulp sass — установка, настройка и его возможности

Создание компонентов

То, как вы структурируете файлы, и то, какие имена вы используете, определяет будущий процесс разработки, в особенности если ваше приложение растет и вы работаете в команде.

Существует множество различных стратегий, но после многократных попыток их применения, я выбрал одну, которая лучше всего сработала для Devbridge Group — это стратегия компонентов. Компоненты — это независимые элементы, которые можно многократно использовать в различных местах. Это могут быть небольшие элементы, как, например, “Button”, “Input” или большие — например, “Article.” Главное — сделать их независимыми: не создавайте страницы или модули, зависящие от контента. Делайте так, чтобы они представляли объект, тип графического элемента или функцию и называйте их так, чтобы легко было понять, что они означают (избегайте сокращений, например, btn, frm, ppl, и т.д.).

Что касается структуры файлов: рекомендуется создавать один файл для одного компонента. Это вначале может показаться странным, но в итоге такой подход позволяет в будущем найти необходимый компонент намного быстрее. Воспринимайте файл как класс в ООП, или, если вы знакомы с ReactJS, как React компонент. Если же у вас сотни и тысячи небольших компонентов — создавайте папки. Например, вы можете положить все компоненты формы в папку /form-elements.

Другая проблема — инкапсуляция стилей. Иногда нужно сделать небольшие изменения — допустим, нужно сделать кнопку шире или выше. В таком случае, вы возможно захотите переопределить ее как “.my-custom-page .button”. Однако в дальнейшем такой подход может вызвать путаницу — вам будет тяжело поддерживать код с большим количеством переопределений. Вместо этого, измените сам компонент, например: “.button—large”.

Лучший способ придерживаться этого шаблона, на мой взгляд — это использовать стратегию именования CSS классов BEM (если вы не в курсе, что такое BEM, вы можете прочитать здесь). BEM хорошо подходит для Saas. Используя селектор & и вложенность, вы легко сможете сконструировать модули.

.article {
    width: 100px;
     
    &__title {
        font-size: 20px;
        font-weight: 500;
    }

    &--wide {
        width: 200px;
    }
}

Примечание. Возможные проблемы и их решения

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

Такой вариант не подойдет: Такой путь будет работать:

Если имя пользователя в Windows у вас на кириллице, тогда чтобы не переименовывать его, не создавать нового или не переустанавливать систему, просто размещайте все проекты на каком-либо диске, избегая рабочий стол, например:

Оболочки

LibSass — это всего лишь библиотека. Чтобы запустить её (например, скомпилировать ваши таблицы стилей), требуется программа-обработчик, или «оболочка». Существует множество оболочек для LibSass. Мы поощряем создание новых оболочек — весь смысл LibSass в том, чтобы принести Sass во многие другие языки, а не только в Ruby!

Ниже представлены оболочки для LibSass, о которых нам известно на данный момент. Для некоторых языков присутствует несколько оболочек — в таких случаях первыми мы размещаем те, которые имеют самые свежие обновления.

  • Sass C

    SassC — это оболочка, написанная на языке C.

    Чтобы запустить компилятор на своём локальном компьютере, вам нужно собрать SassC. Для этого нужно либо иметь локальную копию исходников LibSass, либо он должен быть установлен в вашей системе. Для разработки, пожалуйста, используйте исходники. Далее вам нужно настроить переменную среды так, чтобы она указывала в директорию LibSass, например:

    Исполняемый файл будет находиться в директории bin. Для его запуска используйте команду, подобную этой:

  • sass.cr is a LibSass wrapper for the Crystal programming language.

  • Go

    go-libsass has the most active GoLang wrapper. gosass is another LibSass wrapper.

    Wellington — раcширение к libSass, добавляющее возможность создания спрайтов. Доступно через пакетный менеджер brew: 

    C6 is a Sass 3.2 compatible implementation written in pure GoLang that aims to extend Sass. wellington/sass is an in-progress pure Go Sass lexer, parser, and compiler.

  • jsass — оболочка, написанная на Java. Плагин для Maven: libSass Maven plugin.

  • The sass.js project makes LibSass available as pure JavaScript. There’s a way to test it in the browser, too.

  • Оболочка для lua находится на сайте lua-sass.

  • libsass-net регулярно обновляется, вероятно являясь наилучшим вариантом. Также существует NSass, хотя он некоторое время не обновлялся.

  • Проект node-sass доказал свою популярность, и мы взяли его в основной репозиторий Sass на GitHub. Проверить обновления можно на странице пакета здесь, и на отведённом для него Твиттер-аккаунте.

  • Проект CSS::Sass обновляется регулярно. Также существует проект Text-Sass-XS, который некоторое время не обновлялся.

  • Проект SassPHP — обновлённый форк более старой PHP версии.

  • Три других проекта для Python, python-scss, pylibsass и SassPython, некоторое время не обновлялись.

  • libSass также был обратно портирован на Ruby в проекте sassc-ruby.

  • The crate is a LibSass wrapper and is updated regularly.

Настройка окружения

В качестве окружения для работы с Sass в этом уроке, как и в других наших уроках, мы будем использовать версию Sass для таск-менеджера Gulp (gulp-sass). Для использования оригинальной Ruby версии или компиляции Sass посредством специального ПО, вы можете ознакомиться с инструкциями на оф. сайте. Данный урок носит преимущественно практический характер, поэтому останавливаться на возможных вариантах подключения к проекту не будем, подключим Sass наиболее популярным способом, используя Gulp.

Убедитесь, что у вас установлена последняя версия Node.js и Gulp. Если Node.js не установлен, скачайте его и установите. После установки Node.js установите gulp командой «npm i -g gulp» (Windows) или «sudo npm i -g gulp» (Linux, OS X). Почитать: Подробное руководство Gulp.

В папке вашего проекта выполните команду npm init и заполните пошагово информацию о вашем новом проекте. Пример, также, есть на странице руководства Gulp.

Далее установим в проект пакеты gulp, sass и gulp-sass командой:

npm i --save-dev gulp sass gulp-sass

Далее в папке проекта создадим gulpfile.js следующего содержания:

var gulp = require('gulp'), // Подключаем Gulp
		sass = require('gulp-sass')(require('sass')); // Подключаем Sass пакет

gulp.task('sass', function() { // Создаем таск "sass"
	return gulp.src(['sass/**/*.sass', 'sass/**/*.scss']) // Берем источник
		.pipe(sass({outputStyle: 'expanded'}).on('error', sass.logError)) // Преобразуем Sass в CSS посредством gulp-sass
		.pipe(gulp.dest('css')) // Выгружаем результата в папку css
	});

gulp.task('watch', function() {
	gulp.watch(['sass/**/*.sass', 'sass/**/*.scss'], ); // Наблюдение за sass файлами в папке sass
});

gulp.task('default', );

У вас должна быть следующая структура проекта в вашей файловой системе:

  • myproject/

    • css/

      common.css

    • sass/

      common.sass

    • node_modules/
    • gulpfile.js
    • package.json

Запускаем выполнение Gulpfile командой gulp в терминале папки проекта.

Здесь мы берем все Sass файлы из директории sass/ вашего проекта и выгружаем готовый CSS результат в папку css/. Кроме того, здесь мы устанавливаем наблюдение watch за изменениями в Sass файлах и автоматическую компиляцию в CSS, если такие изменения имеют место быть. Результирующий css файл подключается в верстку.

Если вам что-то не понятно по настройке Gulp пакетов в данном примере, прочтите руководство Gulp.

После того, как наше окружение настроено и Sass успешно преобразуется в CSS при сохнанении *.sass файлов в директории sass/, можно спокойно продолжать обучение и выполнять примеры, которые мы будем сегодня разбирать, на практике.

Extend/Inheritance

This is one of the most useful features of Sass. Using lets you share a set of CSS properties from one selector to another. It helps keep your Sass very DRY. In our example we’re going to create a simple series of messaging for errors, warnings and successes using another feature which goes hand in hand with extend, placeholder classes. A placeholder class is a special type of class that only prints when it is extended, and can help keep your compiled CSS neat and clean.

CSS Output

What the above code does is tells , , , and to behave just like . That means anywhere that shows up, , , , &  will too. The magic happens in the generated CSS, where each of these classes will get the same CSS properties as . This helps you avoid having to write multiple class names on HTML elements.

You can extend most simple CSS selectors in addition to placeholder classes in Sass, but using placeholders is the easiest way to make sure you aren’t extending a class that’s nested elsewhere in your styles, which can result in unintended selectors in your CSS.

Note that the CSS in isn’t generated, because is never extended.

Configuration permalinkConfiguration

A stylesheet can define variables with the to make them configurable. To load a module with configuration, write . The configured values will override the variables’ default values.

With Mixins

Configuring modules with can be very handy, especially when using libraries that were originally written to work with the rule. But it’s not particularly flexible, and we don’t recommend it for more advanced use-cases. If you find yourself wanting to configure many variables at once, pass maps as configuration, or update the configuration after the module is loaded, consider writing a mixin to set your variables instead and another mixin to inject your styles.

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

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

Когда я только знакомился с CSS препроцессорами, мне, как и многим другим начинающим веб-разработчикам, была не до конца понятна сама идея использования CSS препроцессоров. Зачем делать дополнительную прослойку, использовать какие-то инструменты, усложнять CSS, думал я. Но со временем начал понимать, что изо дня в день написание CSS становилось пыткой, серой рутиной, многие действия приходилось повторять, копировать селекторы, свойства и даже целые блоки CSS кода для достижения необходимого результата. Сегодня, на примерах, я покажу вам, как можно упростить работу, используя препроцессор Sass, разнообразить разработку и даже немного поразвлечься при написании каких-то более или менее сложных функций.

Modules

Dart Sass
since 1.23.0
LibSass
Ruby Sass

Only Dart Sass currently supports . Users of other implementations must use the rule instead.

You don’t have to write all your Sass in a single file. You can split it up however you want with the rule. This rule loads another Sass file as a module, which means you can refer to its variables, , and functions in your Sass file with a namespace based on the filename. Using a file will also include the CSS it generates in your compiled output!

CSS Output

Notice we’re using in the file. When you use a file you don’t need to include the file extension. Sass is smart and will figure it out for you.

Reusable Styles and Configuration

None of the files under are allowed to generate any CSS. The config directory only includes reusable SCSS variables, functions, placeholders, and mixins.

is one level up and knits together all of the different config files. Most of my modular SCSS files have the line at the top so that I can have access to the shared variables and reusable styles. There is no downside of re-importing the top-level SCSS config.

// config.scss@import "config/functions";@import "config/breakpoints";@import "config/colors";@import "config/mixins";@import "config/variables";@import "config/placeholders";

Спросите врача!

Получите бесплатный ответ от самых лучших врачей сайта.

  • Это БЕСПЛАТНО
  • Это очень просто
  • Это анонимно

28,265 ответов за неделю

2,744 консультирующих врачей

Информация на Сайте не считается достаточной консультацией, диагностикой или назначенным врачом методом лечения. Контент Сайта не заменяет профессиональную очную медицинскую консультацию, осмотр врача, диагностику или лечение. Информация на Сайте не предназначена для самостоятельной постановки диагноза, назначения медикаментозного или иного лечения. При любых обстоятельствах Администрация или авторы указанных материалов не несут ответственности за любые убытки, возникшие у Пользователей в результате использования таких материалов. Никакая информация на сайте не является публичной офертой. Google+

О найденных недочетах пишите support@03.ru.

Статистика За сутки добавлено 6 вопросов, написано 9 ответов, из них 1 ответ от 3 специалистов в 1 конференции.

С 4 марта 2000-го 375 специалистов написали 511 756 ответов на 2 329 486 вопросов

Рейтинг жалоб

  1. Анализ крови1455
  2. Беременность1368
  3. Рак786
  4. Анализ мочи644
  5. Диабет590
  6. Печень533
  7. Железо529
  8. Гастрит481
  9. Кортизол474
  10. Диабет сахарный446
  11. Психиатр445
  12. Опухоль432
  13. Ферритин418
  14. Аллергия403
  15. Сахар крови395
  16. Беспокойство388
  17. Сыпь387
  18. Онкология379
  19. Гепатит364
  20. Слизь350

Рейтинг лекарств

  1. Парацетамол382
  2. Эутирокс202
  3. L-Тироксин186
  4. Дюфастон176
  5. Прогестерон168
  6. Мотилиум162
  7. Глюкоза-Э160
  8. Глюкоза160
  9. Л-Вен155
  10. Глицин150
  11. Кофеин150
  12. Адреналин148
  13. Пантогам147
  14. Церукал143
  15. Цефтриаксон142
  16. Мезатон139
  17. Дофамин137
  18. Мексидол136
  19. Кофеин-бензоат натрия135
  20. Натрия бензоат135

Здравствуйте! Сдавала кровь на коагуляцию — САСС. Прошу, скажите, что означает повышение норм? 36 лет, не беременна (просто прочитала здесь с такими вопросами в основном беременные обращаются). Кровь сдавалась сразу после ОРЗ. Результаты: Фибриноген — 4, . открыть (еще 2 сообщения)

Спасибо за ответ! А вот думаю, может стоит пересдать САСС чуть позже, или вообще не стоит больше этого делать, т.к. не даст он информации о возможных сосудистых проблемах (например имеются или нет отложения на стенках сосудов)? Ну вот насмотришься по . смотреть

. (повышение лимфоцитов,моноцитов,понижение нейтрофилов), может правда пневмония? Еще в день сдачи было расстройство желудка. Вообще пошла САСС сдавать, т.к. маме 62 г недавно поставили атеросклероз и сказали у нее густая кровь. Ну и решала проверить свою . смотреть

Здравствуйте! Моей 8 летней дочери в апреле 2010г. в городе Владивостоке был поставлен диагноз: дизагрегационная тромбоцитопатия.Рецидивирующие носовые кровотечения.Тромбоцитограмма:… открыть (еще 2 сообщения)

5 февраля 2011 г. / Нат. Карнаухова…

. не почти не вставала с кровати.Носовые кровотечения по 4 раза на день,синяки на ногах.Еще был анализ крови на САСС +АЧТВ: ПТИ 98%,время рекальцификации 110 сек.,гепарин.время-49сек.,ТПТ-15 мин.,фибриноген-2,22 г/л.,Тромботест- 4 ст., (АЧТВ . смотреть

. упаковки тромбоцитов и 1 пачку крови. вечером еще кровь перельют. сегодня консультировала гинеколог, из за продолжающегося маточного кровотечения назначила капельницы с окситоцином. САСС:ПТИ 89, птв 20, АЧТВ 65,1, фибриноген 1,3, ТВ 15, тромботест 2 ст. открыть

. не знаю, завтра скажут. правда началось маточное кровотечение. по словам врачей, оно началось на фоне острой почечной недостаточности. не знала что от почек бывают маточные кровотечения. это бывает? завтра вышлю анализ крови клинический, биохимию и САСС открыть (еще 1 сообщение)

. упаковки тромбоцитов и 1 пачку крови. вечером еще кровь перельют. сегодня консультировала гинеколог, из за продолжающегося маточного кровотечения назначила капельницы с окситоцином. САСС:ПТИ 89, птв 20, АЧТВ 65,1, фибриноген 1,3, ТВ 15, тромботест 2 ст. смотреть

. : клинический анализ крови, общий анализ мочи, биохимические пробы, рентген пазух черепа, флюорография органов грудной клетки, ЭДС, САСС — без патологии. Лечение с нестойким эффектом. Получал лечение: цефтриоксон 1г в/ м 5 дней с нестойкими улучшениями, . открыть

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

Здравствуйте! Беременность 25- 26 нед. , сдавала анализ крови на САСС, результаты: Ht — 38 % , АПТВ ПО- 0, 9, эталоновые тест — положит. , фибриноген — 3, 0. В консультации сказали, что анализ плохой, на вопрос, что именно не так, ответили, что что- то с . открыть

Расширение/Наследование

Это одна из самых полезных функций Sass. Используя директиву можно наследовать наборы свойств CSS от одного селектора другому. Это позволяет держать ваш Sass-файл в «чистоте». В нашем примере мы покажем вам как сделать стили оповещений об ошибках, предупреждениях и удачных исходах, используя другие возможности Sass, которые идут рука-об-руку с расширением, классами-шаблонами. Класс-шаблон — особый тип классов, который выводится только при использовании расширения — это позволит сохранить ваш скомпилированный CSS чистым и аккуратным.

CSS Output

Вышеуказанный код сообщает классам , , и  вести себя как . Это означает, что где бы не вызывался , то и , , и  тоже будут вызваны. Магия происходит в сгенерированном CSS, где каждый из этих классов получает css-свойства, как и . Это позволит вам избежать написания множества классов в HTML элементах.

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

Когда вы генерируете ваш CSS, то он будет выглядеть как пример ниже

Обратите внимание, не попадает в CSS, так как ни разу не был использован

Установка SASS

Чтобы установить SASS, откройте командную строку и введите gem install sass, после этого вы должны получить сообщение об успешном окончании установки:

Подготовка необходимых файлов

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

Создайте новую папку (для данной статьи, я расположил эту папку на своем рабочем столе) и назовите её, например, SASS или как вам будет угодно. Внутри папки SASS, создайте HTML-файл, дав ему имя index.html.

Поместите в него следующий код:

<!DOCTYPE html>
 
<html lang="en">
    
 <head>
         
<title>Введение в SASS</title>
<link href="style.css" rel="stylesheet" type="text/css" />
</head>
 
<body>
<div id="container">
 
<header>
<h1>Простой Sass-документ</h1>
<h2>Статья для веб-дизайнеров и разработчиков</h2>
</header>
 
<div>
<p id="samplepara">Простой текстовый параграф</p>
<p>Еще один параграф с текстом</p>
</div>
 
 
<div>
<ul id="list1">
    <li>1й элемент списка</li>
    <li>2й элемент списка </li>
    <li>3й элемент списка </li>
</ul>
</div>
 
 
<footer>
<h3>Это отличный футер!</h3>
</footer>
 
</div>
 
</body>
 
</html>

Теперь, для файла SASS, создайте пустой файл в предпочитаемом вами текстовом редакторе и назовите его style.scss.

Если вы точно следовали всем шагам, то на данный момент у вас будет следующая структура файлов:

Конвертация SASS-кода в CSS

Чтобы преобразовать код SASS в CSS, мы будем использовать команду –watch, которая выполнит компиляцию.

Также, эта команда просканирует папки на наличие изменений. Давайте попробуем сконвертировать SASS-файл в CSS-файл. Но сначала нам нужно расположить код в файле ourstyle.scss, чтобы убедиться, что все работает.

Скопируйте и вставьте следующий SASS-код в файл stye.scss, созданный вами в папке SASS:

$myMargin: 0px auto;
$myColor: red;
$myWidth: 600px;
 
h1 {
    color: $myColor;
    $myMargin: $margin;
}

Далее, откройте командную строку и перейдите в директорию, где вы расположили ваши файлы. В моем случае это папка на рабочем столе, поэтому я ввожу cd «Desktop«:

Теперь, находясь в папке рабочего стола, введите sass –watch Sass:Sass:

Используя команду – watch, сконвертируем все .scss-файлы в папке SASS. Также, файлы будут просканированы на наличие в них изменений. Заметьте, что в команде два слова SASS, разделенные двоеточием.

Первое слово представляет текущее положение файла .scss, а второе – расположение выходного файла. Убедитесь, что вы подключили сконвертированный CSS-файл к вашей HTML-странице:

Использование переменных

Переменные SASS объявляются с предваряющим их название символом $ и записываются аналогично CSS-свойствам. С помощью SASS, вы можете определять переменные для таких стилей, как font size, margin, padding и так далее.

Использование переменных дает вам возможность повторного использования заданных ранее значений.

В SASS существует шесть разных типов переменных:

  • Строковые (например, $myString: “здесь ваш текст”;);
  • Числовые (например, $myNum: 10px;);
  • Цветовые (например, $myColor: white;);
  • Логические (например, $myBool: true;);
  • Списковые (например, $myItemList: 1px solid red;);
  • Тип null – значение отсутствует (например, $myVar: null;).

Давайте опробуем эти типы на практике. Откройте файл style.scss и добавьте в него следующий код:

$myColor: #009a82;
$myString: "здесь ваш текст";
$myFontSize: 13px;
$myMargin: 0px auto;
$myWidth: 460px;
 
h1 {
    color: $myColor;
    margin: 0;
    padding: 0;
}
 
#container {
    width: $myWidth;
    margin: $myMargin;
}

Запустив этот код в браузере, вы получите следующее:

Вложенность

SASS также позволяет определять вложенные стили. Это позволит вам писать очень легко читающиеся стили.

В качестве примера, рассмотрим следующий код:

#container p {
   font-family: Arial;
   font-size: 13px;
}
 
#container h1 {
   font-family: Tahoma;
   font-size: 15px;
}
 
#container h2 {
   font-family: Helvetica;
   font-size: 14px;
}

Для SASS, код будет выглядеть следующим образом:

$myFontsize1: 13px;
$myFontsize2: 18px;
$myFontsize3: 25px;
$myWidth: 500px;
$myMargin: 0px auto;
 
#container {
    width: $myWidth;
    margin: $myMargin;
 
    p {
        font-family: Arial;
        font-size: $myFontsize1;
    }
 
    h1 {
        font-family: Tahoma;
        font-size: $myFontsize3;
    }
 
    h2 {
 
        font-family: Helvetica;
        font-size: $myFontsize2;
}
}

Обратите внимание, что мы расположили все стили элементов под идентификатором container, вместо того, чтобы предварять этим id каждый из них. Если вы запустите этот код в браузере, то увидите следующую картину:

Если вы запустите этот код в браузере, то увидите следующую картину:

Повторяющийся цикл

Sass предоставляет @for и @each методы для повторяющихся циклов. Но для чего они нужны?

Допустим, у вас есть 10 модификаторов внутри блока. Все они делают одно и то же: изменяют иконку или другое свойство. Написание всех этих модификаторов вручную — не лучшее решение; и вместо этого вы можете использовать вышеупомянутые шаблоны. С локальными переменными и картами вы сможете получить чистый и простой в обслуживании код.

В следующем примере, иконки хранятся как карта (имя класса как ключ и иконка как значение):

.icon {
    $_icons: (
        delete: icn-delete,
        edit: icn-edit,
        add: icn-add
    );
    &::before {
        content: '';
    }
    @each $label, $icon in $_icons {
        &--#{$label} {
            &::before {
                @include svg-sprite($icon);
            }
        }
    }
}

Синтаксис SAAS

Существует два варианта синтаксиса Sass:

SCSS

Первый вариант известен как SCSS (Sassy CSS) и он является расширением синтаксиса CSS. Это означает, что любое допустимое значение в CSS3 стилях будет допустимо и в SCSS. Кроме того, SCSS понимает большинство СSS-хаков и синтаксис вендорных префиксов, например, старый префикс IE filter. Этот синтаксис усиливается с применением возможностей Sass, описанных далее. Файлы этого варианта синтаксиса имеют расширение .

SASS

Второй вариант, к тому же самый старый, известен как синтаксис отступов (или просто sass). Этот синтаксис обеспечивает более краткий вариант написания CSS. Он использует отступы вместо фигурных скобок, указывающие на вложение селекторов, и новые строки, заменяющие точки с запятой, для разделения свойств. Некоторые пользователи считают, что этот синтаксис легче читается и быстрее пишется, чем SCSS.

Синтаксис отступов имеет все те же функции, хотя и некоторые из них имеют немного другой вид написания, об этом можно более подробно ознакомиться в главе документации ‘SASS — синтаксис отступов’. Файлы этого варианта синтаксиса имеют расширение .

Любой из вариантов синтаксиса может импортировать файлы написанные в другом варианте синтаксиса. Файлы могут автоматически конвертироваться в другой с помощью команды в командной строке (терминале):

# Convert Sass to SCSS
$ sass-convert style.sass style.scss

# Convert SCSS to Sass
$ sass-convert style.scss style.sass

1
2
3
4
5

# Convert Sass to SCSS

$sass-convert style.sass style.scss

 
# Convert SCSS to Sass

$sass-convert style.scss style.sass

Данная команда не генерирует CSS-файл. Для компиляции в CSS-файл используйте команду .

Локальные переменные и mixins

Переменные и mixins в Sass по умолчанию являются глобальными. Если вы определили $primary-color, то его значение можно использовать везде, что не всегда хорошо. Например, у вас есть статичное значение (фиксированная высота), и вы используете его только для самого компонента и его дочерних элементов. Первый способ (и не самый эффективный) — это записать значение в глобальную переменную. Такой подход в дальнейшем может сильно увеличить список глобальных переменных, которые к тому же будут очень специфичны.

Более эффективное решение — локальные переменные. Можно задать переменную внутри блока селектора, рядом со свойствами. Таким образом, она будет доступна только внутри селектора.

Такой же подход применим и для mixins. Вы можете не только создавать глобальные mixins, но можете также использовать локальные, когда необходимо создать какие-то повторяющиеся действия или элементы внутри компонента. Реальный пример — необходимость пересчитать что-то на каждой breakpoint, но только с другим значением высоты/ширины.

.filters-block {
    $_filter-height: 20px;
    
        @mixin _note-size($value) {
        height: $value;
        line-height: $value;
        margin-top: -($value);
    }
    &__list {
        height: $_filters-height * 7; // Display 7 filters
        overflow: auto;
    }
    &__item {
        height: $_filter-height;
    }
    &__note {
        @include _note-size(30px);
    }
    @media screen and (max-width 1000px) {
        &__note {
            @include _note-size(40px);
        }
    }
}

Еще один момент — всегда пытайтесь вначале создать локальные mixins и переменные в новом компоненте. Это сохраняет инкапсуляцию, а также улучшает читабельность, когда у вас все в одном месте. Делайте их глобальными только в случае, если нужно делиться ими между компонентами.

Для обозначения локальных переменных, я рекомендую использовать нижнее подчеркивание “_” перед названием переменной/mixin, так же как это делается в других языках программирования.

SassScript

SassScript позволяет значително расширить возможности Sass за счет использования пользовательских переменых, арифметических и прочих функций. SassScript может быть использован для автоматической генерации новых селекторов и свойств.

2.1 Переменные в Sass

Это действительно замечательная возможность — определять переменные, которые можно использовать в любом месте вашего Sass файла. Цвета, дефолтные значения, единицы, все это можно взять в переменную и использовать в дальнейшем. Переменная определяется так: $название: значение.

Sass CSS — готовый результат
$accent: #FF9910

.button
	background-color: $accent
	color: #fff
.button {
	background-color: #FF9910;
	color: #fff;
}

2.2 Операции с числами и строками + интерполяция

Sass дает возможность использовать стандартные арифметические операции над числами, такие как сложение (+), вычитание (-), деление (/) и остаток от деления по модулю (%). Операторы сравнения (<, >, <=, >=, ==, !=) также поддерживаются для чисел.

Кроме того, в Sass есть возможность конкатенировать (соединять) строки.

Sass CSS — готовый результат
$summ: 10 + math.div(20, 2)
$cn: content

.selector
	margin:
		top: $summ + px
		bottom: 12px + 8px
	background-color: trans + parent
	#{$cn}: "con" + "tent"
.selector {
	margin-top: 20px;
	margin-bottom: 20px;
	background-color: transparent;
	content: "content";
}

Как видим из примера $summ: 10 + math.div(20, 2), соблюдается приоритет в выполнении арифметических операций — сначала деление, потом сложение. Для определения порядка действий, можно использовать круглые скобки, как в математике

Обратите внимание, что при сложении 12px + 8px, мы получим 20px

Обратите также внимание на строки 2 и 9, здесь мы используем интерполяцию для размещения динамических значений в любом месте Sass файла, в том числе и в месте, где у нас идет название свойства, название селектора или в любой строке. Чаще всего интерполяция в Sass используется для получения нового значения переменной, благодаря «интегрированию» в значение другой переменной, посредством конструкции #{}, например:

Чаще всего интерполяция в Sass используется для получения нового значения переменной, благодаря «интегрированию» в значение другой переменной, посредством конструкции #{}, например:

Sass CSS — готовый результат
$in: интер

.interpol
	content: "#{$in}поляция"
.interpol {
	content: "интерполяция";
}

2.3 Операции с цветами

Цвета в Sass можно складывать, вычетать, делить и умножать. Все арифметические операции выполняются для каждого цвета отдельно: красного, зеленого и синего.

Sass CSS — готовый результат
$color1: color.mix(#440203, #550506)
$color2: color.mix(rgba(180, 0, 0, .75), rgba(20, 255, 0, .75))

body
	background-color: $color1
	color: $color2
body {
	background-color: #990709;
	color: #020406;
	border-color: rgba(200, 255, 0, 0.75);
}
Sass CSS — готовый результат
$translucent-red: rgba(255, 0, 0, 0.5);

p
	color: opacify($translucent-red, 0.3)
	background-color: transparentize($translucent-red, 0.25)

.selector
	background-color: rgba(#333, 0.75)
p {
	color: rgba(255, 0, 0, 0.8);
	background-color: rgba(255, 0, 0, 0.25);
}

.selector {
	background-color: rgba(51, 51, 51, 0.75);
}

Globally Scoped Styles

is the top-level file that knits together all of the global styles. It is imported once at the top-level component.

// app.global.scss@import "reset";@import "graphik-font";@import "typography";@import "body";

I have my Webpack config setup to not use when it encounters a file with the . See the above section “File Extensions” for the Webpack configuration.

The global styles may also take advantage of the reusable styles defined in . For example, inside of , which applies our base font rules on the body, paragraphs, and each heading type, we use from and the color variables defined in .

// sample from _typography.scss@import "./config";h4 {  @extend %graphik-regular;  color: $black;  font-size: rem(16px);  letter-spacing: $base-letter-spacing;  line-height: 1.625;  @media screen and (min-width: $tablet) {    font-size: rem(20px);    line-height: 1.2;  }}

If you look closely, you can see that we are:

  • Extending from a placeholder to apply the font and font weight.
  • Using the variables and .
  • Using an SCSS function to convert to .
  • Using a mixin to simplify creating a breakpoint media query.

Even though this sample is small, it demonstrates how you can take advantage of a lot of the SCSS features to have reusable and configurable styles.

Using SCSS Variables in JS

While building a large web application it sometimes necessary to have a variable defined both within the SCSS and the JS. It may be a set px height, or a percentage, or the number of columns.

allows us to export values from our styles to be consumed by the file on import. It should feel familiar because it is very similar to how we can export things within a JS file.

// myModuleStyles.scss:export {  exportedKey: exportedValue;}

Which is equivalent to:

// myModule.jsmodule.exports = {  "exportedKey": "exportedValue"}

It is important to note that the exported SASS values will be strings, so any exported numbers will need to be parsed inside the JS. To make this easier I like to use an SCSS function to strip off the units from my variables before exporting.

@function remove-px($var) {  @return $var / 1px - 1;}

An example use case in my project for exporting SCSS variables is exporting breakpoint values for use with .

// browser/breakpoints.scss@import "styles/config";:export {  mobile-max-px: remove-px($tablet);  tablet-max-px: remove-px($desktop);  desktop-max-px: remove-px($desktop-big);}

This SCSS file can be imported into JS like any other module.

// browser/breakpoints.jsimport breakpoints from './breakpoints.scss';export const browserBreakpoints = {  mobile: parseInt(breakpoints.mobileMaxPx),  tablet: parseInt(breakpoints.tabletMaxPx),  desktop: parseInt(breakpoints.desktopMaxPx),};

Testing

By default, creates which is a custom Jest transformer that converts style imports into empty objects. This means that in the line would be an empty object regardless of the classes and exports defined in SCSS.

This is pretty annoying when you want a test case that checks if a class name is applied. Even worse, it will flat-out break if you have any JavaScript code that expects something to be exported from the css-module.

If I were to write a test for above, I would need to mock the module. With Jest I can do this fairly easily:

// browser/breakpoints.spec.jsjest.mock('./breakpoints.scss', () => ({  mobileMaxPx: 600,  tabletMaxPx: 800,  desktopMaxPx: 900,}));test('should get the mock mobile value', () => {  expect(browserBreakpoints.mobile).toEqual(600);});

This method would be annoying to do with every style file, so I like to eject the create-react-app config and add , which will mock the modular SCSS by providing a string that matches the className lookups. This means that if a component is applying it will have the class name applied to the DOM element.

This is useful for Jest’s snapshot testing, validating that the correct classes are being applied, and finding a component in a test case.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector