Stenciljs 的新方法——2023 年更新
如果您正在使用 Stenciljs,并希望直接将字体与捆绑包一起使用,则有两个选项之一适合您:
第一个选项:使用全局样式表
https://stenciljs.com/docs/styling#global-styles。在全局样式表中,您可以像通常一样导入字体:
@font-face {
font-family: 'special-font';
src: url('/assets/fonts/special-font.ttf') format('truetype');
}
h1,h2,h3,h4,h5 {
font-family: 'special-font' !important;
}
这将应用字体到您页面上的所有标题(包括 web 组件和普通页面上的所有元素)。所有内容都通过您的 stencil 包提供。请注意不要意外覆盖您普通网站的样式。
第二个选项:创建一个新组件,如 <ci-styling></ci-styling>
,并将所有样式插入到该组件中。然后,您只需在 @Component
装饰器中设置 shadow: false
。使用此方法,组件不再使用 shadow dom,样式将在第一个选项中的任何地方都可用。通过这种方法,您可以根据需要在每个页面上决定是否加载字体等内容,只需简单地加载或不加载此组件即可。
@Component({
tag: 'ci-styles',
styleUrls: ['ci-styles.scss'],
shadow: false,
})
以下是原始答案,来自2019年(仍然有效)
第三个选项:经过数小时的挣扎和@Intervalia的回答,我终于解决了问题。
问题在于当字体文件仅包含在影子DOM(您的自定义Web组件)中时,浏览器不会加载它们。这意味着字体也必须包含在正常的HTML文件(即轻量级DOM)中,以便浏览器可以检测并加载它们,以使它们在影子DOM中可用。
在我的情况下,我没有使用Font Awesome,而是使用了自定义字体,但我尝试了第二次使用Font Awesome和一个干净的Stenciljs项目。无论您需要哪种自定义字体,解决方案始终相同。
步骤1:将字体移动到您的项目中。我在“src”文件夹内创建了一个单独的“assets”文件夹,以便所有组件都可以访问。在此示例中,我为Web环境下载了Font Awesome https://fontawesome.com/download。(我不建议使用“npm install”,因为您还必须在index.html中使用它)
步骤2:准备您的Web组件(在本例中为my-component.tsx)。您可以使用styleUrls属性导入多个CSS文件。只需从资产目录导入fontawesome CSS即可。
import { Component, Prop, h } from '@stencil/core';
@Component({
tag: 'my-component',
styleUrls: [
'my-component.css',
'../../assets/fontawesome/css/all.css'
],
shadow: true
})
export class MyComponent {
@Prop() first: string;
render() {
return <div> <i class="fas fa-question-circle"></i> </div>;
}
}
步骤三 准备您想要使用组件的文件(在本例中为index.html)。重要的是"link"标签。这包括再次使用"font awesome css"并强制浏览器真正下载字体。
<!DOCTYPE html>
<html dir="ltr" lang="en">
<head>
<meta charset="utf-8">
<title>Stencil Component Starter</title>
<link rel="stylesheet" type="text/css" href="./assets/fontawesome/css/all.css">
</head>
<body>
<my-component first="Stencil" last="'Don't call me a framework' JS"></my-component>
</body>
</html>
我知道这感觉很奇怪,看起来也很奇怪,但仅在索引HTML或Web组件中包含字体Awesome是不够的。它必须真正地包含在两个文件中。这并不意味着浏览器会多次加载它 - 它只会��加载一次。
这意味着您不能将字体与Web组件一起提供 - 就我所知。这不是stenciljs的错误,而是浏览器的一般问题。如果您有更好的解决方案,请告诉我。
只是为了好玩,这里有一个截图,显示当它仅包含在一个文件中时,浏览器不会加载字体。 http://prntscr.com/p2f9tc
更新于2019年10月5日:
如果您想在 Web 组件中使用字体,则上面的解释是正确的,仍然是必要的。但是您也可以在 Web 组件内部使用 slot 标签。这样,您就可以自动将字体从外部(HTML)绕过并传递到 Web 组件中。但请注意,它仅适用于您在 Web 组件标签之间编写的内容。
这意味着您可以使用 <my-component> <i class="your-font"/> </my-component>
。在这种情况下,您不必将字体导入到 Web 组件中。