Создание значений в карте SASS для модульной шкалы ms-range

То, что я пытаюсь сделать, это

  • цикл через карту $ точки останова,
  • вытащите минимальное значение для каждой точки останова,
  • рассчитать значение em на основе каждого,
  • затем используйте их для глобальной карты $ ms-range

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

$ms-range:
1.2      20em,
1.333    30em,
1.618    40em,
1.8      50em,
2        60em;

Я не могу получить функцию для возврата нужного мне формата. Возможно, карта-расширение?! Я не знаю. Мне нужен мастер SASS!

SASS:

$breakpoints: ( s: (320, 479), sm: (480, 767), m: (768, 1023), l: (1024, 1439), xl: (1440, null));


@function returnThatMap() {
    @each $name, $values in $breakpoints {
        @for $i from 1 through length($name) {
          $min: nth($values, 1);
          // if the last one
          @if ($i == length($name))  {
            @return 'calc($i * 1.2)  $min / 16 * 1em'
          }
          // if not the last one
          @else {
            @return 'calc($i * 1.2)  $min / 16 * 1em',
          }
        }
    }
}

$ms-range : returnThatMap() ;


// OUTPUT FORMAT NEEDED below!! (dummy numbers, but correct syntax - ie. number ' ' [number]em,number ' ' [number]em, number ' ' [number]em;)

// $ms-range:
//   1.2      20em,
//   1.333    30em,
//   1.618    40em,
//   1.8      50em,
//   2        60em;

ССЫЛКА SASSMEISTER: http://www.sassmeister.com/gist/700f0721fd7940c84435cb1b5210f5d7

1 ответ

Решение

Несколько вещей, которые я заметил, которые могли бы сделать с некоторыми исправлениями

  • Если вы хотите, чтобы функция возвращала список, такой как в $ms-range вы не должны возвращаться в каждой итерации, а должны возвращать список, сгенерированный в конце цикла

  • Эта часть вашего кода 'calc($i * 1.2) $min / 16 * 1em' всегда будет возвращать строку и не будет выполнять никаких вычислений, поэтому лучше просто выполнить необходимые вычисления

  • Когда вы используете length($name) в вашем коде, я предполагаю, что часть кода относится к length(s), length(sm) и так далее. Это всегда вернется 1 потому что он будет интерпретирован как список только с одним элементом. Вместо этого вы должны использовать str-length который вернет длину строковых символов.

Я также не до конца понимаю цель вашего @if-@else оператор, поскольку оба содержат один и тот же код в своем блоке @return 'calc($i * 1.2) $min / 16 * 1em'

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

breakpoints: (  s: (320, 479),
                sm: (480, 767),
                 m: (768, 1023),
                 l: (1024, 1439),
                xl: (1440, null));

@function returnThatMap() {
  $map: ();
  @each $name, $values in $breakpoints {
    $min: nth($values, 1); //This assumes that the first value is always the minimum
    // $min: min($values...); //This in built function can find the minimum between two values as long as they are both integers and might be a better option
    $key: str-length($name) * 1.2;
    $value: ($min / 16) * 1em;
    $map: append($map, ($key $value), comma);
  }
  @return $map;
}

$ms-range : returnThatMap() ;

@debug $ms-range; // 1.2 20em, 2.4 30em, 1.2 48em, 1.2 64em, 2.4 90em}

Надеюсь это поможет

Другие вопросы по тегам