当 CSS 中未定义字体时,如何获取实际渲染的字体?
当 CSS font-face
和 font-size
属性未定义时,如何获取元素的实际字体和字体大小?
例如,JavaScript 片段
object.style.fontFamily
不返回任何值。这是非常明显的,假设 CSS 没有在任何地方对 object
应用样式。但是,当然,使用某种字体来呈现文本,可能是系统字体或网络浏览器默认字体。
例如,JavaScript 可以获取渲染的字体吗?
How do I get the actual font face and font size of an element when the CSS font-face
and font-size
properties are not defined?
For example, the JavaScript snippet
object.style.fontFamily
does not return any value. That's pretty obvious, assuming CSS hasn't applied a style to object
anywhere. But, of course, a certain font is used to render the text, probably the system font or the webbrowser default font.
So can, for instance, JavaScript get that rendered font?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
我建议使用这个函数:
用法:
注意:
getCompulatedStyle
在 IE8 中不起作用。现场演示: http://jsfiddle.net/4mxzE/
I suggest this function:
Usage:
Note:
getComputedStyle
doesn't work in IE8.Live demo: http://jsfiddle.net/4mxzE/
没有标准、可靠的方法来确定实际使用的字体。此处之前的答案将报告样式化的 fontFamily 样式值,但这可以是字体名称列表,并且不会具体标识呈现的实际字体(这是< em>实际问题在这里提出)。
(正如一些评论中提到的,有一些方法可以通过检查视觉提示来猜测字体,但这不太可能 100% 可靠。)
There is no standard, reliable method for determining the actual font being used. The previous answers here will report the styled fontFamily style value, but that can be a list of font names and doesn't specifically identify the actual font rendered (which was the actual question posed here).
(As mentioned in some comments, there are ways to guess at the font by inspecting visual cues, but that isn’t likely to be 100% reliable.)
您可以在 Chrome/Firefox 开发者工具中找到有关渲染字体的信息。尝试检查以下代码片段中的段落:
You can find the information about the rendered font in Chrome/Firefox Developer Tools. Try inspecting the paragraph in the following code snippet:
In Chrome Developer Tools (tested on 55.0.2883.75 m 64-bit) you get the following information:
In Firefox Developer Tools (tested on 47.0.2 with
about:config > devtools.fontinspector.enabled = true
) you get the following information:我找到了一种方法(对于所有支持
的浏览器),如果字体渲染已更改,则通过逐像素检查像素
所以要使用您只需执行以下操作:
如果您将其用于另一种方言(例如日语)您可能需要将
testString
变量更改为该方言中最常见的字符。I found a way (for all browsers which support
<canvas>
), by checking pixel for pixel if the font rendering has changedSo to use you just do:
If you are using this for another dialect (e.g. japanese) you may want to change the
testString
variable to the most common characters in that dialect.来这里有点晚了,但必须解决同样的问题......
Šime Vidas 的答案基本上是正确的,但现在,你可以发挥创意,得到你的答案。
基本上,定义您自己的字体,您确信它与任何现有字体都不匹配。
然后,在每个计算样式字体后面添加您的字体,并查看是否是您的字体被渲染。如果不是,恭喜你,你找到了渲染的字体,
这是小提琴:
https://jsfiddle.net/obutjanw/
这是定义您需要的函数的代码:
请注意您确实应该保留使用字体的节点在加载时附加的部分,否则浏览器可能会在第一次调用 getRenderedFontFamily 时延迟渲染正确的字体
Being a bit late here, but having had to solve the same problem...
Šime Vidas's answer is basically correct, but nowadays, you can get creative, and have your answer.
Basically, define your own font-face, which you are sure does not match any existing font.
Then, add your font after each computedstyle font, and see if it's your font that get rendered. If it's not, congrats, you found the rendered font
Here is the fiddle:
https://jsfiddle.net/obutjanw/
this is the code that defines the function you need:
Note that you really should keep the part were a node using the font is appended on load, as otherwise the browser may be late rendering the corect font on the first call to getRenderedFontFamily
有一种方法可以使用
FontFaceSet
check
方法来确定加载的字体。您可能还想添加字体样式/粗细来检查是否对您的情况很重要。
但请注意,如果字体系列集包含无效的字体条目,它可能会返回不正确的结果(请参阅注释)在文档中 https://developer.mozilla.org/en-US/docs/Web/API/FontFaceSet/check#nonexistent_fonts)。
There is a way to determine the loaded font using the
FontFaceSet
check
method.You may also want to add font style/weight to the check if that matters in your case.
But do note that if the font family set contains an invalid font entry it may return an incorrect result (see note in documentation https://developer.mozilla.org/en-US/docs/Web/API/FontFaceSet/check#nonexistent_fonts).