Когато разширява селектор с @extend
директивата, Sass не взема CSS съдържанието от разширения селектор, за да го постави в разширяващия се. Работи обратното. Той взема разширяващия се селектор и го добавя към разширения.
Поради начина, по който работи, прави невъзможно използването му от различен обхват. Например, не можете да разширите запазено място, което е декларирано в @media
блок, нито можете да разширите запазено място от root, ако сте в рамките на @media
директива.
Със сигурност можем да намерим начин да използваме, @extend
когато е възможно, смесваме иначе. Всъщност това е изпълнимо, но е малко сложно, аз наричам това хак на mixtend. Може да помислите два пъти, преди да внедрите навсякъде във вашия проект. Може би използването само на миксини би било по-лесно. Ще ви оставя съдия по това.
Опаковане @extend
Идеята всъщност е доста проста за възприемане. Първо дефинираме смесицата. Единственият параметър е $extend
, който определя дали миксинът трябва да се опита да разшири, вместо да включи. Очевидно е, че е булев (по подразбиране true
).
Ако $extend
е true
, ние разширяваме резервоар, кръстен на миксина (за съжаление, това не се изчислява автоматично). Ако е така false
, ние зареждаме CSS кода, както би направил обикновеният миксин.
От смесицата ние дефинираме гореспоменатия резервиран елемент. За да се избегне повтаряне на CSS кода в заместител, ние имаме само да се включи Mixin чрез създаването $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 за това. В Sublime отидете на Tools> New snippet ... и поставете съдържанието по-долу.
Чувствайте се свободни да смените ключа, за да сложите каквото и да е, което плава във вашата лодка; това е думата, която трябва да въведете, преди да натиснете, за
tab
да разширите фрагмента. Отидох с mixtend
.
mixtend source.scss