При расширении селектора с помощью @extend
директивы Sass не берет содержимое CSS из расширенного селектора, чтобы поместить его в расширяемый. Это работает наоборот. Он берет расширяющийся селектор и добавляет его к расширенному.
Из-за того, как он работает, невозможно использовать его из разных областей. Например, вы не можете расширить заполнитель, который был объявлен в @media
блоке, а также вы не можете расширить заполнитель из корня, если вы находитесь внутри @media
директивы.
Конечно, мы можем найти способ использовать, @extend
когда это возможно, иначе миксин. Действительно, это выполнимо, но немного сложно, я называю это микстендом. Возможно, вам стоит дважды подумать, прежде чем внедрять везде в своем проекте. Возможно, было бы проще использовать только миксины. Я оставлю вам судить об этом.
Оберточная бумага @extend
Идея на самом деле довольно проста. Сначала мы определяем миксин. Единственный параметр $extend
, который определяет, следует ли миксину пытаться расширить, а не включать. Очевидно, это логическое значение (по умолчанию true
).
Если $extend
есть true
, мы расширяем заполнитель, названный в честь миксина (к сожалению, это не вычисляется автоматически). Если это так false
, мы сбрасываем код CSS, как это сделал бы обычный миксин.
Из миксина мы определяем вышеупомянутый заполнитель. Чтобы избежать повторения кода CSS в заполнителе, нам нужно только включить миксин, установив $extend
значение, false
чтобы он выгружал код CSS в ядро заполнителя.
/// *Mixtend* hack /// @author Hugo Giraudel @mixin mixtend-boilerplate($extend: true) ( @if $extend ( @extend %mixtend-boilerplate-placeholder; ) @else ( // Mixtend content ) ) %mixtend-boilerplate-placeholder ( @include mixtend-boilerplate($extend: false); )
Пример
В качестве простого примера мы воспользуемся микрочастицей от Николаса Галлахера.
@mixin clearfix($extend: true) ( @if $extend ( @extend %clearfix; ) @else ( &:after ( content: ''; display: table; clear: both; ) ) ) %clearfix ( @include clearfix($extend: false); )
Использовать его довольно просто:
.a ( @include clearfix; ) .b ( @include clearfix; ) @media (min-width: 48em) ( .c ( @include clearfix(false); ) )
Результат CSS:
.a:after, .b:after ( content: ''; display: table; clear: both; ) @media (min-width: 48em) ( .c:after ( content: ''; display: table; clear: both; ) )
Sublime Text Snippet
Если вы хотите сохранить шаблон, чтобы сделать его многоразовым, вам будет приятно узнать, что для этого очень легко создать фрагмент Sublime Text. В Sublime перейдите в Инструменты> Новый фрагмент… и вставьте содержимое ниже.
Не стесняйтесь менять ключ, чтобы поставить все, что плавает ваша лодка; это слово, которое нужно ввести перед тем, как нажать,
tab
чтобы развернуть фрагмент. Я пошел с mixtend
.
mixtend source.scss