Создание значений в карте 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}
Надеюсь это поможет