【发布时间】:2021-07-03 02:15:09
【问题描述】:
我有一个嵌套的scss 列表,其中包含一些字体定义:
$font-cinzel: "Cinzel", serif;
$font-poppins: "Poppins", sans-serif;
$fonts: (
"title": (
"all": (
font-family: $font-cinzel
),
"sm": (
font-size: 26px,
line-height: 1.4
),
"lg": (
font-size: 80px,
line-height: 1.6
)
),
"text": (
"all": (
font-family: $font-poppins
),
"sm": (
font-size: 16px,
line-height: 1.2
),
"lg": (
font-size: 36px,
line-height: 1.4
)
)
);
现在我想写一个mixin 和一个function 来在为每个视口传递字体名称时生成一个样式块。所以all 中定义的所有样式都应该在media query 之外呈现(所有视口的规则以避免冗余)。视口独有的所有其他样式都在视口块中定义,例如所有小样式都在sm 中,所有具有不同值的大样式都在lg 等等。我还有一个断点混合,我使用字体列表中的视口名称映射min-width:
断点混合:
$breakpoints: (
sm: 768px,
md: 1024px,
lg: 1280px,
xl: 1400px
);
@function get-bp($bp) {
@if $bp {
$bp: map-get($breakpoints, $bp);
} @else {
@error "Parameter #{$vp} is unknown or empty.";
}
@return $bp;
}
这就是我尝试循环播放内容的方式:
@function get-value($definition, $vp) {
@each $prop, $val in map-get($definition, $vp) {
@return $val;
}
}
@mixin font($name) {
$definition: map-get($fonts, $name);
@each $key, $value in $definition {
@if $key == "all" {
$prop: get-value($definition, $key);
} @else {
@media (min-width: get-bp($key)) {
$prop: get-value($definition, $key);
}
}
}
}
h1 {
@include font('title');
}
p {
@include font('text');
}
预期输出:
h1 {
font-family: 'Cinzel', serif;
@media (min-width: 768px) {
font-size: 26px;
line-height: 1.4;
}
@media (min-width: 1280px) {
font-size: 80px;
line-height: 1.6;
}
}
p {
font-family: 'Poppins', sans-serif;
@media (min-width: 768px) {
font-size: 16px;
line-height: 1.2;
}
@media (min-width: 1280px) {
font-size: 36px;
line-height: 1.4;
}
}
我没有收到任何错误,但样式不适用于元素。
【问题讨论】:
标签: css sass each scss-mixins