Last active
February 24, 2024 15:04
-
-
Save fijiwebdesign/3b0bf8e88ceef7518844 to your computer and use it in GitHub Desktop.
Detect available fonts with JS
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* JavaScript code to detect available availability of a | |
* particular font in a browser using JavaScript and CSS. | |
* | |
* Author : Lalit Patel | |
* Website: http://www.lalit.org/lab/javascript-css-font-detect/ | |
* License: Apache Software License 2.0 | |
* http://www.apache.org/licenses/LICENSE-2.0 | |
* Version: 0.15 (21 Sep 2009) | |
* Changed comparision font to default from sans-default-default, | |
* as in FF3.0 font of child element didn't fallback | |
* to parent element if the font is missing. | |
* Version: 0.2 (04 Mar 2012) | |
* Comparing font against all the 3 generic font families ie, | |
* 'monospace', 'sans-serif' and 'sans'. If it doesn't match all 3 | |
* then that font is 100% not available in the system | |
* Version: 0.3 (24 Mar 2012) | |
* Replaced sans with serif in the list of baseFonts | |
*/ | |
/** | |
* Usage: d = new FontDetector(); | |
* d.detect('font name'); | |
*/ | |
var FontDetector = function() { | |
// a font will be compared against all the three default fonts. | |
// and if it doesn't match all 3 then that font is not available. | |
var baseFonts = ['monospace', 'sans-serif', 'serif']; | |
//we use m or w because these two characters take up the maximum width. | |
// And we use a LLi so that the same matching fonts can get separated | |
var testString = "mmmmmmmmmmlli"; | |
//we test using 72px font size, we may use any size. I guess larger the better. | |
var testSize = '72px'; | |
var h = document.getElementsByTagName("body")[0]; | |
// create a SPAN in the document to get the width of the text we use to test | |
var s = document.createElement("span"); | |
s.style.fontSize = testSize; | |
s.innerHTML = testString; | |
var defaultWidth = {}; | |
var defaultHeight = {}; | |
for (var index in baseFonts) { | |
//get the default width for the three base fonts | |
s.style.fontFamily = baseFonts[index]; | |
h.appendChild(s); | |
defaultWidth[baseFonts[index]] = s.offsetWidth; //width for the default font | |
defaultHeight[baseFonts[index]] = s.offsetHeight; //height for the defualt font | |
h.removeChild(s); | |
} | |
function detect(font) { | |
var detected = false; | |
for (var index in baseFonts) { | |
s.style.fontFamily = '"' + font + '"' + ',' + baseFonts[index]; // name of the font along with the base font for fallback. | |
h.appendChild(s); | |
var matched = (s.offsetWidth != defaultWidth[baseFonts[index]] || s.offsetHeight != defaultHeight[baseFonts[index]]); | |
h.removeChild(s); | |
detected = detected || matched; | |
} | |
return detected; | |
} | |
this.detect = detect; | |
}; |
I'd change
document.getElementsByTagName("body")[0];to
document.body;
Is this code supposed to work? I tried it in jsfiddle (https://jsfiddle.net/sekwxLg4/) but the run area stays empty
It works for Arial:
// example
f = new FontDetector()
console.log('detect', f.detect('Arial'))
Regards,
Gabe.
…------
Gabiriele Lalasava
Founder - Seedess P2P Video Streaming
https://seedess.com/
+1 (323) 454-3430
***@***.***
On Tue, Nov 2, 2021 at 5:17 PM sfederici ***@***.***> wrote:
***@***.**** commented on this gist.
------------------------------
I'd change
document.getElementsByTagName("body")[0];
to
document.body;
Is this code supposed to work? I tried it in jsfiddle (
https://jsfiddle.net/sekwxLg4/) but the run area stays empty
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
<https://gist.github.com/3b0bf8e88ceef7518844#gistcomment-3948260>, or
unsubscribe
<https://github.com/notifications/unsubscribe-auth/AAGFQMYEMIAJKD2XLQ74MKDUJ6UDXANCNFSM4MEIBW2Q>
.
Triage notifications on the go with GitHub Mobile for iOS
<https://apps.apple.com/app/apple-store/id1477376905?ct=notification-email&mt=8&pt=524675>
or Android
<https://play.google.com/store/apps/details?id=com.github.android&referrer=utm_campaign%3Dnotification-email%26utm_medium%3Demail%26utm_source%3Dgithub>.
Could we use WebGL to detect fonts without blocking main DOM context?
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I'd change
to