如何在shadow dom中使用全局css样式

问题描述 投票:0回答:7

Shadow

dom
封装了css样式,选择器不会跨越阴影边界。

问题: 如何在shadow dom中使用全局通用的css样式?
(假设有一些通用的CSS样式将在所有页面中使用(例如:font-family,h1,h2,clear,reset ...),如何使其在shadow dom中工作?)

javascript web-component shadow-dom
7个回答
8
投票

我刚刚遇到了与原始问题相同的问题,即:为<h3>元素定义

once
一些全局规则,并在任何/许多
ShadowDOM
s中受益。

不,

css-variables
font不太适合这个东西,因为即使我已经定义了一次,比如说,
color
<h3>
变量,我仍然需要仔细检查每个和每个阴影样式表并添加使用它们的 CSS 规则。

在写这篇文章时(是的,我们现在已经是 2019 年了)

最短的标准化

解决方案确实是导入一些全球通用的 CSS。在 Chrome、Firefox 和 Anaheim(Chromium 上的 Edge)中完美运行。 仍然需要在每个组件中添加

@import

规则,因此成本仍然很高(从编码/维护 POV 来看,样式表仅获取一次),但这是我们现在可以支付的最低价格。

    


4
投票
现在是2022年了

ShadowDOM 的样式是:

  • <style>

    在shadowDOM中

    
    

  • 可继承的风格
  • https://lamplightdev.com/blog/2019/03/26/why-is-my-web-component-inheriting-styles/

  • (级联)CSS 属性
  • shadowParts(和主题)
  • https://meowni.ca/posts/part-theme-explainer/

  • <slot>

    reflected
    ,它们不是由shadowDOM 设计的,而是由它的容器设计的。 请参阅:::分档内容

  • (2022 年 2 月)可构造样式表仍然是仅 Chromium 的一方
  • https://caniuse.com/mdn-api_cssstylesheet_cssstylesheet

  • 您的自定义指令

3
投票

<custom-element tabindex=10> <style> :host div { --color: red; } </style> </custom-element> class Element extends HTMLElement { constructor() { super(); var shadow = this.attachShadow({mode: 'open'}); var user_style = shadow.host.innerHTML.match(/<style>([\s\S]*?)<\/style>/); var style = document.createElement('style'); style.innerHTML = ` :host div { color: var(--color, #aaa); } ` + user_style ? user_style[1] : ''; shadow.appendChild(style); shadow.host.querySelector('style').remove(); } } customElements.define( "custom-element", Element )



3
投票
注意:截至 2023 年,此答案可能已过时。请参阅其他答案以获取更新信息。

一些解决方案:

CSS 变量:
    http://www.html5rocks.com/en/tutorials/webcomponents/shadowdom-201/
  1. https://developers.google.com/web/updates/2016/02/css-variables-why-should-you-care?hl=en
  2. http://blog.chromium.org/2016/02/chrome-49-beta-css-custom-properties.html
    :host-context
  • http://www.html5rocks.com/en/tutorials/webcomponents/shadowdom-201/
    另外,我还没有测试过,但有人建议
  • @import url('/common-style.css');
  • ,在这里:
    聚合物跨元素共享样式
  • 请注意,上面列出的其中一篇文章也被 Amid 指出。在撰写本文时,Chrome 还没有 CSS 变量。但现在它已经可以在最近推出的 Google Chrome 49 上原生运行。


2
投票

点亮后,像这样

export class AppComponentBase extends LitElement { static styles = css` :host { font-family: sans-serif; font-size: 21px; } `; }

然后不要从 
LitElement

继承,而是让应用程序中的所有组件都从

AppComponentBase
继承,如下所示:

export class HomeRouteComponent extends AppComponentBase {

    render() {
        return html`
<h1>Home</h1>
<p>
    Welcome to my website
</p>
`;
    }
}

您还可以添加或一些样式

export class HomeRouteComponent extends AppComponentBase { static styles = [super.styles, css` h1 { color: red; } `] render() { return html` <h1>Home</h1> <p> Welcome to my website </p> `; } }

拥有一个可以继承的通用组件可能还有其他优点。例如共享一些逻辑,尽管这可能更好地通过控制器来实现。

这一切都已点亮,但可以使用“裸”customElmements 相对轻松地实现相同的概念。


0
投票
:host

而不是

:root
中定义变量,瞧!
:host {
   --someGlobalVariable: 10px
}

constructor() {
    super();
    this.root = this.attachShadow( { mode: 'open' } );
    const sheet = new CSSStyleSheet(),
    globalSheet = new CSSStyleSheet();
    sheet.replaceSync( css );
    globalSheet.replaceSync( globalCss );
    this.root.adoptedStyleSheets [ globalSheet, sheet ];
}



-3
投票

::shadow .redColor { background-color: red; }

这会将样式应用于具有 .redColor 类的阴影树内的所有元素。

这篇精彩文章中提供了更多信息 + 其他样式可能性:

Shadow DOM 201

© www.soinside.com 2019 - 2024. All rights reserved.