1. 这个解决方案不错,但更适合任何常见的样式,应该适用于所有组件。例如,css 网格的样式。
为了使它更加棱角分明,您可以将应用组件的封装设置为无:
`@Component({
selector: 'my-app',
template: ` `,
styleUrls: ["shared.style.css"],
encapsulation: ViewEncapsulation.None
}) export class App {}`
Demo could be found here (plunker)
注意:通过这种方式包含的样式(仅添加样式标记或不封装)将影响页面上的所有元素。有时它是我们真正想要的(同意使用任何 CSS 框架进行孔项目)。但如果只是想在几个组件之间共享样式 - 这可能不是最好的方式。
Summary:
(+) easy to use
(-) no encapsulation
2.我喜欢这个解决方案,因为它非常容易理解并且具有可预测的行为。 但是有一个问题:
它会在您每次使用时为您的共享样式添加样式标签。
如果您有大样式文件或使用它的许多元素,这可能是一个问题。
@Component({
selector: 'first',
template: `<h2> <ng-content> </ng-content> </h2>`,
styleUrls: ["shared.style.css"]
})
export class FirstComponent {}
Demo could be found here (plunker)
Summary:
(+) easy to use
(+) encapsulation
(-) duplicates styles for every usage
3.您还可以使用另一种选择。
只需再创建一个组件,它会为其子级提供共享样式。
` <styles-container>
<first> first comp </first>
</styles-container>
<styles-container>
<second> second comp </second>
</styles-container>`
在这种情况下,您必须在样式中使用 /deep/ 以使样式可用于子组件:
:host /deep/ h2 {
color: red;
}
我还值得一提的是不要忘记使用 :host 使样式仅可用于子元素。如果您省略它,您将获得一种更全局的样式。
Demo could be found here (plunker)
Summary:
(-) you have to create container and it in templates
(+) encapsulation
(+) no duplicated styles
注意:封装样式是一个很酷的功能。但你也应该记住,没有办法限制你的深度风格。所以如果你应用了深度样式,它绝对适用于所有孩子,所以也要小心使用它。