Window:queryLocalFonts() 方法

Limited availability

This feature is not Baseline because it does not work in some of the most widely-used browsers.

实验性: 这是一项实验性技术
在将其用于生产之前,请仔细检查浏览器兼容性表格

安全上下文: 此项功能仅在一些支持的浏览器安全上下文(HTTPS)中可用。

window.queryLocalFonts() 方法返回一个 Promise,其兑现为一个表示本地可用字体的 FontData 对象数组。

要使用此方法,用户必须同意授予 local-fonts 权限(可以通过 Permissions API 查询权限状态)。此外,此功能可能会被服务器上设置的权限策略阻止。

语法

js
queryLocalFonts(options)

参数

options 可选

包含可选配置参数。目前仅定义了一个属性:

postscriptNames 可选

一个包含字体 PostScript 名称的数组。如果指定了此项,则只有 PostScript 名称与数组中的 PostScript 名称匹配的字体才会包含在结果中;如果没有,所有字体都将包含在结果中。

返回值

一个 Promise,其兑现为一个表示本地可用字体的 FontData 对象数组。

异常

NotAllowedError DOMException

首次调用该方法后,当浏览器出现权限提示时,用户选择拒绝授予此功能的权限。

SecurityError DOMException

此功能的使用被权限策略阻止,或者不是通过用户交互(如按下按钮)调用此特性,或当前的不透明。

示例

有关实时演示,请参阅字体选择演示

字体枚举

以下代码片段将查询所有可用的字体并打印元数据。例如,这可以用于填充字体选择器控件。

js
async function logFontData() {
  try {
    const availableFonts = await window.queryLocalFonts();
    for (const fontData of availableFonts) {
      console.log(fontData.postscriptName);
      console.log(fontData.fullName);
      console.log(fontData.family);
      console.log(fontData.style);
    }
  } catch (err) {
    console.error(err.name, err.message);
  }
}

限制返回结果

要将返回的字体数据限制为特定的字体列表,使用 postscriptNames 选项。

js
async function returnSpecificFonts() {
  const availableFonts = await window.queryLocalFonts({
    postscriptNames: ["Verdana", "Verdana-Bold", "Verdana-Italic"],
  });

  return availableFonts;
}

访问底层数据

blob() 方法提供对底层 SFNT 数据的访问——这是一种可以包含其他字体格式的字体文件格式,例如 PostScript、TrueType、OpenType 或 Web 开放字体格式(WOFF)。

js
async function computeOutlineFormat() {
  try {
    const availableFonts = await window.queryLocalFonts({
      postscriptNames: ["ComicSansMS"],
    });
    for (const fontData of availableFonts) {
      // `blob()` 方法返回一个包含有效且完整的 SFNT 封装字体数据的 Blob。
      const sfnt = await fontData.blob();
      // 仅裁剪出我们需要的字节部分:前 4 个字节是 SFNT 版本信息。
      // 规范:https://learn.microsoft.com/zh-cn/typography/opentype/spec/otff#organization-of-an-opentype-font
      const sfntVersion = await sfnt.slice(0, 4).text();

      let outlineFormat = "UNKNOWN";
      switch (sfntVersion) {
        case "\x00\x01\x00\x00":
        case "true":
        case "typ1":
          outlineFormat = "truetype";
          break;
        case "OTTO":
          outlineFormat = "cff";
          break;
      }
      console.log("矢量字体格式:", outlineFormat);
    }
  } catch (err) {
    console.error(err.name, err.message);
  }
}

规范

Specification
Local Font Access API
# dom-window-querylocalfonts

浏览器兼容性

Report problems with this compatibility data on GitHub
desktopmobile
Chrome
Edge
Firefox
Opera
Safari
Chrome Android
Firefox for Android
Opera Android
Safari on iOS
Samsung Internet
WebView Android
WebView on iOS
queryLocalFonts
Experimental

Legend

Tip: you can click/tap on a cell for more information.

Full support
Full support
No support
No support
Experimental. Expect behavior to change in the future.
See implementation notes.

参见