在 SASS 地图中为模块化比例 ms-range 创建值
Creating values in SASS map for modular scale ms-range
我想做的是
- 遍历地图$断点,
- 拉出每个断点的最小值,
- 根据每个计算一个em值,
- 然后将这些用于全球地图 $ms-range
这段代码需要产生一个如下所示的变量:
$ms-range:
1.2 20em,
1.333 30em,
1.618 40em,
1.8 50em,
2 60em;
我无法将函数 return 转换为我想要的格式。也许是地图扩展?!我不知道。我需要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;
SASS大师 LINK:
http://www.sassmeister.com/gist/700f0721fd7940c84435cb1b5210f5d7
我注意到一些可以修复的东西
如果您希望函数 return 像 $ms-range
中的列表一样,您不应该在每次迭代中都 returning 而是 return 在循环结束时生成的 列表
这部分代码 'calc($i * 1.2) $min / 16 * 1em'
将始终 return 一个字符串,不会执行任何计算,因此最好只执行必要的计算
当您在代码中使用 length($name)
时,我假设该部分代码指的是 length(s)
、length(sm)
等。这将始终 return 1
因为它将被解释为只有 一个项目 的列表。相反,您应该使用 str-length
,这将 return 字符串字符的 长度 。
我也没有完全理解你的 @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}
希望对您有所帮助
我想做的是
- 遍历地图$断点,
- 拉出每个断点的最小值,
- 根据每个计算一个em值,
- 然后将这些用于全球地图 $ms-range
这段代码需要产生一个如下所示的变量:
$ms-range:
1.2 20em,
1.333 30em,
1.618 40em,
1.8 50em,
2 60em;
我无法将函数 return 转换为我想要的格式。也许是地图扩展?!我不知道。我需要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;
SASS大师 LINK: http://www.sassmeister.com/gist/700f0721fd7940c84435cb1b5210f5d7
我注意到一些可以修复的东西
如果您希望函数 return 像
$ms-range
中的列表一样,您不应该在每次迭代中都 returning 而是 return 在循环结束时生成的 列表这部分代码
'calc($i * 1.2) $min / 16 * 1em'
将始终 return 一个字符串,不会执行任何计算,因此最好只执行必要的计算当您在代码中使用
length($name)
时,我假设该部分代码指的是length(s)
、length(sm)
等。这将始终 return1
因为它将被解释为只有 一个项目 的列表。相反,您应该使用str-length
,这将 return 字符串字符的 长度 。
我也没有完全理解你的 @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}
希望对您有所帮助