Импортировать шрифт awesome в веб-компонент

Это мой компонент заголовка:

<header class = "header">
  <div class = "icon-container">
    <ul>
      <li class = "list-item"><i class = "fa-regular fa-bell"></i></li>
      <li class = "list-item"><i class = "fa-solid fa-gear"></i></li>
      <li class = "list-item"><i class = "fa-solid fa-arrow-right-from-bracket"></i></li>
    </ul>
  </div>
</header>

Этот код может отображать значки в fontawesome, когда я импортирую font-awesome перед закрывающим тегом body в файле index.html.

<script src = "https://kit.fontawesome.com/my id.js"crossorigin = "anonymous"></script>

Однако теперь я изучил веб-компоненты. Я создал файл header.js для своего заголовка.

const template = document.createElement("template");
template.innerHTML = `
<div class = "icon-container">
      <ul>
        <li class = "list-item"><i class = "fa-regular fa-bell"></i></li>
        <li class = "list-item"><i class = "fa-solid fa-gear"></i></li>
        <li class = "list-item"><i class = "fa-solid fa-arrow-right-from-bracket"></i></li>
      </ul>
</div>`;
class header extends HTMLElement {
  constructor() {
    super();

    // Create a shadow root
    this.attachShadow({ mode: "open" });
    this.shadowRoot.appendChild(template.content.cloneNode(true));
  }

window.customElements.define("header-section", header);

Теперь другая часть html все еще отображается, но значок исчезает, так как мне это решить?

Обратите внимание, что шрифт доступен в теневых корнях; это просто классы CSS, которые там неизвестны.

connexo 17.04.2023 08:13
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
111
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Поскольку в ваш веб-компонент не загружаются потрясающие шрифты значков, значки не отображаются. Чтобы решить эту проблему, вы можете загрузить шрифт font-awesome в свой веб-компонент, используя тег ссылки в своем шаблоне.

Вот как вы можете изменить свой шаблон:

const template = document.createElement("template");
template.innerHTML = `
<link rel = "stylesheet" href = "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/5.15.3/css/all.min.css" integrity = "sha512-jkihXtPklFJy8q3rnoEMBstczhBwFwO48lEQ7EDKlA5JX7xu5Q0NVg7lLeK/cHhV7hly0iygDRNyo6N88U6B9g= = " crossorigin = "anonymous" referrerpolicy = "no-referrer" />
<div class = "icon-container">
    <ul>
        <li class = "list-item"><i class = "fa-regular fa-bell"></i></li>
        <li class = "list-item"><i class = "fa-solid fa-gear"></i></li>
        <li class = "list-item"><i class = "fa-solid fa-arrow-right-from-bracket"></i></li>
    </ul>
</div>`;

для использования в shadowDOM вам необходимо загрузить CSS как в shadowDOM, так и в globalDOM.

Сделайте так, чтобы ваш компонент проверял, существует ли ссылка в globalDOM,
если не; веб-компонент добавляет href

customElements.define('my-fa-element', class extends HTMLElement {
  constructor() {
    let href = "https://cdn.jsdelivr.net/npm/@fortawesome/[email protected]/css/all.min.css";
    super().attachShadow({mode:'open'})
           .innerHTML = `<style>@import url('${href}')</style>`+
           [`check`,`square-check`,`circle-check`,`gear`]
             .map(icon=>`fa-${icon}: <i class = "fa fa-${icon}"></i><br>`).join("");
    if (!document.querySelector(`link[href = "${href}"]`)) {
      document.head.append(
        Object.assign(document.createElement("link"), {
          rel: "stylesheet",
          href
        }))
    };
  }
});
<my-fa-element></my-fa-element>

Вместо того, чтобы назначать CSS через innerHTML тегу style, я бы попытался импортировать таблицу стилей и вставить ее в теневой корень adoptedStyleSheets. Таким образом, вы загружаете CSS только один раз, и для всех экземпляров будет использоваться один объект таблицы стилей. Единственная неприятная вещь в этом — суета вокруг утверждений об импорте в отношении CSP и, как следствие, понижение с этапа 3 до этапа 2.

connexo 17.04.2023 08:18

Да, теперь также должно работать, так как Apple приняла это (наконец) 3 недели назад: caniuse.com/?search=adoptedStyleSheets Так что помните о поддержке браузера

Danny '365CSI' Engelman 17.04.2023 08:56

Другие вопросы по теме