定義されたフォントのどれがWebページで使用されたかを検出する方法は?


138

ページに次のCSSルールがあるとします。

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

ユーザーのブラウザで使用された定義済みフォントの1つを検出するにはどうすればよいですか?

なぜこれをしたいのかと思っている人のために編集します:検出しているフォントには他のフォントでは使用できないグリフが含まれており、ユーザーがそのフォントを持っていない場合は、ユーザーにそのフォントをダウンロードするように求めるリンクを表示します私のWebアプリケーションを正しいフォントで使用できます。

現在、すべてのユーザーにダウンロードフォントリンクを表示しています。正しいフォントがインストールされていないユーザーにのみ表示したいと考えています。


2
覚えておくべきことの1つは、一部のブラウザーは特定の欠落しているフォントを類似のフォントに置き換えることです。これは、JavaScript / CSSトリックを使用して検出することは不可能です。たとえば、Windowsブラウザーがインストールされていない場合、Helveticaの代わりにArialが使用されます。MojoFilterとdragonmatankが言及したトリックは、Helveticaがインストールされていなくても、インストールされていることを報告します。
tlrobinson 2008

13
注意点:Calibriをダウンロードするためのリンクを提供する場合は、いくつかのMicrosoft製品にバンドルされていますが、それはフリーフォントではなく、ダウンロード用に提供することで著作権を侵害していることに注意してください。
アダムヘプトン

回答:


72

私はそれが一種の疑わしいがかなり信頼できる方法で行われるのを見ました。基本的に、要素は特定のフォントを使用するように設定され、文字列はその要素に設定されます。要素のフォントセットが存在しない場合は、親要素のフォントを使用します。つまり、レンダリングされた文字列の幅を測定します。派生フォントとは対照的に、目的のフォントに対して期待されたものと一致する場合は、存在します。これは、等幅フォントでは機能しません。

これがどこから来たのか: Javascript / CSS Font Detector(ajaxian.com; 2007年3月12日)


2
要素measureTextから使用する別のアプローチcanvasgithub.com/Wildhoney/DetectFont
Wildhoney

33

フォントがインストールされているかどうかを確認するために使用できる簡単なJavaScriptツールを作成しました。
それは簡単なテクニックを使用し、ほとんどの場合正しいはずです。

github上の jFont Checker


2
フォント検出は問題を解決しません。これを使用して、宣言されたフォントを繰り返し処理して有効なものを確認できますが、特定のdivで使用されているフォントに関する情報はほとんどまたはまったく提供されません。JSからdivを作成する場合、どのフォントが使用されているかをどのようにして知ることができますか?
Jon Lennart Aasenden 2014

1
私はあなたが「computedStyle」プロパティを使用することができると信じて使用するフォント(。私はそのような何かを正確に名前を忘れてしまったが、それの)を取得するには@JonLennartAasenden
デレク・朕會功夫

1
すべてのブラウザで機能するクラスを作成しました。それはJSにコンパイルするSmart Pascalで書かれているので、実際にここに解決策を投稿することはできません-要するに、フォントファミリー文字列を抽出し、各フォントが有効であることを確認し、有効な最初のフォントを取得する必要がありました。どこでも動作します。「フォント検出機能」をSmart Pascalに移植し、微調整を行いました。
Jon Lennart Aasenden 2014

1
@JonLennartAasendenそれはあなたのクラスが誰にでもできるような音ではありません。ブラウザは、インストールされている場合、指定された優先度で各フォントをチェックしますが、リストで優先度の低いフォントを使用することを選択する場合があります。優先度が高いインストールされているフォントに、要求されたサイズと一致しない文字またはグリフがない場合があります。
ブランドンエリオット

10

@pat実際には、Safariは使用されるフォントを提供しません。Safariは、少なくとも私の経験では、インストールされているかどうかに関係なく、常にスタックの最初のフォントを返します。

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

Helveticaがインストール/使用されていると仮定すると、次のようになります。

  • Safariでの「私の偽のフォント」(そして私は他のWebkitブラウザを信じています)。
  • GeckoブラウザーおよびIEでの「私の偽のフォント、helvetica、san-serif」。
  • Opera 9の「helvetica」は、Geckoに合わせてOpera 10でこれを変更していると読みました。

私はこの問題に合格し、スタック内の各フォントをテストし、最初にインストールされたフォントのみを返すFont Unstackを作成しました。@MojoFilterが言及するトリックを使用しますが、複数がインストールされている場合にのみ最初のトリックを返します。@tlrobinsonが言及している弱点に悩まされていますが(WindowsはHelveticaの代わりにArialをサイレントに置き換え、Helveticaがインストールされていると報告します)、それ以外の場合はうまく機能します。


9

機能する手法は、計算された要素のスタイルを確認することです。これは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宣言でのフォントの順序は重要です。

あなたが試すことができる興味深いハックは、マシンにインストールされているフォントを検出するために、たくさんの異なるフォントを使ってたくさんの隠し要素を作成することです。誰かがこのテクニックで気の利いたフォント統計収集ページを作ることができると私は確信しています。


6
これは、 "Helvetica、Arial、sans-serif"のようなCSSの完全な文字列を返します。使用されている実際のフォントは返しません。
トムキンケイド2013年

8

簡略化したフォームは次のとおりです。

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

より完全なものが必要な場合は、これをチェックてください。


8

簡単な解決策があります-使用するだけelement.style.fontです:

function getUserBrowsersFont() {
    var browserHeader = document.getElementById('header');
    return browserHeader.style.font;
}

この関数は、まさにあなたが望むことをします。実行時、ユーザー/ブラウザのフォントタイプを返します。これがお役に立てば幸いです。


Arialフォントが確実に含まれている要素に対してSafariでこれを試しているところ、フォントとして「」が表示されています。理由について何か考えはありますか?
アレッサンドロバーミューレン2013

最も可能性の高い理由は、これは設定されたフォントのみをチェックするためです。フォントセットがない場合は、おそらくArialをフォントとして使用しています。
ジョサイア

1
@AlessandroVermeulenこれは、element.styleがスタイル属性に設定された値のみを返し、他の場所から値を返さないためです(つまり、スタイル要素、外部css、またはユーザーエージェントのデフォルトからの値は返されません)。この回答は誤解を招く/正しくないため、削除する必要があります。賞金がもらえたなんて信じられない!
brennanyoung

申し訳ありませんが、これは正しい答えではないと思います。これにより、そのCSSプロパティの値が出力されますが、ブラウザで使用されている実際のレンダリングフォントは返されません。
wentjun

7

別の解決策は、フォントを自動的にインストールすることです@font-face。これにより、検出の必要がなくなります。

@font-face { 
font-family: "Calibri"; 
src: url("http://www.yourwebsite.com/fonts/Calibri.eot"); 
src: local("Calibri"), url("http://www.yourwebsite.com/fonts/Calibri.ttf") format("truetype");
}

もちろん、著作権の問題は解決しませんが、フリーウェアのフォントを使用したり、独自のフォントを作成したりできます。最適に動作するには、.eot.ttfファイルの両方が必要です。


3

CalibriはMicrosoftが所有するフォントであり、無料で配布するべきではありません。また、特定のフォントをダウンロードするようにユーザーに要求することは、あまりユーザーフレンドリーではありません。

フォントのライセンスを購入し、それをアプリケーションに埋め込むことをお勧めします。


3
フォント埋め込みの場合は+1。これにより、何も検出せずに問題が解決されます。
Andrew Grothe 2013年

1
何かを購入する前に、Google Fontsで類似したものがないか確認することをお勧めします
OJFord 2014年

ただし、ユーザーがWindowsマシンを使用している場合は、Calibriを表示できます。これがフォールバックリストの要点です。
dudewad 2015

1
そして、あなたの答えは質問とは関係なく、コメントでなければなりません。
dudewad 2015

2

Fountを使用しています。ファウントボタンをブックマークバーにドラッグしてクリックし、Webサイト上の特定のテキストをクリックするだけです。次に、そのテキストのフォントが表示されます。

https://fount.artequalswork.com/



1

表示したいフォントの後ろのフォントファミリにAdobe Blankを配置すると、そのフォントにないグリフはレンダリングされません。

例えば:

font-family: Arial, 'Adobe Blank';

私が知る限り、要素内のどのグリフがその要素のフォントスタック内のどのフォントによってレンダリングされているかを通知するJSメソッドはありません。

これは、ブラウザにserif / sans-serif / monospaceフォントのユーザー設定があり、グリフがフォント内に見つからない場合に使用する独自のハードコードされたフォールバックフォントもあるという事実によって複雑になります。フォントスタック。そのため、ブラウザは、フォントスタックまたはユーザーのブラウザのフォント設定にないフォントで一部のグリフをレンダリングする場合があります。 Chrome Dev Toolsは、選択された要素のグリフに対してレンダリングされた各フォントを表示します。つまり、あなたのマシンでは、それが何をしているかを見ることができますが、ユーザーのマシンで何が起こっているのかを知る方法はありません。

たとえば、ウィンドウがグリフレベルでフォントの置換を行うように、ユーザーのシステムがこれに関与する可能性もあります。

そう...

興味のあるグリフについては、指定したフォントがなくても、ユーザーのブラウザ/システムのフォールバックによってレンダリングされるかどうかを知る方法はありません。

あなたはJSでそれをテストしたい場合は、Adobeの空白を含むフォントファミリと個々のグリフをレンダリングし、それがゼロであるかどうかを確認するために自分の幅を測定、可能性がしかし、あなたは、各グリフと徹底した反復処理する必要があると思いますが、テストしたい各フォントを、しかし、要素のフォントスタック内のフォントを知ることはできますが、ユーザーのブラウザーがどのフォントを使用するように構成されているかを知る方法はないため、少なくとも一部のユーザーについては、繰り返し処理するフォントのリストが不完全になります。(新しいフォントが出てきて慣れ始めた場合も、将来の保証にはなりません。)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.