【问题标题】:How to use Flexbox with web components and shadow DOM如何将 Flexbox 与 Web 组件和影子 DOM 一起使用
【发布时间】:2021-06-05 05:35:09
【问题描述】:

我正在开发一个使用 StencilJS 构建的 Web 组件的 Web 应用程序。所有组件都打开了 Shadow DOM。许多组件使用“插槽”来接受子内容。

我在使用 Flexbox 布局此应用时遇到了一些问题。我经常遇到的一个场景是,我希望一个组件用作 Flexbox 容器,而它的子组件是 Flex 项目。

我怀疑 Shadow DOM 阻塞了我的 Flexbox。有没有办法让 Flexbox 与 Web 组件和 Shadow DOM 一起工作?

例子:

<web-component-a>
  <web-component-b></web-component-b>
  <web-component-b></web-component-b>
  <web-component-b></web-component-b>
</web-component-a>

【问题讨论】:

  • 请添加显示您的 CSS 和 shadomDom 的工作代码

标签: css flexbox web-component shadow-dom stenciljs


【解决方案1】:

您可以简单地设置slot 元素的样式,如下所示:

class WebComponentA extends HTMLElement {
  constructor() {
    super();

    const shadowRoot = this.attachShadow({mode: 'open'});


    shadowRoot.innerHTML = `
      <style>
        slot {
          display: flex;
          flex-direction: row;
        }
      </style>
      <div>
        <slot></slot>
      </div>
    `;
  }

}

window.customElements.define('web-component-a', WebComponentA);

如果您有多个插槽元素(命名插槽),您可以使用基于 CSS 属性的选择器,例如:

slot[name=title] {}

如果您想从 Web 组件中覆盖开槽内容的样式,可以使用 ::slotted() 选择器:

slot::slotted(*) {
  font-size: 2rem;
}

【讨论】:

  • 这对我有用。显然,“插槽”元素是一个真正的元素,可以设置样式并用作容器。
猜你喜欢
  • 2016-02-12
  • 2017-07-04
  • 2019-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-24
  • 2016-04-10
  • 2020-11-29
相关资源
最近更新 更多