Advertisement
  1. Web Design
  2. Sass

Готовим вкусные Sass миксины

Scroll to top
Read Time: 13 min

() translation by (you can also view the original English article)

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

Картинка превью иконки: hand mix egg с PhotoDune.

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


Я использую Sass во время фронтенд разработки уже больше года и миксины я стал использовать с самого начала. Сразу заметив, что время, которое я трачу на написание таблиц стилей, значительно уменьшилось, не важно с насколько большим проектом я работаю. Но что же такое миксины? Информация с Sass веб-сайта:

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

Взгляните на это с другого угла, миксины - генераторы кода. Вы создаёте миксин в Sass таблице стилей, используя директиву @mixin, указываете правила CSS, которые данный миксин должен добавлять, затем вызываете их в объявлении, каждый раз когда вы хотите использовать данные правила. В основном, я использую миксины для добавления функционала CSS3, к примеру box-shadows, text-shadows и border-radius. Большинство из этих свойств не полностью поддерживаются и для работы во всех браузерах требуют вендорных префиксов, таких как -webkit-, -moz-, -ms-, -o-. Вместо того, чтобы писать пять правил каждый раз, когда мне нужно воспользоваться функционалом CSS3, я могу вызвать миксин, который занимает одну строку, после чего будет создан необходимый CSS.


Шаг 1: Убедитесь, что на вашем компьютере установлен Ruby

Для начала откройте терминал (командную строку на Windows) и убедитесь, что у вас установлен Ruby, далее поставьте гем Sass. Терминал можно найти следующим образом:

  • Mac OS X: Программы > Утлиты > Терминал
  • Linux: Приложения > Стандартные > Терминал
  • Windows: Старт > Командная строка

После того как терминал будет открыт, введите следующую команду, чтобы убедиться, что Ruby установлен. Не нужно писать знак доллара - это ваш плейсхолдер.

1
$ which ruby

Вам должна отобразится информация о пути /usr/local/bin или сообщение об ошибке, если Ruby не установлен. Вот вывод моего OS X терминала:

Terminal output for which ruby commandTerminal output for which ruby commandTerminal output for which ruby command

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


Шаг 2: Установите гем Sass

После того, как вы проверили или установили язык Ruby, установка Sass не вызовет сложностей. В терминале введите команду: $ gem install sass. Если у вас нет подходящих прав, необходимо запустить команду с sudo (Super User Do), вот так: $ sudo gem install sass. Через несколько секунд, вы должны увидеть вывод подобно скриншоту ниже.

Terminal output for Sass gem installationTerminal output for Sass gem installationTerminal output for Sass gem installation


Шаг 3: Скачайте и установите LiveRealod

Вам не нужно приложение для компиляции на подобии, LiveRealod, Compass или CodeKit, чтобы скомпилировать Sass в обычный CSS, однако с ними знакомство с препроцессором будет гораздо проще. CodeKit только для OS X, LiveRealod в основном для OS X, есть бета версия для Windows; Compass работает на OS X, Windows и Linux. Лицензия стоит от $10 до $25 на момент написания статьи, но это стоит того, в том случае если вы часто используете Sass во время разработки.

Стоит упомянуть, что Sass бывает двух типов .sass и .scss. Не буду вдаваться в подробности, я использую .scss синтаксис, так как он больше напоминает обычный CSS и компилируется без проблем.

После того, как вы настроили компилятор, вам следует настроить рабочие директории с HTML и CSS файлами. Для этого туториала, я создал простой пример под названием Write Your Own Sass Mixins. Ниже можно увидеть файловую структуру, о которой будет идти речь в данной статье. Если вы до сих пор не скачали файлы с исходниками, пожалуйста сделайте это и добавьте Museo Sans и Droid Serif файлы в директорию /fonts. Данные шрифты необходимы для некоторых миксинов, которые будут созданы позднее в данном туториале.

1
Write Your Own Sass Mixins
2
index.html
3
/css (directory)
4
/fonts (directory)
5
/scss (directory)
6
|-- main.scss

Так как я выбрал LiveReload, мы настроим его, чтобы он следил за изменениями и компилировал scss в CSS. Кода будет запущен LiveRealod, вы должны увидеть окно с приветствием, показанное ниже. Переместите рабочую директорию в сайдбар с отслеживаемыми директориями (Monitored Folders) в окне LiveReload.

Drag your working folder into LiveReload to start watching for changesDrag your working folder into LiveReload to start watching for changesDrag your working folder into LiveReload to start watching for changes

Далее, взгляните на скомпилировать Sass, LESS, Stylus, Coffescript и другие секции. Нажмите на опции (Options) для выбора пути, куда будет помещён конечный, скомпилированный файл.

Check the Compile SASS, LESS, Stylus, CoffeeScript and Others boxCheck the Compile SASS, LESS, Stylus, CoffeeScript and Others boxCheck the Compile SASS, LESS, Stylus, CoffeeScript and Others box

Вы должны увидеть пустую таблицу с подсвеченными путями и scss/main.scss с галочкой, на первой строке. Нажмите настроить конечную папку (Set Output Folder) По умолчанию будет выбран каталог CSS. Нажмите на настроить конечную папку, далее подтвердить.

Selecting your output folder for compiled SassSelecting your output folder for compiled SassSelecting your output folder for compiled Sass
Selecting your output folder for compiled SassSelecting your output folder for compiled SassSelecting your output folder for compiled Sass
Selecting your output folder for compiled SassSelecting your output folder for compiled SassSelecting your output folder for compiled Sass

Обновите ваш index.html добавив данный код, после чего обновите браузер. Ваш index должен выглядеть, как на изображении ниже.

1
  <!DOCTYPE>
2
	<html>  
3
		<head>
4
			<meta http-equiv="Content-type" content="text/html; charset=utf-8">
5
6
			<title>Write Your Own Sass Mixins</title>
7
8
			<link rel="stylesheet" href="css/main.css" type="text/css" media="screen" title="main" charset="utf-8">
9
		</head>
10
11
		<body>
12
			<div id="wrapper">
13
				Some text goes here.
14
			</div>
15
		</body>
16
	</html>
A basic index.html fileA basic index.html fileA basic index.html file

Для LiveRealod есть дополнение для браузеров FireFox и Chrome, в том случае, если вы хотите поскорее начать работу, быстрее всего будет скопировать Javascript код (из окна LiveReload) в ваш index.html, вставьте его сразу перед закрывающим body тегом. После того как данный кусочек кода будет добавлен, LiveReload будет отслеживать изменения HTML и Sass файлов и автоматически обновлять страницу в браузере, никаких больше Command + R каждые несколько минут.

1
<script>document.write('<script src="http://' + (location.host || 'localhost').split(':')[0] + ':35729/livereload.js?snipver=1"></' + 'script>')</script>

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


Шаг 4: Border Radius - ваш первый миксин

Как я упомянул раньше, я использую множество особенностей и функций CSS3 для создания структуры веб-страниц. Проблема заключается в том, что данные свойства требует указания вендорных префиксов, на что у меня не хватает терпения, делать это вручную. Мне не придётся дублировать пять похожих CSS строк каждый раз, когда я захочу задать закруглённые углы элементу, вместо этого я лучше напишу один миксин.

Миксины указываются в Sass файлах, посредством объявления @mixin() {}. Каждый раз когда обработчик, к примеру такой как LiveReload, встречает подобный синтаксис, он смотрит есть-ли аргументы в скобках, затем проверяет CSS инструкции внутри угловых скобок. Далее, компилятор обрабатывает данные инструкции и на выходе мы получаем обычную CSS таблицу стилей, main.css в нашем случае.

Откройте файл main.scss и скопируйте код миксина. Когда вы нажмёте сохранить, браузер с открытым index.html будет автоматически обновлён и мы увидим серый div с закруглёнными углами, размером 6 пикселей.

1
	/* Main.scss */
2
	@mixin border-radius($topLeft, $topRight, $bottomRight, $bottomLeft) {
3
		-webkit-border-radius: $topLeft $topRight $bottomRight $bottomLeft;
4
		-moz-border-radius: $topLeft $topRight $bottomRight $bottomLeft;
5
		-ms-border-radius: $topLeft $topRight $bottomRight $bottomLeft;
6
		-o-border-radius: $topLeft $topRight $bottomRight $bottomLeft;
7
		border-radius: $topLeft $topRight $bottomRight $bottomLeft;
8
	}
9
10
	#wrapper {
11
		@include border-radius(6px, 6px, 6px, 6px);
12
		width: 750px;
13
		height: 250px;
14
		background: #eee;
15
		margin: 0 auto;
16
	}
Index.html with a proper border-radius mixinIndex.html with a proper border-radius mixinIndex.html with a proper border-radius mixin


Шаг 5: Расширяем функционал Border Radius миксина

Неплохое начало с нашим первым миксином. Но в миксине border-radius есть недостаток: если наша граница будет иметь свойство opacity (непрозрачность) меньше 100%, по углам будет виден фон блока. Не самый лучший дизайн.

К счастью мы можем запросто это исправить с помощью свойства background-clip. Если вы не знакомы с этим свойством, у Chris Coyier с CSS-Tricks есть отличная статья на эту тему.

Функционал Sass миксинов может быть расширен другими миксинами. Это позволяет написать background-clip отдельно, тем самым данный миксин может быть вызван в border-radius, который мы создали ранее. Добавьте следующий код в main.scss и сохраните файл. После обновления страницы в браузере, вы должны увидеть голубой фон и полу прозрачный светло - голубой радиус границы.

1
	/* Main.scss */
2
	@mixin border-radius($topLeft, $topRight, $bottomRight, $bottomLeft) {
3
		-webkit-border-radius: $topLeft $topRight $bottomRight $bottomLeft;
4
		-moz-border-radius: $topLeft $topRight $bottomRight $bottomLeft;
5
		-ms-border-radius: $topLeft $topRight $bottomRight $bottomLeft;
6
		-o-border-radius: $topLeft $topRight $bottomRight $bottomLeft;
7
		border-radius: $topLeft $topRight $bottomRight $bottomLeft;
8
	}
9
10
	@mixin background-clip {
11
		background-clip: padding-box;
12
	}
13
14
	@mixin combined-radius($topLeft, $topRight, $bottomRight, $bottomLeft) {
15
		@include background-clip;
16
		@include border-radius($topLeft, $topRight, $bottomRight, $bottomLeft);
17
	}
18
19
	body {
20
		background: lightblue;
21
	}
22
23
	#wrapper {
24
		width: 750px;
25
		height: 250px;
26
		background: #eee;
27
		margin: 0 auto;
28
		border: 15px solid rgba(255, 255, 255, 0.3);
29
		@include combined-radius(6px, 6px, 6px, 6px);
30
	}

Несмотря на то что изначально мы дублируем строки кода, в нашем распоряжении будет миксин, который можно вызывать повторно, каждый раз когда нам необходимо задать элементу border-radius. Что в свою очередь позволит отобразить элемент, так как мы задумали.


Шаг 6: Text Shadow

Тени для текста - хороший способ сделать типографику и кнопки более выразительными. Я часто использую данный приём для отображения изменения состояния навигации вкладок или лейблов. В то же время работа с тенями текста, довольно раздражающее занятие, так как IE9 не поддерживает их, и в чистом CSS нет обходных путей для этого.

Несмотря на этот факт, я создам миксин с кодом для современных браузеров и бета версии IE 10. Также я реализовал небольшой jQuery скрипт для лучшего отображения text-shadow в IE9 и ниже.

Для современных браузеров, свойство text-shadow выглядит примерно также, как и box-shadow, с горизонтальным и вертикальным смещением, блюром и параметрами цвета. Добавьте следующий код в main.scss и index.html файлы и в результате вы получите трёх пиксельную, размытую, голубоватую тень позади текста.

1
	/* Main.scss */
2
	
3
	@mixin text-shadow($horizOffset, $vertOffset, $blur, $color) {
4
		-webkit-text-shadow: $horizOffset $vertOffset $blur $color;
5
		-moz-text-shadow: $horizOffset $vertOffset $blur $color;
6
		-ms-text-shadow: $horizOffset $vertOffset $blur $color; /* IE 10+ */
7
		-o-text-shadow: $horizOffset $vertOffset $blur $color;
8
		text-shadow: $horizOffset $vertOffset $blur $color;
9
		
10
		#wrapper,
11
		#wrapper-text-shadow {
12
			width: 750px;
13
			height: 250px;
14
			background: #eee;
15
			margin: 0 auto 20px;
16
			padding: 15px 0 0 15px;
17
			border: 15px solid rgba(255, 255, 255, 0.3);
18
			@include combined-radius(6px, 6px, 6px, 6px);
19
		}
20
21
		#wrapper-text-shadow > p {
22
			font-size: 36px;
23
			color: blue;
24
			@include text-shadow(0, 3px, 3px, #333);
25
		}
26
	}

index.html, добавьте сразу после закрывающего тега div#wrapper

1
	
2
	<div id="wrapper-text-shadow">
3
		<p>Text shadow test.</p>
4
	</div>

Шаг 7: Дополнительные миксины - утлиты

В качестве последнего шага, я создал миксины для box shadows, фоновых градиентов, объявления @font-face и улучшил отображение шрифтов. Миксины были проверены в современных браузерах (Firefox, Chrome, Safari, Opera, IE9) и включают все необходимые вендорные префиксы.

Я не буду углубляться в детали каждого из них; комментарии со всеми деталями находятся в файле main.scss. Миксины следуют такому же формату и могут быть улучшены в зависимости от ваших потребностей. Если вам понадобится дополнительный функционал в CSS, миксин может быть переписан для этого.

Обновите ваш index.html и main.scss файлы добавив следующий код. После обновления страницы, вы должны увидеть в окне браузера несколько блоков, каждый обладает различными тенями, за которые отвечают созданные миксины.

1
	<!DOCTYPE>
2
	<html>  
3
		<head>
4
			<meta http-equiv="Content-type" content="text/html; charset=utf-8">
5
6
			<title>Just another Textmate snippet</title>
7
8
			<link rel="stylesheet" href="css/main.css" type="text/css" media="screen" title="main" charset="utf-8">
9
		</head>
10
11
		<body>
12
			<div id="wrapper">
13
				Box shadow test.
14
			</div>
15
16
			<div id="wrapper-inset-shadow">
17
				Inset box shadow test.
18
			</div>
19
20
			<div id="wrapper-text-shadow">
21
				Text shadow test.
22
			</div>
23
24
			<div id="wrapper-background-gradient">
25
				Background gradient test.
26
			</div>
27
28
			<div id="wrapper-font-family">
29
				@font-face test in Museo 700 sans.
30
			</div>
31
32
			<div id="wrapper-improve-legibility">
33
				<h1>Improve text legibility and kerning test.</h1>
34
			</div>
35
36
			<script>document.write('<script src="http://' + (location.host || 'localhost').split(':')[0] + ':35729/livereload.js?snipver=1"></' + 'script>')</script>
37
		</body>
38
	</html>
1
	
2
	@mixin border-radius($topLeft, $topRight, $bottomRight, $bottomLeft) {
3
		-webkit-border-radius: $topLeft $topRight $bottomRight $bottomLeft;
4
		-moz-border-radius: $topLeft $topRight $bottomRight $bottomLeft;
5
		-ms-border-radius: $topLeft $topRight $bottomRight $bottomLeft;
6
		-o-border-radius: $topLeft $topRight $bottomRight $bottomLeft;
7
		border-radius: $topLeft $topRight $bottomRight $bottomLeft;
8
	}
9
10
	@mixin background-clip {
11
		background-clip: padding-box;
12
	}
13
14
	@mixin combined-radius($topLeft, $topRight, $bottomRight, $bottomLeft) {
15
		@include background-clip;
16
		@include border-radius($topLeft, $topRight, $bottomRight, $bottomLeft);
17
	}
18
19
	@mixin box-shadow($horizOffset, $vertOffset, $blur, $color) {
20
		/* 

21
			Blur is an optional parameter, but helps soften the shadow.

22
			Call the mixin by applying pixel values for $horizOffset, 

23
			$vertOffset, and $blur, and a hex value for $color. The

24
			border-collapse rule is included to render shadows properly

25
			in IE9.

26
		*/
27
		-webkit-box-shadow: $horizOffset $vertOffset $blur $color;
28
		-moz-box-shadow: $horizOffset $vertOffset $blur $color;
29
		-ms-box-shadow: $horizOffset $vertOffset $blur $color;
30
		-o-box-shadow: $horizOffset $vertOffset $blur $color;
31
		box-shadow: $horizOffset $vertOffset $blur $color;
32
		border-collapse: separate;
33
	}
34
35
	@mixin box-shadow-inset($horizOffset, $vertOffset, $blur, $color) {
36
		/*

37
			Same parameters as @mixin box-shadow, but creates an inner shadow

38
			for pressed or recessed effects.

39
		*/
40
		-webkit-box-shadow: $horizOffset $vertOffset $blur $color inset;
41
		-moz-box-shadow: $horizOffset $vertOffset $blur $color inset;
42
		-ms-box-shadow: $horizOffset $vertOffset $blur $color inset;
43
		-o-box-shadow: $horizOffset $vertOffset $blur $color inset;
44
		box-shadow: $horizOffset $vertOffset $blur $color inset;
45
	}
46
47
	@mixin background-gradient($direction, $first-color, $second-color) {
48
		background: $first-color;
49
		background-image: -webkit-linear-gradient($direction, $first-color, $second-color);
50
		background-image: -moz-linear-gradient($direction, $first-color, $second-color);
51
		background-image: -ms-linear-gradient($direction, $first-color, $second-color);
52
		background-image: -o-linear-gradient($direction, $first-color, $second-color);
53
		background-image: linear-gradient($direction, $first-color, $second-color);
54
		@include background-clip;
55
	}
56
57
	@mixin typography($font-name, $font-longname) {
58
		/*

59
			Make sure to create a /fonts directory at the same level as your /css directory

60
			to ensure the url strings below work properly. Webfonts will include the short

61
			name to reference in font-family declarations, and the long name needed for

62
			url references. The mixin will need to be invoked with the @include declaration

63
			immediately below to load fonts properly.

64
		*/
65
		@font-face {
66
			font-family: $font-name;
67
			src: url("../fonts/" + $font-longname + ".eot");
68
			src: local('☺'), url("../fonts/" + $font-longname + ".woff") format('woff'), 
69
				url("../fonts/" + $font-longname + ".ttf") format('truetype'), 
70
				url("../fonts/" + $font-longname + ".svg#webfontjVVPrHqE") format('svg');
71
			font-weight: normal;
72
			font-style: normal;
73
		}
74
	}
75
76
	@include typography("Museo700", "Museo700-Regular-webfont");
77
78
	@include typography("DroidSerifRegular", "DroidSerif-Regular-webfont");
79
80
	@mixin improve-legibility {
81
		/*

82
			The improve-legibility mixin is recommended for headers and smaller amounts of text

83
			due to the more resource-intensive font-rendering. It is not recommended for mobile

84
			devices. For more information, refer to the MDN article ( https://developer.mozilla.org/en-US/docs/CSS/text-rendering ),

85
			or Gigaom ( http://gigaom.com/2010/08/12/optimizelegibility-for-clearer-text-in-your-browser/ ).

86
			Inspect in Chrome or Safari and toggle the text-rendering: optimizeLegibility rule on and off to

87
			see the effect on kerning. It will also activate ligatures on fonts that support extended sets.

88
		*/
89
		text-rendering: optimizeLegibility;
90
		@include text-shadow(0, 0, 1px, transparent);
91
	}
92
93
94
95
	body {
96
		background: lightblue;
97
		font-family: Helvetica, Arial, sans-serif;
98
		font-weight: normal;
99
	}
100
101
	#wrapper,
102
	#wrapper-inset-shadow,
103
	#wrapper-text-shadow,
104
	#wrapper-background-gradient,
105
	#wrapper-font-family,
106
	#wrapper-improve-legibility {
107
		width: 750px;
108
		height: 250px;
109
		background: #eee;
110
		margin: 0 auto 20px;
111
		padding: 15px 0 0 15px;
112
		border: 15px solid rgba(255, 255, 255, 0.3);
113
		@include combined-radius(6px, 6px, 6px, 6px);
114
	}
115
116
	#wrapper {
117
		@include box-shadow(0, 3px, 3px, #333);
118
	}
119
120
	#wrapper-inset-shadow {
121
		@include box-shadow-inset(0, 3px, 3px, #333);
122
	}
123
124
	#wrapper-text-shadow {
125
		@include text-shadow(0, 3px, 3px, #333);
126
		font-size: 36px;
127
		color: blue;
128
	}
129
130
	#wrapper-background-gradient {
131
		@include background-gradient(top, #999, #fff);
132
	}
133
134
	#wrapper-font-family {
135
		font-family: "Museo700", Helvetica, Arial;
136
	}
137
138
	#wrapper-improve-legibility > h1 {
139
		font-family: "DroidSerifRegular", Georgia, "Times New Roman", serif;
140
		font-weight: normal;
141
		font-size: 48px;
142
		@include improve-legibility;
143
	}

Заключение

Sass миксины хороший способ познакомиться с CSS3. Не важно работаете вы уже с существующим кодом, либо создаёте сайт с нуля, миксины улучшат рабочий процесс, уменьшат количество строк кода и времени, которое вам придётся затратить.

Так как данные миксины созданы для реализации свойств CSS3, вы должны позаботиться о запасном плане при работе со старыми браузерами. Некоторым сайтам не так важны тени и закруглённые углы у блоков, и волне можно обойтись без них, если речь идёт о устаревших браузерах. В других случаях всегда можно воспользоваться полифилом, таким как Modernizr, для создания фаллбэк CSS свойств, для соответствующих классов.

Надеюсь вам понравился данный туториал, спасибо что прочитали его!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Web Design tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.