另见https://angular.io/docs/ts/latest/guide/component-styles.html
查看封装
要允许外部样式影响组件的内容,您可以更改视图封装(这就是防止样式“渗入”组件的原因)。
@Component({
selector: 'some-component',
template: '<div></div>',
styleUrls: [
'http://example.com/external.css',
'app/local.css'
],
encapsulation: ViewEncapsulation.None,
})
export class SomeComponent {}
视图封装实现了一个目的。更好的方法是将样式直接添加到它们应该影响的组件中。
ViewEncapsulation 是为每个组件设置的,在某些情况下可能会派上用场。
“阴影穿透”
您还可以使用阴影穿透 CSS 组合器 ::ng-deep(>>> 和 /deep/ 已弃用)来构建跨组件边界的选择器,例如
:host ::ng-deep .ng-invalid {
border-bottom: solid 3px red;
}
无论封装是None 还是Emulated,它都会在当前组件中使用类ng-invalid 或任何带有红色下划线的后代设置所有标签的样式。 /deep/ 是否与 Native 一起使用取决于浏览器支持(据我所知,这不再被任何浏览器支持)。
注意
shadow piercing CSS 组合器与 shadow DOM 规范中的组合器相似,但在很长一段时间内它们已被弃用。
使用 默认 ViewEncapsulation.Emulated Angulars 自己的 /deep/ 和 ::shadow 实现,即使 Chrome 移除原生支持,它们也能正常工作。
ViewEncapsulation.Native Angular 使用 Chrome 的影子 DOM CSS 组合器(无论如何,只有 Chrome 支持它们 AFAIK)。如果 Chrome 最终删除了它们,那么它们也将无法在 Angular 中工作(同样仅限 ViewEncapsulation.Native)。
全局样式
全局添加的样式 (index.html) 不考虑组件边界。 Angular2 不会重写此类样式,ViewEncapsulation.Emulated 不适用于它们。仅当设置了ViewEncapsulation.Native 并且浏览器支持原生 shadow DOM 时,全局样式才不会渗入。
另请参阅此相关问题https://github.com/angular/angular/issues/5390