Написание цикла, который увеличивается на значение, отличное от 1, в Sass

В SASS цикл записывается так:

@for $i from 1 through 100 {
    //stuff
}

Это даст 1, 2, 3, 4... вплоть до 100.

Как бы вы сделали так, чтобы цикл шел с интервалом в две единицы?

@for $i from 1 through 100 *step 2*{
    //stuff
}

Таким образом, результат равен 1, 3, 5, 7... до 99.


person danivicario    schedule 14.09.2013    source источник


Ответы (4)


Его нет в документации, потому что он просто не реализован. То, что вы хотите сделать, можно сделать с помощью директивы @while.

$i: 1;
@while $i < 100 {
  // do stuff
  $i: $i + 2;
}
person Bart    schedule 14.09.2013

Sass не предоставляет способа указать, на сколько нужно увеличить значение, используя циклы @for. Вместо этого вы пишете свой цикл, чтобы отразить, сколько шагов вам нужно сделать, чтобы получить окончательный результат. Для всех нечетных чисел от 1 до 100 это 50 шагов (100/2). Внутри цикла вы используете арифметику (сложение, вычитание, умножение, деление), чтобы получить окончательное значение.

@for $i from 1 through 50 {
  $value: $i * 2 - 1;
  // stuff
}

ДЕМО

или немного более общая версия:

$max: 100;
$step: 2;

@for $i from 1 through ceil($max/$step) {
  $value: ($i - 1)*$step + 1;
  // stuff
}

ДЕМО

person Martin Turjak    schedule 01.11.2013

Я бы использовал Modulus для этого. Оператор модуля дает вам остаток от деления числа на другое число. Например, (3 % 2) даст вам 1, как и (5 % 2) или (7 % 2).

Если вы использовали это:

@for $i from 1 through 100 {
    @if $i % 2 == 0 {
        #{$i}
    }
}

Вы получите 2,4,6,8,10...100

Но вы хотите 1,3,5,7,9...99 — так компенсируйте это на 1:

@for $i from 1 through 100 {
    @if ($i+1) % 2 == 0 {
        .your-class-#{$i} {
          // do stuff
        }
    }
}
person ConorLuddy    schedule 25.08.2016
comment
Спасибо это потрясающе! - person Mikkel Fennefoss; 03.01.2018
comment
Нет проблем, @MikkelFennefoss - спасибо за голос :) - person ConorLuddy; 03.01.2018
comment
Это мой предпочтительный метод, потому что он не только прост, но и не требует изменения/создания каких-либо новых переменных, просто для выполнения математических расчетов. Он просто проверяет результат простой операции. Красивый. - person TerranRich; 14.03.2018
comment
Это такой хороший способ контролировать диапазон, а также проходить через него. Спасибо, что поделились этим. - person klewis; 04.03.2019
comment
Не за что! :) - person ConorLuddy; 08.03.2019
comment
Одним из недостатков этого является то, что вам нужно делать (максимальные) итерации, а не только одну на каждый шаг. Итак, если вы сделаете @for $i from 1 through 100 {@if $i % 50 == 0 {}}, вы запустите цикл 100 раз, чтобы сделать 2 вещи. Учитывая, что SASS скомпилирован заранее, возможно, это не так уж и важно, если вы не используете его часто. - person Ben Hull; 09.08.2019

Другой пример больше:

.my-class {
    $step    : 5;
    $from    : ceil( 1 /$step);
    $through : ceil( 100 /$step);
    $unit    : '%';

    @for $i from $from through $through {
      $i : $i * $step;
      width: $i#{$unit};
    }
}
person Nasdac    schedule 14.08.2015
comment
Не могли бы вы объяснить, почему это решит проблему? - person John Odom; 14.08.2015
comment
Я не вижу, что это добавляет к существующим ответам. - person cimmanon; 14.08.2015