Взглянем на содержимое хотя бы одного из них (пускай это будет
1
main.css
), чтобы убедиться в том, что это уже CSS-файл, а не SCSS-файл:
Да, действительно, перед нами CSS-файл!
Добавление опций к плагину gulp-ruby-sass
До этого момента все плагины, которые мы устанавливали и настраивали в виде задач, были без опций. То есть, в потоке мы просто вызывали плагин через переменную и передавали ему данные для обработки. На этом работа плагина заканчивалась.
Однако внимательный читатель мог уже при первом знакостве с плагинами заметить, что в руководстве почти к каждому из них, помимо описания установки, есть раздел, посвященный опциям данного плагина. Другими словами, плагин может не просто обрабатывать данные, а обрабатывать так, как нам это нужно.
Что касается плагина
1
gulp-ruby-sass
, то данный плагин может производить компиляцию из Sass в CSS несколькими способами. Достаточно почитать раздел API к документации к нему - gulp-ruby-sass.
Мы же воспользуемся всего одной опцией из этого списка и сделаем так, чтобы результат компиляции был более сжатым. Для этого немного изменим созданную ранее задачу
и произвел не просто компиляцию из SCSS в CSS, но и сжатие CSS-файла
1
main.css
- удалены все лишние пробелы и табуляция, выкинуты лишние точки с запятой, а все CSS-правила размещены в одну строку.
Объединение нескольких плагинов в одной задаче
До недавнего момента при работе в Gulp мы всегда поступали таким образом - “один плагин - одна задача”. Однако, Gulp гораздо гибче и мощнее, чем можно было бы подумать. В частности, в одной задаче можно объединить несколько ранее установленных плагинов именно благодаря поточности Gulp.
Чтобы было более понятно, разберем все вышесказанное на живом примере. Дополним задачу
1
sass
плагином конкатенации, чтобы “склеить” два результирующих файла
1
main.css
и
1
style.css
в один файл
1
compile.css
. Как вы уже догадались, для этой цели мы воспользуемся уже установленным ранее плагином
появился по указанному пути. Взглянем на его содержимое в редакторе Sublime Text:
Пример получился не совсем удачный, но, тем не менее, наглядный. Видим, чтобы оба плагина отработали. Была произведена компиляция, а затем “склейка” двух файлов в один.
Конечно, благодаря поточности в Gulp, в одну задачу можно добавлять не два плагина, а гораздо больше.
В предыдущей статье “Gulp - знакомство и первый запуск”” мы познакомились с установкой менеджера Gulp и запуском первой задачи под него. В этой статье мы перейдем к еще более интересному материалу, в котором узнаем, как устанавливать и запускать плагины под Gulp на примере одного из них - gulp-uglify.
Как я уже упоминал ранее, Gulp имеет модульную структуру. Под Gulp, несмотря на молодость проекта, уже написано достаточное количество плагинов. Конечно, оно не сравниться с огромной коллекцией таковых под мега-популярный Grunt, но для большинства случаев жизни уже сейчас их хватит.
Каждый из плагинов - это код, решающий только одну задачу. Например, один плагин умеет сжимать изображения, другой сжимает js-файлы, третий сжимает css-файлы; еще один умеет компилировать scss-файлы в css-файлы. И так далее - список можно продолжать и продолжать.
Становиться понятно, что для конкретной задачи нам нужно установить нужный плагин и создать задачу (task) в файле
1
gulpfile.js
. А затем запустить Gulp на выполнение этой задачи. Конечно, задач может быть не одна, а несколько. Все зависит о того, какие именно задачи нам необходимо выполнять.
Давайте рассмотрим процесс установки плагинов и настройки задач на примере одного из них -
1
gulp-uglify
. Данный плагин служит для минификации js-файлов - он удаляет пробелы, запятые, точки с запятой. В результате js-файл получается меньшим по размеру.
Все плагины под Gulp размещены по этому адресу - Gulp Plugins. В строке поиска нужно вводить имя искомого плагина, в результате получаем (или не получаем) страницу с описанием плагина и командой для его установки.
Устанавливаем gulp-uglify под Gulp
На странице плагина gulp-uglify описана команда установки этого плагина, которую мы повторим для себя, в своем проекте:
именованную задачу (named task) под него. Надеюсь, уважаемый читатель помнит о двух типах задач под Gulp, описанных в предыдущей статье “Gulp - знакомство и первый запуск”.
Открываем файл
1
gulpfile.js
в редакторе кода (у меня это Sublime Text) и вносим туда следующие строки:
В принципе, можно и не вводить вышеприведенные строки вручную, а просто скопировать их со страницы описания плагина gulp-uglify. Они размещены в блоке с заголовком Usage.
Но это не главное. Важнее разобраться, что из себя представляет каждая из этих строк. Так вот, строка
1
uglify = require('gulp-uglify')
- это создание переменной с именем
1
uglify
, в которую помещается плагин
1
gulp-uglify
. Обратите внимание на синтаксис этой строки и ее табуляцию - оба аспекта важны и их несоблюдение приведет к тому, что Gulp не будет работать. По большому счету, можно написать и так -
1
var uglify = require('gulp-uglify');
, но предыдущая запись является более правильной.
Далее идут строки для новой именованной задачи для Gulp. Имя задачи задаем произвольно и пусть оно будет таким -
1
gulp-uglify
. В теле callback-функции пропишем директорию, содержимое которой Gulp должен отслеживать -
1
gulp.src('js/*.js')
. В данном случае указываем, что Gulp должен следить за изменениями всех файлов с расширением .js, расположенных внутри директории
1
js
.
Следующая строка
1
.pipe(uglify())
получает в виде потока содержимое директории
1
js
и обрабатывает его с помощью плагина
1
gulp-uglify
, помещенного внутрь переменной
1
uglify
. Результат обработки передается в виде потока в строку
1
.pipe(gulp.dest('build/js'))
, которая сохраняет его по пути
1
build/js
.
Вот мы и разобрали суть задачи в Gulp! Ведь ничего сложного, правда?!
Запускаем задачу gulp-uglify в Gulp
Переходим от слов к делу и запустим на выполнение только что созданную нами задачу
1
gulp-uglify
. Не забываем, что именованные задачи в Gulp запускаются с указанием их имени:
Вуаля! Видим (по аналогии с предыдушим опытом запуска дефолтной задачи), что именованная задача
1
gulp-uglify
успешно запустилась, выполнилась за 12 миллисекунд и также успешно завершилась. По идее, теперь по пути
1
build/js
у нас должен располагаться минифицированный js-файл (в моем случае это был
1
jquery-1.11.1.js
).
Посмотрим и видим, что так оно и есть, файлик
1
jquery-1.11.1.js
помещен туда, куда мы и прописывали:
$lsbuild/js/jquery-1.11.1.js
А точно ли он минифицированный? Это легко проверить - открываем его в Sublime Text и наблюдаем такую картину:
Полезные плагины под Gulp
Мы успешно установили и запустили плагин под Gulp - можно в очередной раз поздравить себя! В данном случае это был плагин
1
gulp-uglify
для минификации js-файлов.
Однако, как можно догадаться, существует большое количество других полезных плагинов. Все они устанавливаются и настраиваются точно также, как и рассмотренный нами
1
gulp-uglify
.
Ниже я приведу примерный список наиболее полезных плагинов под Gulp, существующих на сегодняшний день:
1
gulp-minify-html
// минификация HTML-файлов
1
gulp-minify-css
// минификация CSS-файлов
1
gulp-csso
// еще один плагин минификации CSS-файлов
1
gulp-uglify
// минификация JS-файлов
1
gulp-sass
// компиляция SCSS-файлов в CSS-файлы
1
gulp-ruby-sass
// компиляции SCSS-файлов в CSS-файлы, более стабильный
1
gulp-concat
// конкатенация (соединение нескольких файлов в один файл)
В этой статье будем знакомиться с новым менеджером задач (task manager) под названием Gulp. Постепенно вместе с вами я пройду весь процесс - от установки Gulp до установки плагинов, создания задач, отслеживания ошибок и еще многое другое.
Но для начала узнаем, что такое Gulp. Это точно такой менеджер задач, как и Grunt. Оба они являются модулями под Node.js и устанавливаются с помощью пакетного менеждера
1
npm
.
Отличие от Grunt в том, что Gulp является переработкой Grunt. Как говорят его разработчики, цель создания была в том, чтобы выбросить из Grunt все лишнее. Кроме того, настройка Gulp значительно упростилась:
На сегодня однозначным преимуществом Gulp перед Grunt является скорость обработки файлов - она в разы выше, чем у старенького Grunt.
Установка Gulp
Установка будет производиться под операционной системой Linux Mint 17 Cinnamon. Поэтому, пользователи Mac OS найдут все нижеприведенные команды абсолютно идентичными для себя. Подразумевается, что в системе уже установлен Node.js и менеджер пакетов npm.
Процесс инсталляции выполняется в два этапа. Первоначально Gulp устанавливается глобально, с помощью ключа
1
-g
. Давайте так и поступим - произведем установку в системе:
Установка завершена и можно переходить к использованию этого менеждера задач.
Первый запуск Gulp
Менеджер задач - само слово говорит за себя, это программа для управления задачами. В Gulp все задачи прописываются в одном единственном файле
1
gulpfile.js
. Первоначально этого файла не существует и его нужно создать самостоятельно, вручную:
$touchgulpfile.js
Затем в нем пропишем первую задачу. Все задачи деляться на два неравнозначных типа: задача по умолчанию (default task) и именованные задачи (named tasks). Разница между ними в том, что задача по умолчанию имеет имя
1
default
, которое можно и не указывать. Кроме того, задача по умолчанию запускается в консоли всего одной командой:
$gulp
В то время как именованная задача (named task) может иметь произвольное имя. Запуск такой задачи в консоли выполняется с указанием имени конкретной задачи:
$gulpname_of_task
Еще один важный момент заключается в том, что этот менеджер задач является потоковым. Что это значит? Не знаю, получиться ли у меня достаточно точно объяснить данный вопрос, но вот линуксоиды, хорошо знакомые с командной строкой, меня должны понять. В консоли Linux (Unix) есть такое понятие, как pipe.
Например, простая команда:
$ls-l|less
… выполняет следующее: результат команды
1
ls -l
перенаправляется для обработки в программу
1
less
. Редактор
1
less
автоматически открывается в консоли с уже готовым для чтения текстом внутри себя.
Чисто схематично такой пример можно усложнить и представить в таком виде:
Каждая из программ в этом списке будет производить обработку данных и передавать результат этой обработки другой программе, по цепочке.
Принцип работы Gulp точно такой же. Только вместо программ в нем используются плагины (я не забыл сказать, что он имеет модульную структуру?):
$plugin1|plugin2|plugin3|plugin4|plugin5|plugin6
Отлично! С теорией закончили и можно снова возвращаться к практике, к нашему файлу настроек
1
gulpfile.js
. Откроем его и пропишем в нем такие строки:
vargulp=require('gulp');gulp.task('default',function(){console.log('Hello from Gulp!')});
Первая строка
1
var gulp = require('gulp');
создает переменную
1
gulp
, в которую помещается сам Gulp. Это необходимо для Node.js, который будет читать файл
1
gulpfile.js
и работать с Gulp в виде переменной
1
gulp
.
Вторая строка, начинающаяся с
1
gulp.task
- это не что иное, как задача. Именно так создаются задачи в этом менеджере. Здесь
1
'default'
- это имя задачи (в данном случае это задача по умолчанию, как вы помните). Функция
1
function()
имеет в своем теле неограниченное количество инструкций. Так как мы еще не умеем работать с плагинами под Gulp, то в качестве инструкции пропишем вывод в консоль обычной текстовой строки -
1
console.log('Hello from Gulp!')
.
Давайте попробуем запустить наш менеджер задач, чтобы посмотреть, а работает ли он вообще? И как он работает? Для этого переходим в консоль и вводим в ней одну единственную команду
Встретил на Google+ упоминание о плагине под jQuery для создания карусели - OWL Carousel.
Попробовал с ним разобраться и посмотреть примеры создания слайдеров на официальной странице. Могу сказать, что я впечатлен данным скриптом и его возможностями. Слайдер адаптивный, имеет множество настроек, обладает хорошими эффектами “из коробки”. Мое личное мнение - отличный выбор для применения на практике!
Официальная страница проекта располагается здесь - OWL Carousel. Стабильная версия скрипта на данный момент -
1
v1.3.2
, но на странице упоминается о версии
1
2.0.0-beta
. Для своей работы плагин требует библиотеки jQuery версии не ниже
1
1.7
.
Ниже я попробую создать простой вариант карусели с помощью плагина OWL Carousel. Более интересные и продвинутые варианты, я думаю, показывать не имеет смысла. По той простой причине, что разобравшись с базовым вариантом, всегда можно его улучшить. И для этой цели как ничто лучше подойдут примеры на официальной странице - Demo и More Demo. Стоит сказать, что для себя я увидел там готовые решения практически на все случаи жизни.
Подключение OWL Carousel
Для подключения плагина OWL Carousel к готовому проекту необходимо получить архив плагина с официальной страницы - OWL Carousel или с GitHub - OwlCarousel. В архиве имеется все, что необходимо - библиотека jQuery, плагин
1
owl.carousel.min.js
, готовые CSS-стили для карусели. Ничего сложного или необычного в подключении плагина OWL Carousel нет - все стандартно.
HTML-разметка и подключение скрипта будут выглядеть следующим образом:
- опциональная, для настройки плагина под конкретные условия.
Тип HTML-элементов для создания разметки слайдера, по большому счету, не имеет особого значения, так как скрипт OWL Carousel умеет работать со всеми типами. Главное, чтобы у блока-обертки имелся обязательный класс
1
owl-carousel
, к которому будет производиться привязка стилей из файла
1
owl.carousel.css
.
В конце тела
1
body
документа подключаются библиотека jQuery, скрипт плагина OWL Carousel и файл настроек данного скрипта.
Все, можно смотреть на готовый (слегка подредактированный) результат:
Настройка плагина OWL Carousel
Скрипт OWL Carousel имеет большое количество настроек, которые добавляются или убираются в файле настроек. Ссылка на страницу с полным списком настроек располагается здесь - Customizing OWL Carousel.
К примеру, переменная
1
items
задает количество одновременно показываемых в слайдере изображений:
items:5
Переменные
1
itemsDesktopSmall
,
1
itemsTablet
,
1
itemsTabletSmall
,
1
itemsMobile
устанавливают количество одновременно отображаемых изображений в зависимости от размера окна браузера. Например, запись вида
1
itemsDesktop: [1199,4]
“говорит” браузеру, что при размере окна меньше или равному 1199px следует отображать одновременно только четыре изображения:
itemsDesktop:[1199,4]
Переменная
1
singleItem
устанавливает, отображать ли только одно изображение в слайдере или несколько:
singleItem:false
Переменные
1
navigation
и
1
pagination
управляют возможностью включения или выключения навигации\пагинации у слайдера:
navigation:true,pagination:true
Автоматическая прокрутка изображений в слайдере включается с помощью переменной
1
autoPlay
:
autoPlay:true
Имеются множество других настроек плагина OWL Carousel, с которыми можно легко разобраться на официальной странице. Все перечислять здесь я не буду.
Варианты слайдера OWL Carousel
Стоит “побродить” по странице с демонстрационными примерами работы плагина OWL Carousel. Там есть на что посмотреть и что подобрать для себя.
Наиболее интересные (для меня) примеры расположены в списке со ссылками.
К примеру, по ссылке CSS3 Transitions располагается образец слайдера с эффектом перехода, основанном на CSS3-свойстве transition. Более того, из выпадающего списка можно прямо на странице подобрать себе подходящий эффект - своеобразный конструктор получается:
Или пример создания слайдера с расположенной вверху полосой progress bar - Progress Bar.
Заключение
Плагин OWL Carousel мне понравился и я буду стараться применять его на практике, при верстке страниц.
В этой статье будет детально рассмотрен вопрос создания фигуры шестиугольника (hexagon) на CSS.
Материал целиком основан на замечательной статье CSS Hexagon Tutorial. В Сети имеется хорошая статья по примерам создания различных видов фигур на CSS, и располагается эта статья на блоге известного CSS-гуру Chris Coyier Shapes of CSS. Среди прочих фигур там есть и желанный шестиугольник
1
hexagon
с готовым CSS-кодом что называется, “бери и пользуйся”.
Но ведь такой подход для нас не интересен, правда? Это потом, когда мы изучим вопрос создания шестиугольника, мы будем делать так - нашел готовый код, скопировал к себе, подредактировал и готово! А сейчас мы пошагово пройдем весь путь, от начала и до конца - это даст нам понимание процесса.
Как будем строить hexagon
Фигура hexagon изначально кажется неприступной - не понятно, с какого боку к ней подойди, чтобы начать постороение шестиугольника на CSS. Однако, если внимательно присмотреться, то hexagon можно разделить на три простые фигуры:
Видно, что фигура состоит из двух одинаковых треугольников и одного прямоугольника. Построение треугольников на CSS выполняется очень просто - “CSS – почему треугольник это треугольник”, прямоугольника - вообще в два движения.
Поэтому, построение шестиугольника hexagon на CSS сводится к двух задачам:
создать два треугольника
создать один прямоугольник
Построение треугольников на CSS
Задачу создания треугольников на CSS начнем с построения обычного квадрата со стороной в
У получившегося треугольника все стороны равны - высота и ширина по 30px каждая. Нам же необходимо “растянуть” треугольник в ширину, чтобы он у него появился тупой угол. Для этого нужно увеличить ширину боковых границ
Задача создания треугольника нами выполнена. Теперь необходимо получить точно такой треугольник, только “направленный” вниз. Это просто - достаточно поменять нулевое значение между верхней и нижней границей фигуры. Все остальные значения останутся неизменными. Чуть не забыл сказать, что для “повернутого” треугольника придется создать в HTML-коде новый блок:
Первый шаг по созданию шестиугольника hexagon на CSS выполнен - у нас есть два одинаковых разнонаправленных треугольника. Теперь нужно создать “тело” для шестиугольника - прямоугольник.
Построение прямоугольника на CSS
Для создания прямоугольника на CSS достаточно прописать для нового блока три величины - высоту, ширину и фоновый цвет. Новый блок я размещу между двумя блоками-треугольниками.
А вот с размерами для прямоугольника нужно разобраться немного подробнее. У него ширина должна быть равна удвоенной ширине боковой границы треугольника:
Все - задача построения шестиугольника hexagon на CSS выполнена - все оказалось достаточно просто!
Создание сетки из hexagon
Теперь можно усложнить задачу и создать из фигур hexagon своеобразную сетку, а-ля пчелиные соты. Задача тривиальная и весь вопрос сводиться к нескольким CSS-свойствам:
1
float
,
1
overflow
,
1
margin
,
1
padding
.
Создаю первый ряд сетки:
<divclass="row"><divclass="hexa"><divclass="hexagon hexagon_colors hexagon_zero hexagon_triangle_up hexagon_triangle_up_large"></div><divclass="inside"></div><divclass="hexagon hexagon_colors hexagon_zero hexagon_triangle_down hexagon_triangle_down_large"></div></div><!-- end hexa --><divclass="hexa"><divclass="hexagon hexagon_colors hexagon_zero hexagon_triangle_up hexagon_triangle_up_large"></div><divclass="inside"></div><divclass="hexagon hexagon_colors hexagon_zero hexagon_triangle_down hexagon_triangle_down_large"></div></div><!-- end hexa --><divclass="hexa"><divclass="hexagon hexagon_colors hexagon_zero hexagon_triangle_up hexagon_triangle_up_large"></div><divclass="inside"></div><divclass="hexagon hexagon_colors hexagon_zero hexagon_triangle_down hexagon_triangle_down_large"></div></div><!-- end hexa --><divclass="hexa"><divclass="hexagon hexagon_colors hexagon_zero hexagon_triangle_up hexagon_triangle_up_large"></div><divclass="inside"></div><divclass="hexagon hexagon_colors hexagon_zero hexagon_triangle_down hexagon_triangle_down_large"></div></div><!-- end hexa --><divclass="hexa"><divclass="hexagon hexagon_colors hexagon_zero hexagon_triangle_up hexagon_triangle_up_large"></div><divclass="inside"></div><divclass="hexagon hexagon_colors hexagon_zero hexagon_triangle_down hexagon_triangle_down_large"></div></div><!-- end hexa --></div><!-- end row -->
Дальше продолжать не имеет смысла - все остальные ряды строятся аналогично. Нужно только управлять ими с помощью соотвествующих классов, смещая влево или вверх:
Лучше перейдем к другому интересному вопросу - созданию такого же шестиугольника hexagon, но несколько иной формы, “повернутого”. У которого углы развернуты по-горизонтали, а не по-вертикали.
Построение повернутого hexagon на CSS
Задача создания развернутого hexagon почти ничем не отличается от задачи построения обычного шестиугольника. Только потребуется несколько дополнительных строчек кода.
Дело в том, что в этом случае нужны углы, которые будут располагаться горизонтально и “смотреть” влево или вправо. Помимо этого, понадобиться “плавание” влево
1
float: left;
.
Для блока - “тела” hexagon нужно будет изменить значения высоты или ширины на прямопротивоположные.
/* LEFT ARROW */.hexagon_triangle_left{border-left-width:0;border-top-color:transparent;border-bottom-color:transparent;}.hexagon_triangle_left_large{border-top-width:52px;border-bottom-width:52px;}/* RIGHT ARROW */.hexagon_triangle_right{border-right-width:0;border-top-color:transparent;border-bottom-color:transparent;}.hexagon_triangle_right_large{border-top-width:52px;border-bottom-width:52px;}.inside_rotate{width:60px;height:104px;background-color:#778899;}.left{float:left;}
Добавлю несколько таких шестиугольников, чтобы получился полный ряд:
Отлично! Теперь нужно добавить еще один ряд - нижний. При этом опять придется немного модифицировать код, чтобы произвести смещение фигур влево и вверх:
Рассмотренный выше способ создания hexagons хорош, но имеет один недостаток - слишком много дополнительных блоков, одними из которых являются блоки для создания треугольников.
Можно (и нужно) значительно сократить код, воспользовавшись для этой цели псевдо-классами
1
:before
и
1
:after
. Давайте я так и поступлю, при этом возьму код из примера, не буду ничего выдумывать:
Рассмотренный выше способ неплох, причем оба его варианта. Но для практического применения оба они достаточно трудоемкие. В Сети, помимо многих других подобного рода, имеется online CSS-генератор для создания hexagon в считанные минуты.
Адрес сервиса располагается здесь - CSS Hexagon. Помимо создания самого hexagon, там можно “прикрутить” к фигуре тень и границу, что просто великолепно!