2015-04-03 6 views
1

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

@include smth(true) => .class{ color:blue } 
@include smth(false) => color: blue 

Я пытался что-то вроде этого:

@mixin smth($selector:true){ 
    @if $selector { 
     .class{ 
    } 

    color: blue; 

    @if $selector{ 
     } 
    } 
} 

Очевидно скобки внутри директивы @If являются проблемой. Поэтому я попытался поместить содержимое @if по двойной цитате ".class{" и с использованием интерполяции #{".class{"} (с символом побега \) и без него, поэтому он не будет мешать, но ничего не работает.
Чтобы быть коротким, я не хочу, чтобы sass обрабатывался . содержание @if но просто "положить его как это"

UPDATE

от cimmanon ответа мне удалось создать общую подмешать:

@mixin conditional-wrap($condition, $selector){ 
    @if $condition{ 
    #{$selector}{ 
     @content 
    } 
    } 
    @else{ 
    @content 
    } 
} 

И S О теперь мы можем сделать:

@mixin smth($selector:true){ 
    @include conditional-wrap($selector, '.class'){ 
     color: blue; 
    } 
} 
+1

голосования, чтобы закрыть, как типографская ошибка (подсказка: вы не можете иметь больше открывающей фигурной скобки, чем вы закрыть фигурные скобки). – cimmanon

+0

вы имеете в виду внутри той же директивы @if? потому что иначе нет. – Ghetolay

+0

Затем ваша вложенность испорчена, вам нужно найти редактор, который будет показывать соответствующие фигурные скобки. – cimmanon

ответ

0

Сасс это язык сценариев . Кудрявые фигурные скобки являются частью синтаксиса SCSS (как и любой другой язык, который использует фигурные скобки: JavaScript, PHP, C/C++ и т. Д.), Сасс не просто «ставит его так, как есть». Синтаксис SASS (с отступом) вообще не использует фигурные скобки. Синтаксические анализаторы для каждого синтаксиса отличаются, но внутреннее представление селекторов и их свойств одно и то же, и так получается, что эти структуры выводятся при создании файла CSS: фигурные скобки вставляются соответствующим образом в соответствии со стилем вывода. Короче говоря, то, что вы пытаетесь написать, невозможно.

Сасс не заботится о том, как вы отступаете от кода, используя синтаксис SCSS, он заботится только о совпадении фигурных скобок. В результате, ваш Mixin интерпретируется следующим образом:

@mixin smth($selector: true) { 
    @if $selector { 
     .class { 

     } 

     color: blue; 

     @if $selector { 

     } 
    } 
} 

Что вы можете сделать вместо этого изменить логику.

@mixin smth($selector: true) { 
    @at-root #{if($selector, selector-nest(&, '.class'), &)} { 
     color: blue; 
    } 
} 

Для Сасс версии 3.3 или старше:

@mixin foo { 
    color: blue; 
} 

@mixin smth($selector: true) { 
    @if $selector { 
     .class { 
      @include foo; 
     } 
    } @else { 
     @include foo; 
    } 
} 
+0

Ths для объяснения. Второе решение - это то, что я делал сначала, но потом понял, что лучше использовать 2 mixin '' 'smth''' и' '' smthSelector''', а не использовать только один параметр. Первое решение выглядит многообещающим, я буду искать информацию о '' '@ at-root''' и' '' selector-nest''' – Ghetolay

+0

Ваше первое решение не работает для меня, и все это делается для того, чтобы избегайте дублирования одного и того же селектора на последнем css. Из-за '' '@ at-root''', когда' '' $ selector''' является ложным, мы будем иметь тот же селектор дважды. – Ghetolay

+0

@Ghetolay «Не работает» - бесполезное описание проблемы. Сассмейстер говорит, что он отлично работает: http://sassmeister.com/gist/25ebc0956f781ff6746d – cimmanon

Смежные вопросы