Sass: селектор нескольких классов из переменной

Я хочу создать переменную с такими классами

$multi: foo, bar, baz

И я хочу создать комбинированный селектор так:

.foo, .bar, .baz {}

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


person Rey    schedule 31.01.2012    source источник
comment
Было бы полезнее, если бы вы указали, какие расчеты вам нужно сделать. Пожалуйста, объясните, почему вам нужно приблизиться или точно к обычному комбинированному выходу селектора   -  person maxbeatty    schedule 01.02.2012
comment
Классы предназначены для спрайтов... поэтому у меня есть спрайт, в котором есть часть изображения foo, bar и baz. У меня есть цикл, который устанавливает первый класс на определенный фон, а затем последний цикл продолжается там, где остановился первый, и в основном последовательно обрабатывает спрайты без необходимости вручную управлять им. Прямо сейчас мне нужно определить настройку переменных, а затем вручную указать комбинированные селекторы только потому, что Sass не позволяет мне делать то, что я хочу.   -  person Rey    schedule 02.02.2012


Ответы (3)


У меня была та же проблема, что и у ОП, и это был первый результат поиска, который я нашел, поэтому теперь, когда я в этом разобрался, я опубликую свое решение, хотя вопросу уже 1,5 года.

Вот что я выяснил: чтобы использовать переменную в качестве селектора, вы используете SASS интерполяция, которая отлично работает со строками, разделенными запятыми. Однако, если вы хотите, чтобы переменная, содержащая ваши селекторы, была list (чтобы вы могли использовать с ней функции списка, например length($multi)), интерполяция создаст селектор неправильного формата.

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

$multi: ".foo", ".bar", ".baz"
$multi-selector: ""
@each $selector in $multi
    @if $multi-selector != ""
        $multi-selector: $multi-selector + ", "
    $multi-selector: $multi-selector + $selector

#{$multi-selector}
    //CSS properties go here

Возможно, вы захотите абстрагировать функциональность списка в строку, разделенную запятыми, в функцию (примечание: SASS join этого не делает, она объединяет два списка в новый). Вот одна из возможных реализаций:

@function unite($list, $glue: ", ")
    @if length($list) == 1
        @return $list

    $string: ""
    @each $item in $list
        @if $string != ""
            $string: $string + $glue
        $string: $string + $item
    @return $string

В этот момент исходный код может быть таким кратким, как:

$multi: ".foo", ".bar", ".baz"

#{unite($multi)}
    //CSS properties go here
person Andrew Patton    schedule 24.07.2013
comment
Извините за редактирование вашего ответа, я думал, что он сделает копию вашего ответа с моими изменениями. Поэтому, пожалуйста, отклоните изменения, потому что я вырезал первую часть вашего ответа, которая действительно полезна. - person Able; 22.06.2014

(код из предыдущего ответа) Классная функция! Полезно. Я просто хотел добавить немного синтаксиса SCSS, чтобы люди могли его использовать:

@function unite($list, $glue: ", ") {
     @if length($list) == 1 {
             @return $list;
     } @else {
        $string: "";
        @each $item in $list {
             @if $string != "" { $string: $string + $glue; }
                 $string: $string + $item;
     }

     @return $string;
     }
}

В этот момент исходный код может быть таким кратким, как:

$multi: ".foo", ".bar", ".baz"

#{unite($multi)}
    //CSS properties go here
person Able    schedule 22.06.2014

Компас предлагает встроенный миксин спрайтов, который делает именно это. Если вы этого не сделаете, хотите использовать весь Compass, вы можете заглянуть в их исходный код, чтобы узнать, как они это делают.

person maxbeatty    schedule 02.02.2012
comment
Я считаю, что sass никогда не позволяет делать что-либо легко, если только это не самые простые основы. - person run_the_race; 15.11.2020