如何检测网页中使用了哪一种定义的字体?

IT技术 javascript html css fonts
2021-01-16 01:37:42

假设我的页面中有以下 CSS 规则:

body {
    font-family: Calibri, Trebuchet MS, Helvetica, sans-serif;
}

如何检测用户浏览器中使用了哪一种定义的字体?

对于想知道我为什么要这样做的人来说,因为我检测的字体包含其他字体不可用的字形。如果用户具备的字体,那么我希望它显示一个链接,要求用户下载该字体(这样他们就可以用我的web应用程序与正确的字体)。

目前,我正在为所有用户显示下载字体链接。我只想为没有安装正确字体的人显示这个

6个回答

我已经看到它以一种不确定但非常可靠的方式完成。基本上,一个元素被设置为使用特定的字体,并且一个字符串被设置为该元素。如果为元素设置的字体不存在,则采用父元素的字体。所以,他们所做的是测量渲染字符串的宽度。如果它与他们对所需字体的预期相匹配,而不是派生字体,则它存在。这不适用于等宽字体。

这是它的来源: Javascript/CSS 字体检测器(ajaxian.com;2007 年 3 月 12 日)

measureTextcanvas元素使用的另一种方法github.com/Wildhoney/DetectFont
2021-04-02 01:37:42

我写了一个简单的 JavaScript 工具,你可以用它来检查是否安装了字体。
它使用简单的技术,在大多数情况下应该是正确的。

github 上的jFont 检查器

我写了一个适用于所有浏览器的类。它是用编译为 JS 的 Smart Pascal 编写的,所以我无法真正在此处发布解决方案 - 但简而言之,我必须提取字体系列字符串,然后检查每个字体是否有效,获取第一个有效的字体 - 然后无处不在。我将“字体检测器”移植到 smart pascal 并做了一些调整。
2021-03-19 01:37:42
@JonLennartAasenden 这听起来不像你的class是万无一失的。如果已安装,浏览器将按给定的优先级检查每种字体,但有时会选择使用列表中优先级较低的字体,如果优先级较高的已安装字体缺少与请求大小不匹配的字符或字形。
2021-03-26 01:37:42
@JonLennartAasenden 要获得使用过的字体,我相信您可以使用“computedStyle”属性(我忘记了确切的名称,但它是类似的东西。)
2021-04-01 01:37:42
字体检测不能解决问题。您可以使用它来迭代声明的字体并检查哪些是有效的,但它几乎没有或没有关于任何给定 div 使用什么字体的信息。如果您从 JS 创建 div,我们如何知道使用的是什么字体?
2021-04-05 01:37:42

@pat 实际上,Safari 没有提供使用的字体,Safari 总是返回堆栈中的第一个字体,无论是否安装,至少在我的经验中是这样。

font-family: "my fake font", helvetica, san-serif;

假设 Helvetica 是安装/使用的那个,你会得到:

  • Safari 中的“我的假字体”(我相信其他 webkit 浏览器)。
  • Gecko 浏览器和 IE 中的“我的假字体,黑体,san-serif”。
  • Opera 9 中的“helvetica”,尽管我读到他们正在 Opera 10 中更改它以匹配 Gecko。

我解决了这个问题并创建了Font Unstack,它测试堆栈中的每个字体并仅返回第一个安装的字体。它使用@MojoFilter 提到的技巧,但如果安装了多个,则只返回第一个。尽管它确实存在@tlrobinson 提到的弱点(Windows 将默默地用 Arial 代替 Helvetica 并报告已安装 Helvetica),但它在其他方面运行良好。

一种有效的技术是查看元素的计算样式。这在 Opera 和 Firefox 中受支持(我在 safari 中侦察,但尚未测试)。IE(至少 7)提供了一种获取样式的方法,但它似乎是样式表中的任何内容,而不是计算样式。有关 quirksmode 的更多详细信息:获取样式

这是一个简单的函数来获取元素中使用的字体:

/**
 * Get the font used for a given element
 * @argument {HTMLElement} the element to check font for
 * @returns {string} The name of the used font or null if font could not be detected
 */
function getFontForElement(ele) {
    if (ele.currentStyle) { // sort of, but not really, works in IE
        return ele.currentStyle["fontFamily"];
    } else if (document.defaultView) { // works in Opera and FF
        return document.defaultView.getComputedStyle(ele,null).getPropertyValue("font-family");
    } else {
        return null;
    }
}

如果对此的 CSS 规则是:

#fonttester {
    font-family: sans-serif, arial, helvetica;
}

如果已安装,则应返回 helvetica,如果未安装,则返回 arial,最后返回系统默认 sans-serif 字体的名称。请注意,CSS 声明中字体的顺序很重要。

您还可以尝试的一个有趣的技巧是创建许多具有许多不同字体的隐藏元素,以尝试检测机器上安装了哪些字体。我相信有人可以用这种技术制作一个漂亮的字体统计信息收集页面。

这将返回完整的 css 字符串,如“Helvetica,Arial,sans-serif”。它不会返回正在使用的实际字体。
2021-03-19 01:37:42

一个简化的形式是:

function getFont() {
    return document.getElementById('header').style.font;
}

如果您需要更完整的内容,请查看此内容