How to solve SassError: Invalid parent selector "*"?

How to solve SassError: Invalid parent selector "*"?

我有一个 Angular 9 应用程序,当我使用此片段 SCSS 时 returns 此错误:

SassError: Invalid parent selector "*"
   ╷
52 │         &#{$value} {
   │         ^^^^^^^^^^^^^^^
   ╵

这是片段:

$values: (
  "":"",
  one: one,
  two: two,
);

@mixin gen() {
  @each $value, $key in $values {
    @media (min-width: 300px) {
      &#{$value} {
        @content
      }
    }
  }
}

@mixin display {
  display: block;
}

.display > * {
  @include gen() {
    @include display();
  }
}

我想为每个值输出 类,例如:display > *display-one > *display-two > * 等等。

1.你想在value >之后select*,意味着你应该在mixin中添加它

2. 你想要 select -#{$value} 而不仅仅是 &#{$value}。所以 A- 你必须添加 -B- 对于 $value="" - 是不存在。所以你可能应该特别注意它。

稍后,将 scss 更改为

$values: (
        one: one,
        two: two,
);

@mixin gen() {
  @media (min-width: 300px) {
    > * {
      @content
    }
  }
  @each $value, $key in $values {
    @media (min-width: 300px) {
      &-#{$value} > * {
        @content
      }
    }
  }
}

@mixin display {
  display: block;
}

.display {
  @include gen() {
    @include display();
  }
}

输出:

@media (min-width: 300px) {
  .display > * {
    display: block;
  }
}
@media (min-width: 300px) {
  .display-one > * {
    display: block;
  }
}
@media (min-width: 300px) {
  .display-two > * {
    display: block;
  }
}

@Yosef描述的是正确的——但是,有几点需要考虑

在地图上使用@each 循环时,顺序为$key, $value

为了最小化 CSS 输出,将 @each 循环 移到 媒体查询中 – 如:

@media (min-width: 300px) {
  //  move loop here
  @each $key, $value in $values {
    ...
  }
}


// CSS output without redundant media queries
@media (min-width: 300px) {
  .display > * {
    display: block;
  }
  .display-one > * {
    display: block;
  }
  .display-two > * {
    display: block;
  }
} 

最后但并非最不重要的一点考虑根本不这样做 – 使用 attribute selector 代替 – 这样您就可以在一个选择器中处理所有事情:-)

@media (min-width: 300px) {
  [class|=display] > * { display: block; }
}

// This will match 
.display > *, .display-one > *, .display-two > *, .display-xxx > * etc.