【问题标题】:Using bootstrap template with vanilla web components使用带有香草 Web 组件的引导模板
【发布时间】:2019-06-12 16:17:18
【问题描述】:

我有一个使用 Metronic Bootstrap 模板的传统 ASP.NET MVC 网站。

现在,我正在考虑使用 vanilla web components 方法重写这个网站。

所以我做了一个小测试,写了一个没有shadow dom的web组件,看起来我的组件只是使用了Metronic风格,所以它从我包含它的父页面继承了它。

但是,当我启用 shadow DOM 时,CSS 传播停止,现在我的 Web 组件不再使用 Metronic 样式。

此时我有点不确定如何处理这种情况:我可以根本不使用影子 DOM,但是,我没有使用 Web 组件的全部强度和封装。

那么,如果您有一个想要使用的大型 Bootstrap 模板并结合 Web 组件,您将如何处理呢?这值得么?有针对这种情况的指导方针吗?

【问题讨论】:

    标签: javascript html css asp.net web-component


    【解决方案1】:

    如果您需要在基于 ShadowDOM 的 Web 组件中使用大型 CSS 框架,那么您需要在每个组件中包含该 CSS,或者至少包含该组件所需的 CSS 部分。

    ShadowDOM 旨在防止外部 CSS 影响内部 ShadowDOM。所以,如果你想在 ShadowDOM 中使用特定的 CSS,那么你必须把它放在那里。

    最简单的做法是在 ShadowDOM 中包含 <link> 标签。您在组件之外使用的相同 <link> 标记。

    class MyElement extends HTMLElement {
      constructor() {
        super();
        let shadow = this.attachShadow({mode: 'open'});
        shadow.innerHTML = `
        <link href="my.css" rel="stylesheet">
        <h2 class="my-header">My Component</h2>
        <button class="my-button">Pay me</button>`;
      }
    }
    
    customElements.define('my-element', MyElement);
    <link href="my.css" rel="stylesheet">
    <div class="my-thing">Stuff</div>
    <button class="my-button">Click me</button>
    <hr/>
    <my-element></my-element>

    由于我没有文件 my.css,因此您不会看到更改。

    这将允许您在页面和组件中包含 CSS。

    【讨论】:

    • 谢谢。确实,我读过这个。但是我对此的结论是,它可能会大大降低站点速度,因为每次都会下载这些依赖项。对吗?
    • 浏览器非常智能,链接的 CSS 文件只下载一次,然后在任何地方都可以使用。据我所知,它甚至没有被复制,只是在每个地方都使用过。
    • 嗯,很有趣...好的,谢谢,那我再多尝试一下!我猜Metronic需要的javascript,原理是一样的吗?以与 css 文件相同的方式链接到它?
    • JS 不同。如果JS文件加载一次就不需要再加载了。 shadowDOM 只为 DOM 和 CSS 创建沙箱,not 为 JS。 JS 只能加载一次的方式是使用 ES6 import: devdocs.io/javascript/statements/import 但旧版浏览器不支持,不能 polyfill。如果您不使用import,并且您的组件只能在使用 Metronic 的环境中工作,那么页面应该加载 Metronic JS 文件并且组件只会使用它们。这确实意味着您的组件不能在没有 Metronic 的情况下使用。
    • 继续我之前的评论: 唯一与组件直接相关的 JS 是您放置在组件类中的内容以及您添加到 JS 文件中的任何辅助函数定义你的组件。
    猜你喜欢
    • 2017-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-25
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 2020-12-02
    相关资源
    最近更新 更多