为什么Font Awesome在我的Shadow DOM中不起作用?

问题描述 投票:0回答:1

Font Awesome不在我的影子DOM中工作,因为我在其中有以下内容以防止样式泄漏:

:host {
    all: initial; /* 1st rule so subsequent properties are reset. */
    display: block;
    contain: content; /* Boom. CSS containment FTW. */
}

我可以通过在:host属性中内联它们来使用其他样式表,但这不适用于Font Awesome,因为它在样式表中使用相对路径。

我发现this post并尝试使用我实现的范围CSS,但图标显示为正方形,如my example中所示。

css google-chrome-extension font-awesome shadow-dom tailwind-css
1个回答
0
投票

我注意到的一件事是,如果页面没有加载CSS文件,那么shadowDOM也不会加载它。

我真的认为唯一的问题是,如果字体没有在页面上定义它将无法在组件中工作,因为其余的CSS似乎正确地应用于shadowDOM元素。

这个例子只显示了试图加载CSS的shadowDOM,它不起作用:

let template = `
<style>
:host {
  display: block;
}
</style>
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.1/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">
<header>
  <h1>DreamLine</h1>
  <nav>
    <ul>
      <li><a href="#0">Tour</a></li>
      <li><a href="#0">Blog</a></li>
      <li><a href="#0">Contact</a></li>
      <li><a href="#0">Error</a></li>
      <li><a href="#0"><i class="fa fa-search"></i> Search</a></li>
    </ul>
  </nav>
</header>
`;

class MyEl extends HTMLElement {
  connectedCallback() {
    this.attachShadow({mode: 'open'}).innerHTML = template;
  }
}

customElements.define("blog-header", MyEl);
<i class="fa fa-battery-full" style="font-size: 45px;"></i>
<hr/>
<blog-header></blog-header>
<hr/>

这个例子显示了页面和shadowDOM加载它并且它的工作原理:

let template = `
<style>
:host {
  display: block;
}
</style>
<header>
  <h1>DreamLine</h1>
  <nav>
    <ul>
      <li><a href="#0">Tour</a></li>
      <li><a href="#0">Blog</a></li>
      <li><a href="#0">Contact</a></li>
      <li><a href="#0">Error</a></li>
      <li><a href="#0"><i class="fa fa-search"></i> Search</a></li>
    </ul>
  </nav>
</header>
`;

class MyEl extends HTMLElement {
  connectedCallback() {
    const styles = document.querySelector('link[href*="fontawesome"]');
    this.attachShadow({mode: 'open'}).innerHTML = template;
    if (styles) {
      this.shadowRoot.appendChild(styles.cloneNode());
    }
  }
}

customElements.define("blog-header", MyEl);
<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.1/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">

<i class="fa fa-battery-full" style="font-size: 45px;"></i>
<hr/>
<blog-header></blog-header>
<hr/>

我喜欢使用的代码在body中查找我想要的<link>标记,然后在shadowDOM中使用该标记的克隆。这样我的组件就不会失去同步。是的,如果组件不期望CSS发生变化,这可能会导致问题,但我发现它适用于我的项目。

© www.soinside.com 2019 - 2024. All rights reserved.