【问题标题】:SASS child selector not finding its targetSASS 子选择器没有找到它的目标
【发布时间】:2019-08-01 18:13:34
【问题描述】:

好的,所以我有以下 HTML(通过 Angular 6)

<mat-tab-group class="mat-tab-group is-third-party">
<mat-tab-header class="mat-tab-header">

然后我有以下 SASS 我正在尝试开始工作

 mat-tab-group {
      background-color: yellow;
      height: 100%;
      display: inherit; 

      &.is-third-party {
           background-color: blue;

           mat-tab-header {
                display: none !important;
           }
      }

直到 isThirdParty 一切正常(我添加了蓝色背景以查看到底发生了什么)

我已经尝试了各种组合来让 mat-tab-header 被击中,但它没有。我试过了 。对于类名、子选择器 > 以及我所做的任何事情,我都没有得到 mat-tab-header 被击中并因此被隐藏。

我只涉足 SASS,请问有人能看看我做错了什么吗? 更新:见下面我的图片,html 有点臃肿,但你可以看到这个 SASS 的 HTML 看起来不错?

【问题讨论】:

  • 你是说header没有隐藏?
  • 我没有得到 mat-tab-header 被击中并因此被隐藏
  • 更正它仍然可见。我添加的任何样式都不会影响 mat-tab-header
  • 代码对我来说看起来不错,您是否 100% 确定您看到的标头在 mat-tab-group.is-third-party 内?
  • 尝试在 mat-tab-header 之前添加 : & > .mat-tab-header。只是一个注释,

标签: angular sass


【解决方案1】:

由于 Angular 的 style scoping feature,您的样式不适用于嵌套在 Angular 组件中的 Angular Material 组件。默认情况下,组件样式不会被嵌套在组件模板中的任何组件继承。

您可以使用以下选项来定义适用于嵌套在组件中的其他组件(如您的 Angular Material 组件)的样式:

  • 将样式添加到您的全局 styles.scss 文件中
  • 保留组件中的样式并关闭此组件的视图封装
  • 保留组件中的样式并使用不推荐使用穿透阴影的后代组合器来强制将样式应用于所有子元素。 (见下面的原始答案)

禁用视图封装

在使用 Angular Material 组件的组件上禁用 视图封装

@Component({
  selector: 'app-mycomp',
  templateUrl: './mycomp.component.html',
  styleUrls: ['./mycomp.component.scss'],
  encapsulation: ViewEncapsulation.None
})

ViewEncapsulation.None 表示 Angular 没有视图封装。 Angular 将 CSS 添加到全局样式中。范围界定 前面讨论的规则、隔离和保护不适用。这个 本质上与将组件的样式粘贴到 HTML。 Angular Docs

如果您关闭视图封装,请确保仅针对您真正想要的 html 元素,因为为该组件定义的样式现在适用于您的整个 Angular 应用程序(而不仅仅是一个组件)。 (例如,将自定义 classid 添加到您的元素)

我发现当禁用 view encapsulation 时,您可能还必须在 CSS 中使用 !important 来覆盖现有的 Angular Material 样式,而 ::ng-deep 并不总是需要它。


使用::ng-deep

::ng-deep 放在您的父选择器前面。

请注意,::ng-deep 当前为 deprecated

::ng-deep mat-tab-group {
  background-color: yellow;
  height: 100%;
  display: inherit; 

  &.is-third-party {
       background-color: blue;

       mat-tab-header {
            display: none !important;
       }
  }
}

【讨论】:

  • 有效,但很快就会被弃用。你能解释一下为什么这样可行,以便强调解决问题的另一种方法,因为我仍然不完全理解为什么 2 个父类很好,但不是第三个......
  • 我不确定自己为什么在这里需要它,因为它应该只需要针对子组件中的 HTML 元素。我猜这与 Angular Material 的工作方式有关......
  • 好吧,这给了我我需要的线索....该类是由角度材料组件呈现的 html 的一部分。如果我将该 CSS 放入父级的 styles.scss 中,它就可以工作。我希望能够避免这样做。有办法吗?
  • 另一种方法是禁用组件上的视图封装:@Component({ encapsulation: ViewEncapsulation.None })。然后,您必须确保仅定位您真正想要的 mat-tab-header,而不是子组件中的任何其他标题。可能会为其添加一个自定义类。我还没有对此进行测试,但很快就会尝试,因为我正在处理同样的问题。
  • 我在我的项目中测试了“禁用 vie 封装”方法,它对我有用。更新了我的答案。
【解决方案2】:

在你的 sass 中,你有

mat-tab-group {
  background-color: yellow;
  height: 100%;
  display: inherit; 

  &.is-third-party {
       background-color: blue;

       mat-tab-header {
            display: none !important;
       }
  }

应该是(注意 mat-tab-group 之前的“.”)

.mat-tab-group {
  background-color: yellow;
  height: 100%;
  display: inherit; 

  &.is-third-party {
       background-color: blue;

       mat-tab-header {
            display: none !important;
       }
  }

【讨论】:

  • 那不行。注意:黄色和蓝色背景正在显示,所以我的代码现在已经到了那么远,它是 mat-tab-header 查询不起作用
  • 还有 .mat-tab-header { display: none !important; }
  • 也试过 .mat-tab-header 。请参阅我编辑的问题以获取我的 html 图像
  • @robertoLL 这里的问题不是特异性,而是 Angular 的视图封装,因为选择的答案状态
猜你喜欢
  • 2012-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-12
  • 1970-01-01
  • 1970-01-01
  • 2011-11-12
相关资源
最近更新 更多