这是“我们应该怎么做”这一问题之一.如您所知,Web组件应该是小型的,包含网站应用程序.但是,有时这些需要根据它们嵌入的网站进行样式设置.
示例:“注册我们的简报” – 组件.这个组件有几个关键项:
>输入框
>一个按钮
>也许重新开始
>按下按钮后与您的服务对话的方法(传入电子邮件)
我们将以Google和YouTube为例.谷歌的配色方案是蓝色的(让我们想象一下),YouTube的配色方案是红色的.该组件将类似于< newsletter-signup>< / newsletter-signup>在您嵌入它的页面上.Google和YouTube都有这个.
当组件需要从Google和YouTube继承样式时,问题就出现了. A few deprecated CSS selectors对此非常有用,因为Google和YouTube的样式表可以简单地为Shadow DOM启用颜色,因此我们不必复制/粘贴样式.理论上,组件应该不知道主机中的样式,因为我们希望它从主机(Google和YouTube)继承.
目前,我正在使用Angular 6创建一个Web组件,它具有很多样式,因为它有很多元素.我是从主机网站复制/粘贴样式,引导程序,图标等,然后根据< newsletter-signup brand =“google”>< / newsletter-signup>设置它们的样式.因此,如果该品牌是Google,则颜色应为红色.
这真的很糟糕,原因如下:
>必须在Web组件和主机上更新样式
>重复的代码永远不是一个好主意
>如果以1:1复制所有样式,则样式所需的字节数将加倍
作为开发人员,我如何考虑这一点?如何在主机上创建样式,然后将它们应用到我的Web组件上(称之为继承)?我确定有人遇到与我遇到的Shadow DOM完全相同的问题.谢谢阅读.
最佳答案 我意识到你不想为你的通用组件(选择器)编写相同的规则
即你想要像你的公共选择器放置样式.
你可以做的事情来处理这个:
1.创建自己的逻辑css框架
在全局css中编写最常用的CSS规则.例如,如果您已经集成了引导程序并且想要覆盖引导程序,那么您将在app.css中编写最常见的覆盖,这将覆盖引导程序.
"styles": [
"node_modules/bootstrap/dist/css/bootstrap.min.css",
"src/styles/app.scss"
],
这个app.scss应该以你可以覆盖的方式编写.
>发送规则作为输入
发送自定义规则Obj并在要覆盖的元素中使用.
<newsletter [input]="customRulesObj"></newsletter>
component.ts
customRulesObj = new CustomRulesClass();
customRulesObj.color = 'red';
您可以通过创建公共类来在各种组件的输入中发送规则
如您所知,嵌入此组件的位置.
>从通用组件扩展此组件
如果你太关心css,你可以从一个公共组件扩展你的组件,根据需要为你提供css逻辑.
export class NewsLetterComponent extends CSSComponent implements OnInit
{
}
CSS-component.ts
在这个组件中可以根据主机,当前路由器链接和逻辑顺序定义css
其他多个if else条件.
您可以通过切换案例条件来定义规则,并将这些规则绑定到您已扩展的组件.