Как использовать иконки Material Design в веб-компоненте?
Похоже, что mdi не работает внутри веб-компонентов, или я что-то пропустил?
Я хочу разработать веб-компонент, который инкапсулирует его зависимости, добавление ссылки на родительский документ работает, но нарушает исходное намерение.
<html>
<body>
<x-webcomponent></x-webcomponent>
<script>
customElements.define(
"x-webcomponent",
class extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: "open" });
this.shadowRoot.innerHTML = `
<style>@import url('https://cdn.materialdesignicons.com/4.9.95/css/materialdesignicons.min.css');</style>
<span class="mdi mdi-home"></span>
`;
}
}
);
</script>
</body>
</html>
1 ответ
В @font-face
Ат-правило CSS для шрифта, который вы хотите использовать, должно быть объявлено в основном документе, а не в Shadow DOM.
Поскольку в вашем случае он определен в файле materialdesignicons.min.css, вам необходимо загрузить его в основной документ через глобальный<link>
.
Обратите внимание, что файл CSS не будет загружен дважды благодаря кешу браузера.
В качестве альтернативы вы можете добавить его в световую модель DOM веб-компонента или просто объявить @font-face
at-rule (скопировано из файла materialdesignicons.css).
Вот рабочий пример:
customElements.define( "x-webcomponent", class extends HTMLElement {
constructor() {
super()
this.attachShadow({ mode: "open" })
this.shadowRoot.innerHTML = `
<link rel=stylesheet href=https://cdn.materialdesignicons.com/4.9.95/css/materialdesignicons.min.css>
<span class="mdi mdi-home"></span>`
}
connectedCallback () {
this.innerHTML = `<style>
@font-face {
font-family: "Material Design Icons";
src: url("https://cdn.materialdesignicons.com/4.9.95/fonts/materialdesignicons-webfont.woff?v=4.9.95") format("woff");
}
</style>`
}
} )
<x-webcomponent></x-webcomponent>