【问题标题】:External font does not load when link is loaded from inside the shadowDOM从 shadowDOM 内部加载链接时不加载外部字体
【发布时间】:2020-09-19 13:52:27
【问题描述】:

一开始我想说我知道这个问题类似于:

How to let imported css font / icons have effects on elements in the shadow dom?

事实并非如此,也无济于事。

问题: 我最近决定使用 ShadowDOM 来封装我的项目中的样式。一开始我认为它按预期工作,但我注意到来自外部 CSS 文件的一些图标已经消失。 请务必注意,这些样式是外部,进行更改的可能性有限。

我已经准备了代码来演示这个问题(请看下面的 sn-p)。

一切似乎都正常,除了 @font-face

如您所见,包含带有图标的外部 CSS 文件的 HTML 在 ShadowDOM 之外可以正常工作。我也想在 shadowDOM 中使用它。

我怎样才能做到这一点?

注意:如果您检查开发工具,网络选项卡中的 CSS 路径存在问题,但这是 SO sn-p 问题。如果您在本地运行 sn-p,则网络中一切正常。

const body = document.getElementsByTagName('body')[0];
const wrapper = document.querySelector('.wrapper')

const handleAddToShadowClick = (param) => {
  const host = document.querySelector('#shadowHost');
  if(param === 'insideShadow') {
    const shadowRoot = host.attachShadow({mode: 'open'});
     shadowRoot.innerHTML = firstComponent
  } else {
    const shadowRoot = host;
    wrapper !== null ? body.removeChild(wrapper): '' 
    shadowRoot.innerHTML = firstComponent
  }
}

const firstComponent = `
<div class="wrapper">
  <div class="icon login">Bla bla</div>
  <div style="font-family: testFont;">Sample String od text</div>
  <link rel="stylesheet" href="./style.css" />
  <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.13.0/css/all.css" integrity="sha384-Bfad6CLCknfcloXFOyFnlgtENryhrpZCe29RTifKEixXQZ38WheV+i/6YWSzkz3V" crossorigin="anonymous">
</div>  
`
.wrapper {
    font-family: agGridBalham;
    background-color: aquamarine;
    color: black;
}

.balham:before {
    content: "\F11F";
}

.login::before {
    font-family: "Font Awesome 5 Free";
    font-weight: 900; 
    content: "\f007";
  }
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
      Refresh the page after each button click
    </p>
    <button onclick="handleAddToShadowClick('outside')">Add outside shadow</button>
    <button onclick="handleAddToShadowClick('insideShadow')">Add inside shadow</button>  
<div>
  <div id="shadowHost"> </div> 
</div>
    
    <script src="./script.js"></script>
  </body>
</html>

【问题讨论】:

标签: javascript css font-face shadow-dom icon-fonts


【解决方案1】:

问题中提到的行为是 chromium 中存在的错误(Gecko 中也存在错误,不确定是否已修复)。

这里是 link 用于在铬相关报告的错误 对于这个问题,他们仍然没有解决。目前,我觉得 这是唯一可行的解​​决方法。

这个问题主要与@font-face 的作用域有关。当前,当它们仅包含在 shadow DOM 中时,您不能使用令人敬畏的字体。所以为了使用字体,字体 css 必须同时存在于 light DOM 和 shadow DOM 中。所以你需要在 shadow dom 和 light dom 中都导入字体 css。

这是一个Working Plunker,可以解决您的问题。

<html>
  <head>
    <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.13.0/css/all.css" integrity="sha384-Bfad6CLCknfcloXFOyFnlgtENryhrpZCe29RTifKEixXQZ38WheV+i/6YWSzkz3V" crossorigin="anonymous">
  </head>

  <body>
      Refresh the page after each button click
    </p>
    <button onclick="handleAddToShadowClick('outside')">Add outside shadow</button>
    <button onclick="handleAddToShadowClick('insideShadow')">Add inside shadow</button>  
    <div>
      <div id="shadowHost"> </div> 
    </div>
    <script src="lib/script.js"></script>
  </body>
</html>

正如您在上面看到的那样,我们在 light DOM 和 Shadow Dom 中都包含了令人敬畏的字体 css。它按预期工作正常。

【讨论】:

  • 非常感谢您的帮助 :) 基本上我想避免使用轻型 dom。是否有可能仅在 shadow dom 内使用字体而不将其包含在 light dom 中?如果没有 - 您是否有任何资源或文章可以帮助我从技术角度理解它?
  • @AdamKniec 我已经更新了答案。这是铬中报告的错误,仍未解决。你可以看看谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-04
  • 2012-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多