如何在web组件中使用材质设计图标



看起来mdi没有在web组件内部工作,或者我遗漏了什么?

我想开发一个封装其依赖关系的web组件,将链接添加到父文档是可行的,但这违背了初衷。

<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>

https://codepen.io/Jamesgt/pen/MWwvJaw

要使用的字体的@font-faceCSS at规则必须在主文档中声明,而不是在Shadow DOM中声明。

因为在您的情况下,它是在materialdesignicons.min.css文件中定义的,所以您需要通过全局<link>将其加载到主文档中。

注意,由于浏览器的缓存,CSS文件不会被加载两次。

或者,您可以将其添加到web组件的light DOM中,也可以仅声明@font-faceat规则(从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>

最新更新