Статьи

Sass Mixins для запуска вашего проекта

Миксины великолепны, не так ли? Они похожи на функции, которые выводят CSS. Согласно документам Sass :

Миксины позволяют вам определять стили, которые можно повторно использовать в таблице стилей, не прибегая к .float-left классам, таким как .float-left . Миксины также могут содержать полные правила CSS и все, что разрешено в других местах документа Sass. Они могут даже принимать аргументы, которые позволяют создавать разнообразные стили с очень небольшим количеством миксинов.

Миксины действительно удобны, особенно при работе над большим проектом. Сколько раз вам приходилось определять значения ширины и высоты в вашем последнем проекте? Сколько раз вы гуглили, как сделать треугольник в CSS? Или вы когда-нибудь хотели, чтобы при использовании позиционирования CSS было сокращенное обозначение top , right , bottom и left ?

Вы можете решить все эти проблемы с помощью миксинов. Даже лучше: вам не придется их писать, потому что я уже сделал это для вас. Вот, пожалуйста, парни, пара миксинов Sass для запуска ваших проектов!

Размеры Mixin

Могу поспорить, вы уже знаете это. Я использую его как миксин 101 во всех моих проектах: миксин size() определяющий ширину и высоту. Первый аргумент — ширина, второй — высота. Если высота не указана, она возвращается к значению ширины.

 @mixin size($width, $height: $width) { width: $width; height: $height; } 

Достаточно просто.

Пример использования

Sass:

 .element { @include size(100%); } .other-element { @include size(100%, 1px); } 

CSS-вывод:

 .element { width: 100%; height: 100%; } .other-element { width: 100%; height: 1px; } 

Позиционирование Mixin

Если есть одно сокращение, я действительно думаю, что CSS отсутствует, это сокращение для смещений: top , right , bottom и left . У нас есть сокращения для всего: padding , margin , background и даже text-decoration ! Но у нас все еще нет одного для зачетов … Так что я построил свой собственный.

Это было вдохновлено синтаксисом Stylus:

 absolute: top 0 left 1em 

К сожалению, в Sass нет прозрачной функции смешивания, поэтому в лучшем случае мы можем придумать что-то вроде этого:

 @include absolute(top 0 left 1em); 

… что не так уж плохо, вы должны признать. Очевидно, у нас также будут relative() и fixed() которые работают одинаково.

Я посвятил созданию этого миксина целый пост в блоге, поэтому не буду вдаваться в подробности, но основная идея — предоставить список значений для миксина. Всякий раз, когда ключевое слово найдено ( top , right , bottom , left ), значение сразу после ключевого слова применяется к нему, при условии, что оно является допустимым значением.

 @mixin position($position, $args) { @each $o in top right bottom left { $i: index($args, $o); @if $i and $i + 1< = length($args) and type-of(nth($args, $i + 1)) == number { #{$o}: nth($args, $i + 1); } } position: $position; } @mixin absolute($args) { @include position("absolute", $args); } @mixin fixed($args) { @include position("fixed", $args); } @mixin relative($args) { @include position("relative", $args); } 

Пример использования

Sass:

 .element { @include absolute(top 0 left 1em); } .other-element { @include fixed(top 1em left "WAT? A STRING?!" right 10% bottom) } 

CSS-вывод:

 .element { position: absolute; top: 0; left: 1em; } .other-element { position: fixed; top: 1em; right: 10%; } 

Vendor Prefix Mixin

Вы знаете, как вы должны -webkit- к некоторым свойствам префикс -webkit- или -moz- (среди прочих префиксов), чтобы они работали в разных браузерах, потому что они являются нестандартными свойствами? Тогда вы также знаете, как это может раздражать. Это именно тот тип мышления, который Compass и Bourbon пытаются исправить, предоставив для вас @include box-sizing() связанных с префиксами (например, @include box-sizing() ).

Я давно использую Compass, но недавно решил отказаться от него. Основная причина в том, что я не использовал его достаточно, чтобы держать его в проектах; в конце концов, это означает более быстрое время компиляции. При этом, я обнаружил, что нуждаюсь в миксинах префиксов поставщиков. Поэтому я построил один (и обновил его при переходе на Sass 3.3).

Версия Sass 3.2

Идея очень проста. Первый аргумент — это свойство. Второй аргумент — это значение этого свойства. Третий и необязательный аргумент — это список используемых префиксов. Значение по умолчанию сбрасывает все префиксы.

 @mixin prefix($property, $value, $vendors: webkit moz ms o) { @if $vendors { @each $vendor in $vendors { #{"-" + $vendor + "-" + $property}: #{$value}; } } #{$property}: #{$value}; } 

Пример использования

Sass:

 .element { @include prefix(transform, rotate(42deg), webkit ms); } 

Ouput:

 .element { -webkit-transform: rotate(42deg); -ms-transform: rotate(42deg); transform: rotate(42deg); } 

Версия Sass 3.3

Моя версия Sass 3.3 даже лучше, потому что она позволяет вам добавлять префиксы сразу к нескольким свойствам и иметь более приятный синтаксис. По сути, вместо двух отдельных аргументов для свойства и значения у вас есть только один: карта объявлений. Ключи — это свойства, значения — это значения.

 @mixin prefix($map, $vendors: webkit moz ms o) { @each $prop, $value in $map { @if $vendors { @each $vendor in $vendors { #{"-" + $vendor + "-" + $prop}: #{$value}; } } // Dump regular property anyway #{$prop}: #{$value}; } } 

Пример использования

Sass:

 .element { @include prefix((transform: translate(-50%, -50%)), webkit ms); } .other-element { @include prefix(( column-count: 3, column-gap: 1em, column-rule: 1px solid silver, column-width: 20em )), webkit moz); } 

CSS-вывод:

 .element { -webkit-transform: translate(-50%, -50%); -ms-transform: translate(-50%, -50%); transform: translate(-50%, -50%); } .other-element { -webkit-column-count: 3; -moz-column-count: 3; column-count: 3; -webkit-column-gap: 1em; -moz-column-gap: 1em; column-gap: 1em; -webkit-column-rule: 1px solid silver; -moz-column-rule: 1px solid silver; column-rule: 1px solid silver; -webkit-column-width: 20em; -moz-column-width: 20em; column-width: 20em; } 

Толкая вещи дальше

Что хорошо в этом миксине, так это то, что его можно легко использовать в других миксинах, чтобы избежать необходимости каждый раз вводить prefix() и префиксы поставщика. Подумайте о чем-то вроде этого:

 @mixin transform($value) { @include prefix(transform, $value, webkit ms); } @mixin column-count($value) { @include prefix(column-count, $value, webkit moz); } 

А вот пример использования:

 .element { @include transform(rotate(42deg)); } 

И вывод CSS:

 .element { -webkit-transform: rotate(42deg); -ms-transform: rotate(42deg); transform: rotate(42deg); } 

Противоположное направление Mixin

Если вы пользователь Compass, вы можете быть знакомы с функцией opposite-direction (да, это функция, а не миксин, но что угодно). Компас из Compass построен на Ruby, но сделать Sass довольно просто. Тот, который я сделал, использует Sass 3.3, но его легко настроить, чтобы он был доступен для Sass 3.2.

Что мне нравится в моей функции, так это то, что она позволяет вам передавать список направлений, так что вы получаете bottom left от opposite-direction(top right) . Это может быть полезно, например, при работе с background-position .

 @function opposite-direction($directions) { $opposite-directions: (); $direction-map: ( 'top': 'bottom', 'right': 'left', 'bottom': 'top', 'left': 'right', 'ltr': 'rtl', 'rtl': 'ltr' ); @each $direction in $directions { $opposite-direction: map-get($direction-map, $direction); @if $opposite-direction != null { $opposite-directions: append($opposite-directions, #{$opposite-direction}); } @else { @warn "No opposite direction can be found for `#{$direction}`."; } } @return $opposite-directions; } 

Пример использования

 $direction: opposite-direction(top); // bottom $other-direction: opposite-direction(bottom left); // top right 

Обработчик точек останова Mixin

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

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

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

 $breakpoints: ( 'tiny': ( max-width: 767px ), 'small': ( min-width: 768px ), 'medium': ( min-width: 992px ), 'large': ( min-width: 1200px ), 'custom': ( min-height: 40em ) ); @mixin breakpoint($name) { @if map-has-key($breakpoints, $name) { @media #{inspect(map-get($breakpoints, $name))} { @content; } } @else { @warn "Couldn't find a breakpoint named `#{$name}`."; } } 

Если строка, переданная в mixin breakpoint соответствует ключу в карте $breakpoints , mixin открывает директиву @media , используя функцию inspect (также из Sass 3.3) для буквального вывода карты. При выполнении inspect((key: value)) (key: value) печатается как есть в таблице стилей.

Если строка не соответствует существующей @warn останова, пользователь получает предупреждение с помощью директивы @warn , @warn сообщение об ошибке в своей консоли.

Пример использования

Sass:

 .element { color: red; @include breakpoint(medium) { color: blue; } } 

CSS-вывод:

 .element { color: red; } @media (min-width: 992px) { .element { color: blue; } } 

Последние мысли

Я думаю, что это хорошее начало! Эти инструменты должны помочь избавиться от некоторых трудоемких задач при написании CSS для вашего следующего проекта. Обязательно используйте их, настройте и оставьте свой отзыв!