Shadow DOM v1 CSS 填充

2024-04-24

https://developers.google.com/web/fundamentals/getting-started/primers/shadowdom https://developers.google.com/web/fundamentals/getting-started/primers/shadowdom

这让我很兴奋,我可以从头开始编写自己的自定义网页,而无需使用聚合物。

只是为了找出css:host例如在 Edge 和 FireFox 中不起作用。我可以不用 html 处理import现在,直到 w3c 弄清楚他们想用 es6 模块做什么,但每个浏览器都有自己的一半实现的 Shadow DOM 版本,没有 css,这让我很恼火。

所以我仍然需要一个完整的聚合物堆栈才能在所有浏览器中拥有 Web 组件。

<script src="../webcomponentsjs/webcomponents-lite.js"></script>

<link rel="import" href="../hello-world.html">

<hello-world>Hello World Polymer 2.x</hello-world>

有谁知道如何填充 Edge 和 FireFox 来拥有一个真正的 Shadow DOM,而不是一个冒充的原生 Shadow DOM?

这是我尝试过的,但我不知道如何告诉 Edge 和 FireFox 将他们的 Shadow 想要的东西放在其他地方并使用 shadydom/shadycss。

https://jsbin.com/quvozo https://jsbin.com/quvozo

<!DOCTYPE html>
<html>

<head>
  <title>Components</title>
  <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0"/>
</head>

<body>
  <hello-world>Hello World ES2015</hello-world>
  <script>
    function loadScript(src, main) {
      return new Promise(function(resolve, reject) {
        const script = document.createElement('script');
        script.async = true;
        script.src = src;
        script.onload = resolve;
        script.onerror = reject;
        document.head.appendChild(script);
      });
    }
    let polyfilled = false;
    const loadPromises = [];
    if (!('customElements' in window)) {
      loadPromises.push(loadScript('https://raw.githubusercontent.com/webcomponents/custom-elements/master/custom-elements.min.js'));
    }
    if (!HTMLElement.prototype.attachShadow) {
      polyfilled = true
      loadPromises.push(loadScript('https://raw.githubusercontent.com/webcomponents/shadydom/master/shadydom.min.js'));
      loadPromises.push(loadScript('https://raw.githubusercontent.com/webcomponents/shadycss/master/shadycss.min.js'));
    }
    Promise.all(loadPromises)
      .then(e => console.log(`polyfilled ${polyfilled}`))
      .then(e => {
        class HelloWorld extends HTMLElement {
          constructor() {
            super()
            this.template = document.createElement('template')
            this.template.innerHTML = `
              <style>
                :host {
                  display: block;
                  box-sizing: border-box;
                  border: 1px solid red;
                  margin-top: 10px;
                  padding: 0px 5px;
                }
              </style>
              <p>Test <slot></slot></p>
            `
            if (polyfilled) ShadyCSS.prepareTemplate(this.template, 'hello-world');
          }
          connectedCallback() {
            const shadowRoot = this.attachShadow({ mode: 'open' })
            shadowRoot.appendChild(this.template.content.cloneNode(true))
            if (polyfilled) ShadyCSS.applyStyle(this);
          }
        }
        customElements.define('hello-world', HelloWorld)
      })
  </script>
</body>

</html>

  • Shadow DOM polyfill 不会创建realShadow DOM 但是normalDOM 元素,
  • 自定义元素规范不会允许你 https://html.spec.whatwg.org/multipage/scripting.html#custom-element-conformance添加元素normalDOM 树在constructor(),

因此,您应该attach the fake之后的 Shadow DOM,即在connectedCallback()方法,而不是内部constructor() method.

ShadyCSS polyfill 在 Edge 和 Firefox 上运行良好。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Shadow DOM v1 CSS 填充 的相关文章

  • 在 Selenium Node JS 中打开 gecko 驱动程序的日志记录

    我目前正在使用Selenium 与 Node Js and FireFox并想打开日志记录功能壁虎司机 但我不确定如何 另外我还想知道在哪里可以找到日志 目前这是我实例化驱动程序的方式 var fOptions new firefox Op
  • Firefox 中的代理设置不会“粘连”

    在家里我们有一个代理服务器 在工作中我们不会 Firefox 在这方面令人恼火 每当我启动它时 它都会默认使用代理服务器 如果我执行 工具 gt 选项 gt 设置 并选择 无代理 则没有问题 但是 如果我关闭 Firefox 并重新启动它
  • 防止 Edge 中的高对比度模式向文本添加背景

    我正在努力调整一些组件 以便它们在高对比度模式下都能正常工作并且看起来不错 Edge 似乎在 IE11 未添加的所有文本下添加了黑色背景 我似乎找不到一种方法来在 CSS 中定位这个背景 或者任何其他方法来规范两个浏览器之间的行为 例如 假
  • 如何在亚马逊云(AWS EC2)中安装firefox?

    我有一个拥有所有权限的 AWS 账户 我想在环境中安装 Firefox 因为我的应用程序将启动 Firefox 并对 Web 应用程序运行一些测试 如何安装火狐浏览器 执行以下命令解决了问题 sudo apt get install xvf
  • 在PC上的Firefox上模拟Android的Webview?

    作为我的软件开发工作 针对 Android 的一部分 我需要在通过 Android 的 WebView 查看时检查大量 HTML 页面的内容 到目前为止 我已经能够通过将 HTML 内容转储到文件中来实现这一点 data data
  • Firefox 无法识别字体

    我正在设计样式pre通过 CSS 的 HTML 元素如下所示 pre font family Franklin Gothic Medium Arial Narrow Bold Arial sans serif 它可以在 Chrome Chr
  • Edge 中的 Javascript 仅适用于打开的 devtools

    我遇到的问题是 在 MS Edge 中 我的图像映射功能只能部分工作 它由淘汰赛 FW 提供动力 在更大的图像映射上 它不会将整个图像映射注册到视图模型中 因此 图像映射的所有悬停效果和单击样式都会停止工作 然而 这只是大图像地图的问题 还
  • 为什么 Firefox 会忽略弹性项目的下边距?

    它尊重margin bottom只有当有足够的空间时 否则 Firefox 会表现得好像没有margin bottom at all 全面镀铬 铬合金缩小 火狐浏览器缩小了 Flexbox 的行为是否正确 如何修复它 codepen htt
  • Firefox api - 从我的程序访问

    是否可以从我的程序访问 Firefox 信息 具体来说 我需要读取活动选项卡中打开的站点的 URL 这样的事情可能吗 我想我可以编写扩展来允许我做这样的事情 但我想知道某些 FF api 是否可行 使用MozRepl http wiki g
  • 当鼠标悬停在选择下拉列表上时,包含 div 会失去焦点

    我有一个 div 当您将鼠标悬停在其容器上时 该 div 会出现 并且该 div 是绝对定位的 因此它会出现在其容器之外 它里面有多个选择下拉菜单 当我尝试更改其中任何一个的值时 焦点就会丢失 它会触发容器上的鼠标移出 我在这里设置了这个问
  • Firefox 不再解释 XSLT-1.0

    我使用 XSLT 将大量数据保存在 XML 文件中 以便在 Firefox 中正确显示内容 但从今天开始 Firefox 不再解释 XSLT 并显示白色页面或块中的数据 我当前的 Firefox 版本是 68 0 64 位 新版本中的 XS
  • IFrame 内容交换错误?

    我有一个包含许多 iframe 的网页 包括第三方 iframe 例如广告感知和各种共享按钮 在 Firefox 中 我注意到这些 iframe 的内容有时会被交换 这样您就会在另一个 iframe 所在的位置看到广告感知广告 iframe
  • Firefox OS 后台服务

    我想构建一个应用程序 用户可以通过它输入一些设置 并且应用程序将启动后台服务来根据这些设置执行一些任务 我只想在模拟器中运行应用程序和后台服务 我知道它需要 认证 模式才能运行后台服务 但我现在不考虑在 Firefox Marketplac
  • 无法在 Firefox 中显示我的 svg 图像?

    我无法在 Firefox 中显示我的 svn image 它在 Safari 和 Chrome 中工作正常 没有 IE 所以还没有测试过 它在我的html中是这样实现的 img 类 logo1 src images logo6 svg 其中
  • 确定用户是否在shadow dom之外单击

    我正在尝试实现一个下拉菜单 您可以单击外部将其关闭 下拉列表是自定义日期输入的一部分 并且封装在输入的影子 DOM 内 我想写一些类似的东西 window addEventListener mousedown function evt if
  • 将 FireBug 用于带有框架的网站

    我下载了 Firebug 并尝试使用它来调试使用框架的站点的 JS 我的理解是 当我进入 Firebug 中的 脚本 选项卡时 我会看到 aspx 上的 JS 函数以及包含的任何文件中的 JS 并且我将能够设置断点 然而 我在这个网站上看到
  • 文本的彩虹色

    rainbowtext background image webkit gradient linear left top right top color stop 0 f22 color stop 0 15 f2f color stop 0
  • 为什么函数声明在不同浏览器中的处理方式不同?

    虽然我在谷歌中找不到对此的引用 但我熟悉这样一个事实 在 javascript 中 全局函数声明在执行任何代码之前都会被解释 换句话说 这工作得很好 f function f 但是 我注意到 chrome 和 firefox 对全局函数声明
  • 如何在 Firefox 控制台中访问附加内容脚本?

    我为 Firefox 和 Chrome 开发了一个插件 它有内容脚本 我想在浏览器选项卡的控制台中访问它们 在 Firefox 上网页控制台 https developer mozilla org en US docs Tools Web
  • 更快地开发和测试打印样式表的方法(避免每次都进行打印预览)?

    这是我现在的流程 保存对 print css 的更改 打开浏览器并刷新页面 右键单击并选择 打印 gt 打印预览 Firefox 但实际上是任何浏览器 第三步让我烦恼 我想知道是否可以通过插件或其他东西将其从流程中删除 只需选择以打印媒体形

随机推荐