Shadow dom 内的 FontAwesome svg

2024-04-15

我正在尝试在 Web 组件中使用 font Awesome js/svg 库,但图标不会显示。这可能吗?

我正在尝试在现有的 webforms 项目中实现一个角度组件,而无需 css 和脚本“流血”,关于如何做到这一点还有其他建议吗? iframe 不是一个选项。

    <html>
    <head>
        <script src="https://polygit.org/components/webcomponentsjs/webcomponents-loader.js"></script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.13.0/js/all.min.js" defer>
        </script>
        <script>
            customElements.define('my-holder', class extends HTMLElement {
                constructor() {
                    super();

                    console.log("constructor");
                    let shadowRoot = this.attachShadow({
                        mode: 'open'
                    });

                    const t = document.querySelector('#holder');
                    const instance = t.content.cloneNode(true);

                    shadowRoot.appendChild(instance);
                }

                connectedCallback() {
                    console.log("callback");
                }
            });
        </script>
    </head>

    <body>
        <div id="outside">
            light dom
            <div class="fa-4x">
                <span class="fa-layers fa-fw" style="background:MistyRose">
                    <i class="fas fa-circle" style="color:Tomato"></i>
                    <i class="fa-inverse fas fa-times" data-fa-transform="shrink-6"></i>
                </span>
            </div>
        </div>

        <template id="holder">
            <script src="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.13.0/js/all.min.js" defer></script>
            dark shadow dom
            <div class="fa-4x">
                <span class="fa-layers fa-fw" style="background:MistyRose">
                    <i class="fas fa-circle" style="color:Tomato"></i>
                    <i class="fa-inverse fas fa-times" data-fa-transform="shrink-6"></i>
                </span>
            </div>
        </template>

        <div id="inside">
            <my-holder></my-holder>
        </div>

    </body>
    </html>

许多 oldskool 库都使用document.访问主 DOM。
因此他们无法对其中的内容执行任何操作shadowDOM

这意味着你的目标是不流血scripts出来是不可能的。
Font-Awesome(脚本和样式)必须加载到主 DOM 中。

如果您不想在 ShadowDOM 之外渗出样式,则必须遵守以下规则:

  • Font-Awesome 图标定义必须保留在主 DOM 中

  • lightDOM是(主 DOM)“原始”影子 DOM开槽内容

  • lightDOM 由主 DOM 设置样式
    (或者它的shadowDOM容器,如果元素本身位于另一个shadowDOM中)

  • slotted lightDOM 保留在 lightDOM 中, 只是反映 to its <slot></slot>

  • 您不想在每个 lightDOM 中重复 FontAwesome 图标定义
    (你还不如not use那么就完全自定义元素了)

    <span class="fa-4x fa-layers fa-fw">
      <i class="fas fa-circle"></i>
      <i class="fa-inverse fas fa-times" data-fa-transform="shrink-6"></i>
    </span>    
  • 自定义元素可以访问整个 DOM

解决方案:

编写一个自定义元素

  • 创建自己的 lightDOM
  • 哪个是开槽的<slot></slot> (反映了!不感动!)
  • 从属性获取配置
    <awesome-icon background="lightcoral" color="red"></awesome-icon>
    <awesome-icon background="lightgreen" color="green"></awesome-icon>
    <awesome-icon></awesome-icon>

JSFiddle:https://jsfiddle.net/CustomElementsExamples/1pmvasnj/ https://jsfiddle.net/CustomElementsExamples/1pmvasnj/

<script src="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.13.0/js/all.min.js" defer></script>
<script>
  customElements.define('awesome-icon', class extends HTMLElement {
    constructor() {
      super().attachShadow({mode: 'open'})
      .append(document.getElementById(this.nodeName).content.cloneNode(true));
    }
    connectedCallback() {
      let setProperty =
          (prop, value)=>this.shadowRoot.host.style.setProperty('--' + prop, value);
      setProperty('fa-background', this.getAttribute('background'));
      setProperty('fa-color', this.getAttribute('color'));
      // move icon HTML back to lightDOM so FontAwesome can style it
      this.innerHTML = this.shadowRoot.querySelector('#ICON').innerHTML;
    }
  });
</script>
<template id="AWESOME-ICON">
  <style>
    ::slotted(*) {
      /* lightDOM SPAN has higher Specificity, only way out is using !important */
      background: var(--fa-background,grey) !important;
      color: var(--fa-color,darkgrey) !important;
    }
  </style>
  <template id="ICON">
    <span class="fa-4x fa-layers fa-fw">
      <i class="fas fa-circle"></i>
      <i class="fa-inverse fas fa-times" data-fa-transform="shrink-6"></i>
    </span>    
  </template>
  <slot><!--lightDOM REFLECTED here--></slot>
</template>
<awesome-icon><!-- lightDOM CREATED here --></awesome-icon>
<awesome-icon background="lightcoral" color="red"></awesome-icon>
<awesome-icon background="lightgreen" color="green"></awesome-icon>
<style>
  span{
    background:lightblue; /* !important inside shadowDOM overrules these settings */
    color:red;
  }
</style>

NOT使用 ShadowDOM 和 SLOT

并依赖作用域 CSS 属性,使代码更简单:

<script>
  customElements.define('awesome-icon', class extends HTMLElement {
    connectedCallback() {
      this.append(document.getElementById(this.nodeName).content.cloneNode(true));
      this.style.setProperty('--fa-background', this.getAttribute('background') );
      this.style.setProperty('--fa-color'     , this.getAttribute('color')      );
    }
  });
</script>

<template id="AWESOME-ICON">
  <span class="fa-4x fa-layers fa-fw">
     <i class="fas fa-circle"></i>
     <i class="fa-inverse fas fa-times" data-fa-transform="shrink-6"></i>
  </span>
</template>

<awesome-icon background="lightcoral" color="red"></awesome-icon>
<awesome-icon background="lightgreen" color="green"></awesome-icon>
<awesome-icon></awesome-icon>

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

Shadow dom 内的 FontAwesome svg 的相关文章

随机推荐

  • 阻止 CMD 始终以管理员权限打开

    无论我如何打开它 cmd exe 总是以管理员权限打开 没有的话怎么打开呢 是否缺少某些注册表设置 即使我直接从运行对话框打开它或双击 system32 文件夹 它仍然会以管理员权限打开 Thanks Found out I was mis
  • 计算各自列中的关键字数量

    假设我有这样的数据 df lt read table text title date text blablabla 22 07 2023 blablablabla Blue blablabla blablabla 23 06 2023 ba
  • Swagger UI 正在将请求中的协议从 https 更改为 http

    在 swaggerUI 中 默认采用 http 但实际 API 将支持 https 一种可能的方式 将删除架构中的 http 但在本地无法测试 https 那么这个问题的可能解决方案是什么 任何人有想法请帮助我找到它 只需将其放入您的文档中
  • 更改 Java/Swing 中的助记符修饰键

    在 Swing 中设置焦点热键非常简单 tfldPlantsNeeded new JTextField FIELD LEN MED lblPlantsNeeded new JLabel Plants Needed lblPlantsNeed
  • 使用apache poi检测Excel中的隐藏单元格

    我们使用 apache poi 3 8 来解析 Excel 我们需要能够检测 并跳过 隐藏行 因为它们在我们的用例中往往包含垃圾数据 看起来这应该有效 row isFormatted row getRowStyle getHidden 但似
  • 抑制 Access VBA 中的写入冲突消息

    我的问题 我编写了一个存储过程来计算通过 Ms Access 前端 到 MSSQL2000 数据库 上的表单呈现的多个字段 我一打电话表格重新查询获取更改后的值 我可以看到我引起了写冲突的恼人消息 自您开始编辑以来 该记录已被其他用户更改
  • Fortran 指针多态性

    我正在尝试使用指针在对象之间创建链接 使用 Fortran 下面是代码片段 module base pars module type abstract public base pars end type end module module
  • Tensorflow:裁剪图像的最大中心方形区域

    我的网络拍摄尺寸的图像100 x 100像素 因此 我必须调整不同大小的数据集图像的大小 我希望能够从给定图像中提取最大的中心正方形区域 然后将其大小调整为100 x 100 更准确地说 假设图像的宽度为200像素和高度50像素 然后我想提
  • jwt:为什么我的令牌显示在 Chrome DevTools 中?

    我在 Express js 中有一个 API 可以创建博客文章并将其添加到我的数据库中 当我从 DevTools 内的 React 应用程序发出请求时 它将显示我的 JWT 我担心当我的网站上线时 人们可以看到我的令牌并从他们的网站发出添加
  • GIT 和推送忽略的文件

    使用 git 时必须遵循的具体程序是什么 我将给出我的程序 不知何故 它工作得不太顺利 cloned a repository works fine added settings files to gitignore to prevent
  • IntelliJ 结构搜索和替换问题

    有没有一种简单的方法来捕获类型 我似乎无法做一些基本的事情 例如并排使用变量表达式 例如 mapType mapEnd 做一个简单的替换 这可能有什么原因吗 也就是说 如果我有一个表达式 比如 s abc 我把它分成两个变量 s and a
  • 受密码保护的 pdf 中密码字段不可见

    我正在使用 PDF 套件框架来显示 编辑 pdf 文件 它在 macOS 10 12 上严重损坏 有时受密码保护的文件不显示密码字段 有时密码字段在普通文件中可见 我可以使用未记录的 API 来修复此问题 它的问题与隐藏 取消隐藏密码视图有
  • javax.net.ssl.SSLException:SSLSocketFactory 为 null

    我的以下代码有问题 System setProperty javax net ssl keyStoreType pkcs12 System setProperty javax net ssl trustStoreType jks Syste
  • 从核心数据中获取子项总和

    假设我有三个实体 Person 姓名 地址 对多工资 和 对多贷款 Salary 收入 税 相对 对一个人 Bills数量 相对 对一个人 如何执行获取结果如下 John Doe SUM gt 收入 SUM gt 金额 Eva Doe SU
  • ES2015 (ES6) `class` 语法有什么好处?

    我对 ES6 类有很多疑问 使用有什么好处class句法 我读到 public private static 将成为 ES7 的一部分 这是一个原因吗 而且 是class一种不同类型的 OOP 或者它仍然是 JavaScript 的原型继承
  • Android 收到新电子邮件时如何执行一些代码?

    在 Android 中 当新电子邮件 gmail 到达时 如何执行一些代码 在 Android 中 当新电子邮件 gmail 到达时 如何执行一些代码 没有记录的广播Intents当 Gmail 到达时发送出去 Gmail 不是 Andro
  • 处理单数和复数控制器/路由

    我对如何在网络应用程序中处理单数和复数路由和控制器感到有点困惑 该网站是一个简单的报价网站 想想爱因斯坦 莎士比亚等 而不是保险 在项目中 我有一个名为 QuoteController 的控制器 控制器名称是单数 那么这是否意味着控制器应该
  • 检查 csv 列中除一项之外的所有项目 [python pandas]

    我试图弄清楚如何使用 python pandas 检查整个列以验证所有值都是整数 除了一个 一行名称始终有一个浮点数 CSV 示例 name num random1 2 random2 3 random3 2 89 random4 1 ra
  • 使用 Volley android 将发布数据发送到服务器

    我正在尝试使用 Volley 库向服务器发送一些数据 private void registerUser final String email final String username final String password Tag
  • Shadow dom 内的 FontAwesome svg

    我正在尝试在 Web 组件中使用 font Awesome js svg 库 但图标不会显示 这可能吗 我正在尝试在现有的 webforms 项目中实现一个角度组件 而无需 css 和脚本 流血 关于如何做到这一点还有其他建议吗 ifram