Краткий обзор плагина Sass CSS Importer для импортирования файлов CSS в файлы Sass.
В чем заключается вопрос? Как хорошо известно всем, кто постоянно работает с Sass, с помощью директивы
1
@import
можно подключать одни Sass-файлы в другие Sass-файлы.
Например, подключить файл
1
typography.scss
в файл
1
main.scss
можно так:
Оба файла
1
main.scss
и
1
typography.scss
будут объединены препроцессором в один файл
1
main.scss
, который уже будет компилироваться в файл
1
main.css
.
Знак подчеркивания в данном случае является дополнительной опцией. Этим знаком препроцессору Sass указывается не выполнять предварительную компиляцию файла
1
typography.scss
в файл
1
typography.css
перед его подключением в
1
main.scss
.
Но что, если стоит задача подключения файлов формата CSS в файлы формата Sass? Директива
1
@import
в этом случае помочь не может. CSS-файл нельзя просто так подключить в Sass-файл.
Задача подключения CSS-файлов в Sass-файлы наиболее часто может возникнуть в случае использования различных готовых слайдеров или каруселей, которые зачастую идут “в комплекте” с минимальными правилами на CSS. Что же делать?
Плагин Sass CSS Importer
Совсем недавно (17 июля сего года) Chris Eppstein выпустил специальный плагин, задачей которого и является импортирование CSS-файлов в Sass-файлы. Страничка с официальной документацией по плагину Sass CSS Importer расположена на GitHub - Sass CSS Importer Plugin.
Там все описано кратко и предельно ясно. Однако, я был так доволен тем фактом, что теперь могу свободно подключать CSS в Sass, что решил потратить часть своего времени, чтобы описать его своими словами, по-русски.
Установка Sass CSS Importer
Установка плагина выполняется как обычно, через менеджер пакетов
1
gem
:
Подключение Sass CSS Importer
При использовании фреймворка Compass нужно добавить строку в конфигурационный файл
1
config.rb
своего текущего проекта:
Импортирование CSS в Sass
Теперь, чтобы импортировать CSS в Sass, нужно воспользоваться все той же директивой
1
@import
, но со специальным синтаксисом.
В общем случае этот синтаксис выглядит таким образом:
В частном случае синтаксис будет выглядеть таким образом:
Обратите внимание на важный момент: имя CSS-файла нужно указывать без расширения!
Можно запустить процесс компиляции через командную строку:
… и проверить, что CSS-файл будет включен в общий вывод:
Заключение
В принципе, вот и все, что можно сказать о Sass CSS Importer.
Препроцессор Sass предоставляет несколько способов создания одного фрагмента кода, который будет многократно использоваться внутри CSS-кода.
Например, можно воспользоваться миксинами (
1
mixins
) для вставки группы CSS-свойств (или CSS-правил) в CSS-коде.
Или же использовать директиву
1
@extend
для расширения набора CSS-свойств одного HTML-элемента за счет CSS-свойств другого HTML-элемента.
В Sass версии 3.2 введена новая концепция под названием
1
placeholder
, которая делает использование директивы
1
@extend
еще более эффективным способом.
Но прежде чем мы перейдем к рассмотрению этого нововведенния, давайте остановимся на моменте, каким образом работает расширение (
1
@extend
) CSS-свойств в Sass.
Как работает @extend
Директива
1
@extend
в препроцессоре Sass позволяет CSS-селекторам с легкостью обмениваться между собой своими CSS-свойствами. Лучше всего вышесказанное можно проиллюстрировать на живом примере:
Результатом компиляции этого SCSS-кода в CSS-код будет следующий фрагмент:
Рассмотрим “механизм” показанного выше примера более детально. В нем директива
1
@extend
играет ключевую роль. С помощью нее селекторы
1
.error-icon
и
1
.info-icon
наследуют свойства селектора
1
.icon
. При изменении CSS-свойств селектора
1
.icon
автоматически будут меняться свойства селекторов
1
.error-icon
и
1
.info-icon
, так как они наследуют определенный набор CSS-свойств у селектора
1
.icon
. Довольно изящный подход, не правда ли?
А вот теперь наступает интересный момент. Что, если элемент с классом
1
.icon
не планируется использовать и он даже не будет присутствовать в HTML-разметке? Но CSS-свойства этого элемента нам нужны для стилизации элементов
1
.error-icon
и
1
.info-icon
.
Получается, что результирующий CSS-код будет неоправданно раздут из-за того, что в нем присутствует “лишний” элемент, который напрямую никогда не будет использован.
И тут наступает момент для выхода на сцену героя этой статьи - селектора
1
placeholder
(его еще называют “тихим”
1
placeholder
‘ом):
Знакомимся с селектором placeholder
Селекторы
1
placeholder
были введены в Sass как раз для того, чтобы решать вышеназванную проблему. Синтаксис
1
placeholder
очень похож на синтаксис обычных CSS-классов, только вместо точки (
1
.
) перед именем ставиться символ процента
1
%
.
Селекторы
1
placeholder
имеют одну специфичную для них особенность - они никак не проявляют себя в скомпилированном CSS-коде. Можно сказать по другому - вы никогда не найдете селекторов
1
placeholder
в результирующем CSS-коде (поэтому они и носят такое название - “тихие”
1
placeholder
). В скомпилированном CSS-коде будут только селекторы, которые используют “тихие”
1
placeholder
‘ы, но никак не сами “тихие”
1
placeholder
‘ы.
Вернемся назад, к нашему начальному примеру. Заменим в нем имя класса
1
.icon
на имя “тихого” placeholder’а -
1
%icon
:
В результате скомпилированный CSS-код будет выглядеть таким образом:
Обратите внимание на важный момент - класс
1
.icon
теперь не присутствует в результирующем CSS-коде! Его там нет!
@extend или @include
На первый взгляд может показаться, что “тихие”
1
placeholder
- это почти тоже самое, что и миксины (
1
mixin
). С функциональной точки зрения такое утверждение абсолютно верно - результат в браузере получается идентичным. А вот с точки зрения CSS разница очень существенная!
Давайте снова изменим наш первоначальный пример и теперь воспользуемся миксином
1
@mixin icon
:
Посмотрим на сгенерированный CSS-код:
С точки зрения разработки данный пример ничем не хуже примера с использованием “тихого”
1
placeholder
‘а.
Но обратите внимание на тот факт, что CSS-правила
1
transition: background-color ease .2s;
и
1
margin: 0 .5em;
дублируются между селекторами
1
.error-icon
и
1
.info-icon
, что приводит к неоправданному раздутию кода. В случае использования “тихого”
1
placeholder
этого не происходит.
Ограничения
Использование директивы
1
@extend
имеет одно ограничение, связанное с тем, что применение “тихих”
1
placeholder
‘ов никак не оправдывает себя в медиа-запросах
1
@media
.
Рассмотрим такой пример:
Видим, что в данном случае “тихий”
1
placeholder
добавлен для селекторов, находящихся внутри медиа-запроса
1
@media
.
Однако, при попытке компиляции этого SCSS-кода в CSS-код получиться ошибка:
You may not @extend an outer selector from within @media. You may only @extend selectors within the same directive. From “@extend %icon” on line 8 of icons.scss
Когда я первый раз увидел такую ошибку, то подумал, что это баг. Но по зрелом размышлении пришел к выводу, что в данном подходе все правильно.
Механизм работы директивы
1
@extend
основан на добавлении одного селектора к другому селектору без необходимости дублировать CSS-свойства этих селекторов. Однако невозможно объединять селекторы, находящиеся в разных медиа-запросах
1
@media
.
Но можно поступить по другому, чтобы выйти из данной затруднительной ситуации. Любой медиа-запрос, который служит оберткой для “тихого”
1
placeholder
, распространяют свои свойства на селекторы, не размещенные внутри этого запроса.
Выражение достаточно запутанное, поэтому лучше приведу пример:
Компиляция пройдет без ошибок и ее результатом будет CSS-код:
Заключение
Обе директивы
1
@extend
и
1
@include
являются очень полезными инструментами, между которыми существует тонкое различие. Если вопрос производительности генерируемого CSS-кода имеет для вас важное значение или же перед вами стоит проблема повторяемости кода, то решением будет являться директива
1
@extend
. В некоторых случая
1
@extend
значительно упрощает получаемый CSS-код и улучшает его производительность.
Конечно же, ничто не мешает вам смешивать между собой директиву
1
@extend
и миксин
1
mixin
(если этого требуют обстоятельства):
Однако, в разработке я придерживаюсь такого подхода, когда исходный код легко читается и поддерживается.
В этом посте поделюсь своим опытом реализации задачи компиляции jade-файлов в HTML-формат.
Рассмотрю два способа реализации этой задачи. Первый - самый нативный, с помощью родной утилиты
1
jade
. Второй - с помощью плагина
1
gulp-jade
под Gulp.
Но способов компиляции Jade в HTML существует больше - есть плагин под Sublime Text, существует плагин под Grunt. Обладатели Mac OS X могут воспользоваться прекрасной программой CodeKit. И я уверен, что это только малая часть того, чем можно воспользоваться.
Кратко остановлюсь на вопросе, зачем мне понадобился Jade. Честно сказать, до недавнего момента я даже не подозревал о сущестовании такого шаблонизатора. Тихо-спокойно пользовался Sublime Text + Emmet и считал, что я на вершине современных требований к web-разработчику.
Однако это оказалось не совсем так. Мне посоветовали посмотреть в сторону Jade и разобраться с работой в нем. Хотя бы с синтаксисом, для начала.
И я скажу вам - мне понравилось! Даже простое использование синтаксиса. Первое впечатление и ощущение - использование этого шаблонизатора освобождает от рамок HTML при написании кода. Точнее - при создании кода сосредотачиваешься на содержимом, которое создаешь.
Но у Jade есть еще и миксины, с которыми мне предстоит познакомиться. Так что - лучшее только впереди!
Написание кода в этом шаблонизаторе чем-то похоже на написание текста в Markdown. Под Markdown имеются (и должны иметься) утилиты\программы для компиляции в HTML. Точно также для Jade должны иметься (и имеются) утилиты\программы для компиляции в HTML.
Jade - синтаксис для Sublime Text
Прежде чем писать код в редакторе, в моем случае необходимо настроить поддержку синтаксиса Jade. Я использую Sublime Text 3, который изначально не имеет таковой.
Исправить это легко - достаточно через
1
Package Control
установить пакет
1
Jade
. Помимо подсветки синтаксиса, появиться поддержка автоматической табуляции, что значительно упрощает процесс написания кода.
Пример подсветки синтаксиса Jade в Sublime Text:
Jade - родная утилита шаблонизатора
Разработчиками была создана родная утилита для преобразования jade-файлов в HTML-файлы. Имя утилиты легко запомнить - это
1
jade
.
Утилита является модулем под Node.js, поэтому последний у вас должен быть заранее установлен (если еще не установлен по какой-то необъяснимой причине).
Инсталляция утилиты производиться банально:
Утилита имеет немногочисленные параметры, с кратким описанием которых можно ознакомиться на странице официальной документации - Jade - Command Line.
Но стоит обратить внимание на некоторые интересные параметры:
К примеру:
1
-P, --pretty
- создание “удобочитаемого” HTML-кода
1
-w, --watch
- мониторинг изменений файлов
Использование утилиты также является простым делом. К примеру, можно указать ей производить компиляцию всех файлов в директории
1
templates
:
Утилита может сама создавать jade-файлы:
Или же можно реализовать два способа вывода:
Или же осуществить рендеринг двух директорий
1
foo
и
1
bar
в директорию
1
tmp
:
Gulp-jade - компиляция под Gulp
Кто знаком с task-manager’ом Gulp, тот может воспользоваться соответствующим плагином
1
gulp-jade
под него. Страничка плагина размещена здесь - gulp-jade.
Установка плагина стандартная:
Затем нужно создать задачу (task) для компиляции jade-файлов в HTML-файлы. Ниже приведу свой рабочий task:
В Сети есть еще один интересный Gulp-task. Работоспособность его не проверял, взял как есть, для - “чтобы было”.
Как говориться на странице-оригинале, эта задача производит компиляцию файлов из директории
1
app/
в директорию
1
_public/
:
Заключение
Я запомнил (записал для себя), а вы (уважаемый читатель) познакомились (если не знали) с двумя способами настройки компиляции jade-файлов в HTML-файлы.
Одним из наиболее обсуждаемых трендов в web-дизайне последние несколько лет является эффект
1
parallax scrolling
. Нравиться он вам или нет, но этот эффект сегодня применяется на очень многих сайтах. В этой статье будет дано краткое описание принципа
1
parallax scrolling
и будет показано, как применить этот эффект на странице с помощью jQuery-плагина под названием Stellar.js.
Что такое parallax scrolling
Основная идея parallax scrolling заключается в том, что при прокрутке страницы вниз фоновое изображение движется с меньшей скоростью, нежели содержимое страницы. Таким образом создается иллюзия 3D на странице. Этот эффект является прекрасным дополнением к web-странице, однако он становиться навязчивым при чрезмерном злоупотреблении им. Время от времени вы встречаете на просторах Сети сайты, перегруженные подобными эффектами. И вам не всегда может такое понравиться. Потому что в основном при реализации такого эффекта используется анимация фоновых изображений, что значительно увеличивает вес страницы, в результате чего она очень медленно загружается в браузере.
Примерами сайтов со злоупотреблением таких эффектов, на мой взгляд, могут послужить Saucony Kinavara 3 и Oakley Airbrake MX. Первый сайт “весит” 50Mb(!), второй сайт - около 20Mb.
Теперь, когда вы имеете представление о том, как на деле выглядит эффект parallax scrolling, давайте попробуем реализовать его с помощью плагина Stellar.js.
Что такое Stellar.js
Stellar.js - это jQuery-плагин, с помощью которого можно легко реализовать эффект parallax scrolling на web-странице. Несмотря на то, что этот плагин уже не поддерживается разработчиком, он все еще остается очень надежным, совместим с самыми последними версиями библиотеки jQuery и часто применяется web-разработчиками в проектах (что является показателем). Stellar.js в списке популярных плагинов The jQuery Plugin Registry находится на высших позициях, поэтому вы наверняка о нем слышали или же читали упоминание о нем.
Отлично, вкратце мы познакомились, что такое Stellar.js и можно приступать к процессу создания parallax scrolling на странице с его помощью.
Stellar.js - начинаем работу
Начать работать с плагином Stellar.js очень просто. Для начала нужно скачать этот плагин и подключить к странице. Получить плагин Stellar.js можно двумя способами - из Git-репозитория или с помощью менеджера пакетов Bower. Если остановится на использовании Bower, то в консоли нужно набрать такую команду:
Когда плагин Stellar.js получен любым из вышеописанных способов, необходимо подключить его к странице как обычно.
После подключения плагина Stellar.js все готово для того, чтобы применить эффект
1
parallax scrolling
на странице. Этот плагин позволяет применить данный эффект к любому scrolling-элементу на странице, будь то объект
1
window
или любой другой. Для этого нужно выполнить выборку нужного элемента с помощью jQuery, а затем применить к выбранному элементу метод
1
stellar()
.
Самый простой пример применения плагина Stellar.js к объекту показан ниже:
Для объекта
1
window
можно использовать и более краткий синтаксис вышеприведенного примера:
В этом коде производится поиск фоновых изображений или элементов, к которым применяется эффект
1
parallax
; и для этих элементов выполняется пересчет их расположения на web-странице при ее прокрутке.
Если вам хочется взглянуть хотя бы на один готовый пример страницы с
Stellar.js, как и большинство других плагинов подобного рода, достаточно гибок в настройке. В нем есть несколько параметров, с помощью которых можно задать нужный вариант работы. В Stellar.js все настройки делятся на два типа - глобальные (оказывают влияние на все элементы) и локальные, имеющие отношение только к конкретному элементу.
Глобальные настройки передаются методу
1
stellar()
в качестве аргументов, в момент вызова этого метода. Специфичные для элемента настройки передаются в виде
1
data-*
-атрибутов. В этом разделе статьи я не буду подробно останавливаться на рассмотрении всех возможных параметров плагина Stellar.js. Если у вас возникнет желание детально ознакомиться с ними, то можно обратиться к разделу, посвященному этому вопросу - Configuring Everything.
Одной из основных настроек плагина, которая может понадобиться в первую очередь, является выбор направления, в котором будет осуществляться эффект. Классическим вариантом
1
parallax scrolling
является направление
1
parallax
по вертикали - сверху вниз или же наоборот. Однако, с помощью настроек можно задать parallax по горизонтали - слева направо и наоборот. И даже можно задать сразу два направления - по вертикали и по горизонтали. Для управления направлением
1
parallax
в плагине Stellar.js имеются два параметра Boolean-типа:
1
horizontalScrolling
- для управления parallax по горизонтали
1
verticalScrolling
- для управления parallax по вертикали
По умолчанию оба параметра имеют значение
1
true
.
Другим интересным параметров плагина Stellar.js является
1
responsive
. Данная настройка отвечается за возможность обновления содержимого блока с эффектом parallax при наступлении событий
1
load
и
1
resize
объекта
1
window
. Значением по умолчанию является
1
false
.
Последним (достойным внимания) глобальным параметром плагина Stellar.js является
1
hideDistantElements
. Значением по умолчанию этого параметра является
1
true
. Данный параметр отвечает за эффект скрытия объекта в том случае, когда он выходит на границы viewport. Если такое поведение вам не нужно, то можно поставить значение
1
hideDistantElements
в
1
false
.
Единственным специфичным для элемента параметром плагина Stellar.js, о котором я расскажу в этой статье, является
1
data-stellar-background-ratio
. Расскажу только потому, что он используется очень часто при работе с плагином Stellar.js. Параметр принимает в качестве значения положительное число и управляет скоростью parallax для выбранного элемента.
Например,
1
data-stellar-background-ratio="0.5"
означает, что скорость перемещения элемента при scrolling будет в два раза меньше обычной. Если вы будете использовать данный параметр со значением, меньшим 1, то, согласно документации, для элемента с parallax необходимо применить CSS-правило
1
background-attachment: fixed;
.
Теперь, когда мы познакомились с плагином Stellar.js и научились управлять им с помощью параметров, самое время посмотреть его в действии.
Demo
В этом разделе статьи мы создадим пример кода, в котором применим плагин Stellar.js и настроим его с помощью параметров, рассмотренных ранее. Первым делом нам понадобиться HTML-разметка. Для этого создадим шесть блоков
1
div
, внутри которых будет содержаться некоторый текст:
Для представленной выше HTML-разметки необходимо написать некоторые CSS-стили для задания фоновых изображений. В нашем примере будут использоваться три изображения, при этом каждое из них будет использоваться дважды. Так как к последним трем блокам
1
div
применен атрибут
1
data-stellar-background-ratio
, то в CSS-стилях также необходимо прописать правило
1
background-attachment: fixed;
.
Финальный вариант CSS-кода будет выглядеть таким образом:
Последний шаг, который нужно выполнить, это запустить эффект, вызвав метод
1
stellar()
. Этому методу также передадим несколько аргументов:
Заключение
В данной статье был рассмотрен плагин Stellar.js для создания эффекта parallax на web-странице. Мною не были рассмотрены все настройки и возможности этого плагина. Но целью этой статьи было заинтересовать читателей плагином Stellar.js для того, чтобы продолжить его изучение самостоятельно.
Что вы думаете о плагине Stellar.js? Вы слышали о таком или же используете его давно?
Краткая статья, посвященная тому же вопросу - как реализовать кросс-браузерную поддержку SVG в браузерах.
В предыдущей статье “SVG fallback с помощью PNG” было показано четыре очень интересных способа реализации такой задачи. В этой статье будут показаны также несколько способов решения, но уже с помощью библиотеки jQuery .
В начале статьи автор рассказывает о преимуществах использования формата графики SVG. Думаю, что многие уже устали читать деферамбы о пользе SVG. Мне, как переводчику, тем более надоело переводить всю эту “воду”, поэтому смело ее опускаю и перехожу к главному.
jQuery и Modernizr
Для реализации этого способа понадобиться библиотека Modernizr. Код реализации должен выглядеть таким образом:
Если Modernizr обнаружит, что пользовательский браузер не поддерживает SVG, то запуститься простой jQuery-скрипт, который произведет замену расширения
1
svg
на
1
png
у всех файлов-изображений:
Данный способ имет точно такие же ограничения, что и скрипт из предыдущей статьи - “SVG fallback с помощью PNG”. То есть, нужно иметь два комплекта файлов - один в SVG-формате, другой в PNG-формате. Имена файлов должны быть идентичными.
SVGMagic - плагин под jQuery
SVGMagic - это простой плагин под библиотеку jQuery, который отыскивает в HTML-документе все SVG-изображения (в том числе и фоновые SVG-изображения). А затем им создаются PNG-копии всех найденных SVG-изображений, если браузер пользователя не поддерживает SVG.
Для работы с плагином SVGMagic достаточно установить его в проект и запустить инициализацию через jQuery:
Работа плагина SVGMagic строится следующим образом. Проверяется возможность браузером пользователя отображения SVG-изображений. Если такой поддержки нет, то плагин выполняет полную проверку всего HTML-документа и собирает коллекцию всех URL на SVG-файлы, размещенные внутри этого документа.
Затем эта коллекция URL отправляется на сервер плагина. Сервер производит скачивание всех SVG-изображений по этим URL. Затем производиться конвертирование SVG в PNG.
На страницу клиента отправляется новая коллекция URL, которые теперь указывают на файлы формата PNG. Браузер посетителя загружает по этим ссылкам новые PNG-файлы и внешний вид страницы не нарушается.
SVGeezy - еще один плагин jQuery
SVGeezy является fallback-плагином в полном смысле этого слова. Плагин проверяет поддержку SVG в браузере пользователя. Если таковой нет, то выполняется замена значения в атрибуте
1
src
на то, в котором указывается на путь PNG-файла.
Для работы с плагином нужно подключить его в проект и инициализировать:
Первый параметр плагина SVGeezy “говорит” ему - не выполнять или выполнять проверку. Если необходима проверка плагином SVGeezy браузера и замена изображений, то нужно оставить значение в
1
false
. Этот параметр может понадобиться в случае, когда нет необходимости в работе плагина на каких-то страницах.
Второй параметр - это тип файла, который будет заменять SVG на странице. Тип файла может быть любым; только нужно удостовериться, что файлы с таким расширением существуют.
Например, файл по пути
1
/images/logo.svg
будет заменен файлом по пути
1
/images/logo.png
.
На этом самая интересная часть статьи “How to fallback to PNG if SVG not supported?” завершается. Как лично мне кажется, в данной статье заслуживают внимания только первый и последний способы реализации SVG fallback.