样式不适用于组件级别但适用于全局级别
Styles not applying on component level but on global level
我正在使用 ngPrime 组件,如果我为它们设置样式,则样式不适用于 dashboard.component.sass 文件,但它们在我使用全局 style.sass 文件时适用。
dashboard.component.html 文件
<p-dropdown [options]="reports" styleClass="report-dropdown">
<ng-template let-item pTemplate="selectedItem">
<i class="fas fa-th" style="fill: white;"></i>
<span style="vertical-align:middle">
{{item.label}}</span>
</ng-template>
</p-dropdown>
dashboard.component.scss 和全局 style.scss 文件
.report-dropdown {
.ui-dropdown-label {
background-color: $secondary;
color: white;
}
.ui-dropdown-trigger {
color: white;
background-color: $secondary;
border: none;
}
}
如果要在组件中设置样式,只需在要应用的规则之前使用 ng-deep
。
https://angular.io/guide/component-styles#deprecated-deep--and-ng-deep
它确实被弃用了,但目前还没有替代品,所以你现在不妨使用它
dashboard.component.scss
::ng-deep .report-dropdown {
.ui-dropdown-label {
background-color: $secondary;
color: white;
}
.ui-dropdown-trigger {
color: white;
background-color: $secondary;
border: none;
}
}
我不知道 primeng,但我分叉了一个显示颜色变化的旧 stackblitz(虽然下拉列表在示例中没有打开)
https://stackblitz.com/edit/primeng-bootstrap-ylpzwd?file=app/app.component.scss
其他解决方案
另一个解决方案是在全局样式中设置样式 sheet。如果您的 CSS 规则比 ngPrime
默认应用的规则更具体,这将起作用
默认情况下,Angular 组件样式的范围会影响组件的视图。这意味着您编写的样式将影响组件模板中的所有元素。它们不会影响模板中其他组件的子元素。您可以在 Angular documentation.
中阅读有关视图封装的更多信息
如果您的组件打开了视图封装(默认),您的组件样式只会影响模板中的顶级子项。 HTML 属于子组件的元素无法成为您的组件样式的目标,除非您执行以下操作之一:
- (正如您已经提到的)将覆盖样式添加到全局样式表中。确定选择器的范围,使其仅影响您需要它的特定元素。
- 在您的组件上关闭视图封装。如果您这样做,请务必适当地确定您的样式范围,否则您最终可能会意外地以应用程序中其他地方的其他组件为目标。
- (不建议)使用已弃用的阴影穿透后代组合器强制将样式应用于所有子元素。在 Angular documentation.
中阅读有关此已弃用解决方案的更多信息
我正在使用 ngPrime 组件,如果我为它们设置样式,则样式不适用于 dashboard.component.sass 文件,但它们在我使用全局 style.sass 文件时适用。
dashboard.component.html 文件
<p-dropdown [options]="reports" styleClass="report-dropdown">
<ng-template let-item pTemplate="selectedItem">
<i class="fas fa-th" style="fill: white;"></i>
<span style="vertical-align:middle">
{{item.label}}</span>
</ng-template>
</p-dropdown>
dashboard.component.scss 和全局 style.scss 文件
.report-dropdown {
.ui-dropdown-label {
background-color: $secondary;
color: white;
}
.ui-dropdown-trigger {
color: white;
background-color: $secondary;
border: none;
}
}
如果要在组件中设置样式,只需在要应用的规则之前使用 ng-deep
。
https://angular.io/guide/component-styles#deprecated-deep--and-ng-deep
它确实被弃用了,但目前还没有替代品,所以你现在不妨使用它
dashboard.component.scss
::ng-deep .report-dropdown {
.ui-dropdown-label {
background-color: $secondary;
color: white;
}
.ui-dropdown-trigger {
color: white;
background-color: $secondary;
border: none;
}
}
我不知道 primeng,但我分叉了一个显示颜色变化的旧 stackblitz(虽然下拉列表在示例中没有打开)
https://stackblitz.com/edit/primeng-bootstrap-ylpzwd?file=app/app.component.scss
其他解决方案
另一个解决方案是在全局样式中设置样式 sheet。如果您的 CSS 规则比 ngPrime
默认应用的规则更具体,这将起作用默认情况下,Angular 组件样式的范围会影响组件的视图。这意味着您编写的样式将影响组件模板中的所有元素。它们不会影响模板中其他组件的子元素。您可以在 Angular documentation.
中阅读有关视图封装的更多信息如果您的组件打开了视图封装(默认),您的组件样式只会影响模板中的顶级子项。 HTML 属于子组件的元素无法成为您的组件样式的目标,除非您执行以下操作之一:
- (正如您已经提到的)将覆盖样式添加到全局样式表中。确定选择器的范围,使其仅影响您需要它的特定元素。
- 在您的组件上关闭视图封装。如果您这样做,请务必适当地确定您的样式范围,否则您最终可能会意外地以应用程序中其他地方的其他组件为目标。
- (不建议)使用已弃用的阴影穿透后代组合器强制将样式应用于所有子元素。在 Angular documentation. 中阅读有关此已弃用解决方案的更多信息