关于Angular样式封装
引导这是一个很简单的话题,但是你很难在搜索到一篇比较完整的介绍它的文章,或者说单纯的告诉你 一、封装模式分别为:
以上三种模式唯一的区别在于Shadow DOM,当然其作用是让组件的样式只进不出,换言之即组件内的样式不会影响到外部组件。有关于Shadow DOM更多的细节不在这里讨论。 三者的表现形式 假定使用以下代码: @Component({ template: `<h1>test</h1>`,styles: [`h1 { color: #f50; }`],encapsulation: ViewEncapsulation.Native }) 在不同模式下产生的HTML&CSS风格都不尽相同,了解这些不一样尤为重要。它们分别为: Native: #shadow-root (open) <style>h1 { color: #f50; }</style> <h1>test</h1> Emulated: <style>h1[_ngcontent-c0] { color: #f50; }</style> <h1 _ngcontent-c0>test</h1> None: <style>h1 { color: #f50; }</style> <h1>test</h1>
二、组件样式组件样式的封装模式取决于我们对 platformBrowserDynamic().bootstrapModule(AppModule,{ defaultEncapsulation: ViewEncapsulation.None }) 虽然三种模式都有不同的风格,但对于一个组件而言,如果没有一很合理的使用风格在实际项目中会让我们很头疼,特别是当项目中使用第三方组件库(例如:ngx-bootstrap、ng-zorro-antd、material2 等)时,有时很容易受组件库的影响抑或需要让组件库与业务组件样式做一些微调时,了解一些细节非常重要。 例如一个用于渲染页面标头名曰: <nz-breadcrumb> <nz-breadcrumb-item>Home</nz-breadcrumb-item> <nz-breadcrumb-item>Detail</nz-breadcrumb-item> </nz-breadcrumb> 最终生成的HTML是这样子: <nz-breadcrumb _ngcontent-c1="" class="ant-breadcrumb"> <nz-breadcrumb-item _ngcontent-c1=""> <span class="ant-breadcrumb-link"> Home </span> <span class="ant-breadcrumb-separator">/</span></nz-breadcrumb-item> <nz-breadcrumb-item _ngcontent-c1=""> <span class="ant-breadcrumb-link"> Detail </span> <span class="ant-breadcrumb-separator">/</span></nz-breadcrumb-item> </nz-breadcrumb> 倘若你不假思索的在 .ant-breadcrumb-link { font-weight: normal; } 正如你期望的那样,可能不一定会有你想要的结果,亦或的结果可能会存在隐患。前面我说过三种模式唯一的区别在于Shadow DOM,因此说白了是两种不同的结果。 若组件设定为 反之,对于 Shadow 行为,它会为 :host .ant-breadcrumb-link { font-weight: normal; } 最后生成的样式会变成这样: [_nghost-c1] .ant-breadcrumb-link[_ngcontent-c1] { font-weight: normal; } 我认为我们没有必要去理解生成的标识符是怎么样,只需要知道 然而我们会发现,对于第三方组件 这是很合理的,我的领地不可侵犯,Angular 组件本身即是 Web Component 标准的具体实现。 难道我们没有办法侵犯第三方组件了吗?好在 Angular 提供了一种对未来工具更好兼容性的命令 :host ::ng-deep .ant-breadcrumb-link { font-weight: normal; } 生成的CSS会是这样: [_nghost-c1] .ant-breadcrumb-link { font-weight: normal; } 最终这个不加粗的效果只会在 总结熟悉 希望此篇能帮助大家更好理解组件样式。 Happy coding! (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |