arrays - 如何在 SCSS 中获取数组的 $values?

标签 arrays dictionary sass each media

我正在制作自己的插件,通过在 SCSS 中编写单个 @include 行自动进行多个媒体查询。

所以当我输入 @include medias($bp-values, width); 时,输出应该是这样的:

@media all and (min-width: 564px) {
    width: 200px;
}
@media all and (min-width: 768px) {
    width: 300px;
}
@media all and (min-width: 992px) {
    width: 400px;
}
@media all and (min-width: 1200px) {
    width: 500px;
}

这是代码:

$breakpoints: (
    564,
    768,
    992,
    1200
);

$bp-values: (
    width: (
        200px, 300px, 400px, 500px
    ),
    font-size: (
        20px, 30px, 40px, 50px
    )
);

@function gridnum($m, $v) {
    @return map-get($m, $v);
}

@mixin medias($map, $key) {
    $myList: map-get($map, $key);
    @each $value in $myList {
        $number: index($myList, $value);
        $grid: gridnum($breakpoints, $num);
        @if $value == $num {
            @media all and (min-width: $grid + px) {
                #{$key}: $value;
            }   
        } @else {
            @warn "There is an error to make @media queries.";
        }
    }
}

我需要的是获取 $breakpoints$values 以将其设置为 @media 查询宽度的前缀。

但是代码没有运行,我明白了:

Error: Undefined variable: "$num".

大多数闲置的解决方案是在单个 @each 指令中合并 2 个 $map,但似乎 SCSS 不支持此操作。

有什么办法可以解决这个问题吗?

最佳答案

在我看来,您不太了解 map 和列表之间的区别。

列表是一个值的数组:

$breakpoints: (
    564,
    768,
    992,
    1200
);

$breakpoints: 564, 768, 992, 1200;

$breakpoints: 564 768 992 1200;

所以这个 @return map-get($m, $v); 总是会让你出错,因为 $breakpoints 不是 map 。

map 有键和值:

 $breakpoints: (
        xs: 564,
        md: 768,
        lg: 992,
        xl: 1200
    );

为了在你的项目中帮助你,也许最好写一个嵌套 map 的 map :

$myMap:(
  xs:(
    min-width: 564px,
    width: 200px,
    font-size: 20px
  ),
  md:(
    min-width: 768px,
    width: 300px,
    font-size: 30px
  ),
  lg:(
    min-width: 992px,
    width: 400px,
    font-size: 40px
  ),
  xl:(
    min-width: 1200px,
    width: 500px,
    font-size: 50px
  )
);

与每个值的相关性更加清晰。现在我们可以编写一个@mixin 来获取这些值:

@mixin medias($map, $key) {
  @each $keyMap, $valueMap in $map {
    @media all and (min-width: map-get($valueMap, min-width)) {
        #{$key}: map-get($valueMap, $key);
    }   
  }
}

现在我们可以包含它了!

@include medias($myMap, width);

这是您要求的结果:

@media all and (min-width: 564px) {
  width: 200px;
}

@media all and (min-width: 768px) {
  width: 300px;
}

@media all and (min-width: 992px) {
  width: 400px;
}

@media all and (min-width: 1200px) {
  width: 500px;
}

我发布了你的新 sass 文件,我认为更容易理解

$myMap:(
  xs:(
    min-width: 564px,
    width: 200px,
    font-size: 20px
  ),
  md:(
    min-width: 768px,
    width: 300px,
    font-size: 20px
  ),
  lg:(
    min-width: 992px,
    width: 400px,
    font-size: 20px
  ),
  xl:(
    min-width: 1200px,
    width: 500px,
    font-size: 20px
  )
);

@mixin medias($map, $key) {
  @each $keyMap, $valueMap in $map {
    @media all and (min-width: map-get($valueMap, min-width)) {
        #{$key}: map-get($valueMap, $key);
    }   
  }
}

@include medias($myMap, width);

关于arrays - 如何在 SCSS 中获取数组的 $values?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53579774/

相关文章:

java - Android:我想从 google map api 以 json 格式提取地址

html - CSS:强制列始终具有全高

css - 有没有办法删除重要评论?

c - 将特定大小的数组传递给 C 中的函数

arrays - 为什么map函数会改变perl中输入数组的值?

arrays - Swagger 嵌套对象数组

python - 我可以访问带有键列表的嵌套字典吗?

css - 当 sass 同时使用 calc 和 var 时,React 构建失败

arrays - 是否有一种惯用的方法来交换单元格数组中的两个元素?

arrays - 在 ActionScript 数组 (Object[]) 和 Vector.<Object> 之间转换