Создание динамических имен классов с использованием цикла @while

Я хочу создать следующее в таблице стилей с помощью SASS:

.dC1, .dC2, .dC3 {
    color: white;
}
.dC4, .dC5 {
    color: black;
}

используя цикл @while в SASS, такой как следующий (я знаю, что это бит, я уточню его, как только выясню, как его настроить):

$i: 1;
$whiteLevel: 3;
$blackLevel: 5;
$val: nil;

@while $i <= $whiteLevel {
    $val: $val + .dC#{$i};
    $i: $i + 1;
}

$val {
    color: white;
}

$val: nil;

@while $i > $whiteLevel and $i <= $blackLevel {
    $val: $val + .dC#{$i};
    $i: $i + 1;
}

$val {
    color: black;
}

Да, я знаю, что это уродливо, как грех, но я думаю, что он переживает то, что я хочу. В конечном итоге $whiteLevel и $blackLevel (или, в конце концов, я их вызываю) будут в файле _base.scss, чтобы я мог менять разные уровни и количество классов "на лету".

Можно ли это сделать, и может кто-нибудь указать мне в правильном направлении?

Спасибо заранее и с нетерпением ждем предложений!

Изменить: Чтобы уточнить, я могу использовать следующий код, чтобы получить тот же результат:

$whiteLevel: 3;

.cW {
    color: white;
}

.cB {
    color: black;
}

@for $i from 1 through 5{
    .dC#{$i} {
        @if $i <= $whiteLevel {
            @extend .cW;
        } @else {
            @extend .cB;
        }
    }
}

Это дает:

.cW, .dC1, .dC2, .dC3 {
    color: white;
}

.cB, .dC4, .dC5 {
    color: black;
}

Это 99% -ное решение, но это означает, что у меня должен быть определенный класс, уже построенный для размещения @extend. Моя цель - сделать это полностью динамичным и зависящим от значений $whiteLevel и $blackLevel. Если я установил их в 0, я хочу сделать так, чтобы класс не был создан.

Надеюсь, что это поможет немного разъяснить.

Изменить править!

Благодаря cimmanon вот решение, которое я буду использовать (на основе предоставленного решения, должен любить этот знак%):

$whiteLevel: 3;

%cW {
    color: white;
}

%cB {
    color: black;
}

@for $i from 1 through 5{
    .dC#{$i} {
        @if $i <= $whiteLevel {
            @extend %cW;
        } @else {
            @extend %cB;
        }
    }
}

Большое спасибо cimmanon!

Ответ 1

Чтобы правильно написать это выражение, выполните следующие действия:

$val: $val + '.dC#{$i}';

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

.dC4.dC5 {
  color: black;
}

Даже если вы добавили запятую, вы получите все 3 класса, которым предшествует запятая. Есть более эффективные способы сделать то, что вы ищете, чтобы правильно указать запятые:

$minLevel: 1;
$whiteLevel: 3;
$blackLevel: 5;

%white {
    color: white;
}

@for $i from $minLevel through $whiteLevel {
    .dC#{$i} {
        @extend %white;
    }
}

$blackSelectors: ();
@for $i from $whiteLevel + 1 through $blackLevel {
    $blackSelectors: append($blackSelectors, unquote('.dC#{$i}'), comma);
}

#{$blackSelectors} {
    color: black;
}

Вывод:

.dC1, .dC2, .dC3 {
  color: white;
}

.dC4, .dC5 {
  color: black;
}