Webフォントを利用する際に知っておくと役立ちそうなTipsとかサイトいろいろ

Ads

Warning: Undefined array key "HTTP_USER_AGENT" in /home/youhei0828/kachibito.net/public_html/wp-content/themes/kachibito7_with_cocoon_child/functions-module/other/tiny-fixed.php on line 75

この記事は年以上前に書かれたもので、内容が古かったり、セキュリティ上の問題等の理由でリンクが解除されている可能性があります。

Webフォントに関して調べ物をしたので
個人的なメモ。少し利用頻度があがって
来たので探しやすいようにまとめておき
ます。まだちょっと使い慣れてないので
もう少し勉強しないとダメですね・・
スマフォ向けのリソースもあります。

というわけでWebフォントに関するメモです。以前触りだけしか書かなかったのでもう少し深く調べておこうと思い記事にしました。ので、過去の記事と結構重複します。

最低限の知識

最低限かどうか分かりませんけどw 少し不明瞭な点もありますので間違いがあればご指摘頂けると幸いです。

ライセンス

まずライセンスですが、通常、Webフォントとして利用するには当然フォントの著作者次第になります。

Webフォントとして使うにはサーバーにフォントファイルをアップロードしてcssでファイルのパスを指定して利用するので、フォントファイルが誰でも手に入れられてしまう事になります。(アイコンなんかも同じなんですが)

こうしたリスクがあるため、フォントファウンダリ側に、その旨の使用許諾が必要になる場合もありますし、現に配布済みの使用許諾書にも影響が生じかねませんので無料で配布されてるからと言って簡単にWebフォントに利用する訳にも行かない、という事のようです(多分)。仮に再配布OKのフォントだとしても、=Webフォントに利用しても良いとは限りませんので注意が必要です。

最も確実なのはパブリックドメインのフォントを利用することです。著作権が切れていれば利用は自由、もちろんWebフォントにも使えますね。

利用法

何度かWebフォントに関して記事を書いてきましたが、少し古めの記事ですが安全な@font-faceの書き方という記事がとても分かりやすく勉強になりました。なぜ安全なのか、は元記事をご覧下さい。

記述法は以下。

@font-face {
  font-family: 'example';
  src: url(example.eot);
  src: local('example Regular'), local('example'),
         url(example.otf) format('opentype');
}

eotフォーマットはIE用となりますので、ttfやotfしか無い場合等は、これまたファウンダリ側にttfからeotへのコンバートの許可を得る必要がある可能性も出てきます。なかなか難しいですね。

また、以下のような書き方も見かけます。(参照:The New Bulletproof @Font-Face Syntax)

@font-face {  
  font-family: 'example';  
  src: url('example.eot?#iefix') format('eot'),  // for IE6-8  
         url('example.woff') format('woff'), // for IE9, Firefox3.6+, Chrome6+  
         url('example.ttf')  format('truetype'), // for Safari, iOS4.2+  
         url('example.svg#svgFontName') format('svg'); // for others  
}

この書き方の場合、IE9以下だと、src:を複数指定した場合、無視するバグがあるそうですが、拡張子の後に?を含めることでそれ以降の文字をクエリ文字として認識する為、最初のeotをフォントファイルとして認識してくれる、という事みたいです。IEがformat()を解釈できないから、では無いのかな?ちょっとよくわかりませんがIEは総じて困るよねという話。

woffというのはMozillaを含む多くのフォントファウンダリが共同で提案したWebフォント専用のフォーマットで、Google Font APIもこちらを採用しています。

Google Font APIのcssを見ると、このようにwoffだけを採用しています。もしかしてこのフォーマット一つでOKなんですかね・・

[note]コメントいただきました!ありがとうございます!IEでcssを開くとちゃんとeotが読み込まれています。ブラウザで振り分けてたんですねー。素晴らしい。[/note]

@media screen {
@font-face {
  font-family: 'Anton';
  font-style: normal;
  font-weight: normal;
  src: local('Anton'), url('http://themes.googleusercontent.com/static/fonts/anton/v2/tilmJBBU81h1G7ZsdY3Hmw.woff') format('woff');
}
}

woffだけでOKみたいな記事はちょっと見かけませんでしたが・・この辺勉強不足です。

多少もやもやしますが一応現状で、より確実な書き方は2番目の方法かなぁという結論に達しました。

使用例1

Patua Oneを使用しました→Google Web Fonts Patua One

I am Patua One

使用例2

Antonを使用しました。→Google Web Fonts Anton

I am Anton

メリットとデメリット

さて、Webフォントのメリットやデメリットはどうなんだ、という話ですが、なんとなく和文フォントをWebフォントで利用する、という事に関しては賛否で分かれる印象です。それは日本語圏である事も大きく関わっているかもしれません。

日本語フォントはその文字量の関係で基本的にサイズが大きく、例えWebフォントに利用できたとしてもファイルのロードに時間がかかります。

このロード時間を抑えるために、現状はサブセット化することで短縮しているようです。サブセット化・・というのは使う文字だけ残して後は削除する等してファイル数を減らす施工です。こうすることでロード時間の問題は多少解決できます。例えばフォントプラスというサービスは動的にサブセット化しているようです。

ページ内に必要な文字だけを抽出してデータを軽く。

フォントプラスのシステムはウェブサイトのページ内の文章を自動で解析。そのページ内に使われている文字だけを抽出し、軽量化したフォントデータを自動で作成します。不必要なデータを読み込まないことにより、ウェブサイトのダウンロードの時間を短縮できます。
(via:フォントプラス)

管理的な問題として汎用性に欠ける手動サブセット化ではなく、動的なサブセット化(jsが一般的みたいです)が必要になってくると思いますが、例えばHTML5のcanvas等に使うときはフォントファイルが事前にロードされている必要があるのに対し、jsによる動的なサブセット化では事前にロード出来ない事もあるようです。(参考:@IT)また、サブセット化するという事は当然加工に当たりますのでフォントファウンダリからの許可も必要となってきます。加工OKで2次配布もOK、誰にでもフォントファイルをダウンロードされてもOKな日本語フォント・・と考えるとやはりハードルは高そうですね。

その点、パブリックドメインの欧文フォントは数多く存在し、ファイルサイズも軽量、Webフォントとして許可されているフォントも多く存在します。普通に読み込めますのでcanvasの問題などもありません。日本語フォントでパブリックドメインのものは現状では無いと思いますが、あったとすればサブセット化も自由ですね。

メリットだけとは言えないものの、コンテンツを変更したいときにPhotoshopを立ち上げ、スライスし、画像をアップロードなどの手間を省けるという管理のしやすさ、検索エンジンフレンドリーな点、css3やjsなどで動的なエフェクトを表現出来る、コストや工数削減等、利用するメリットがあることも確かです。なので、今のうちから多少覚えておいても損はしないかなというのが個人的な見解です。まだ研究段階ですね。

さて、余談が長くなりましたが、以下がWebフォントの利用の際に役立ちそうなリソースサイトです。説明はあまり要らないサイトばかりなので適当に済ませています。

欧文フォント

Google Font API

最も利用されている印象です。GoogleでホスティングされているWebフォントで、自由に利用する事が出来ます。種類も400近くありますし、コードも出してくれるので楽で良いですね。

Google Font API

Open Font Library

パブリックドメインのフォントのみを収集しているサイトです。こちらのフォントも勿論Webフォントとして自由に利用する事が出来ます。コンバートもOK。
すみません、様々なライセンスのフォントがありました。それぞれご覧下さい。失礼致しました。

Open Font Library

Font Squirrel

Webフォントに利用できるフォントを配布しているサイト。一番見に行ってるかもしれません。

fontsquirrel

和文フォント

WebFonts として利用できるフリーの和文フォント

ピクセルグリッドの方の有益なまとめ記事です。よく紹介されているフォントを利用しても良いか、コンバートはOKか、サブセット化はOKか、なども書かれています。

WebFonts として利用できるフリーの和文フォント

M+ WEB FONTS

無料の日本語フォントとしても知られるM+がttfのみsourceforge.jpにてホスティングされており、Webフォントとして利用する事が出来ます。

M+ WEB FONTS

フォントプラス

先ほどご紹介したWebフォントの有料サービス。動的にサブセット化してくれるのでロードに時間がかかりにくいみたいです。

フォントプラス

モリサワ クラウドフォント

最も一般的に利用されている和文フォントブランドのモリサワが提供してくれる・・・はずなんですが、まだみたいですね。一応忘れないようにメモ。

モリサワ クラウドフォント

デコもじ

有名な日本語Webフォントサービス。勿論有料のサービスですが、無料で自由に試せるので無料プランから使ってみるといいかもですね。ただ、個人的な意見ですが僕はクライアントワークには利用しないと思います。

デコもじ

もじでぱ

デコもじ同様、有料の和文フォントサービスです。こちらも有料と無料プランがあります。こちらもクライアントワークには利用しないかな。

もじでぱ

ツール

WhatFont bookmark

僕も頻繁に使っていますが、Webサイト内で使用されているWebフォントの名前をサクッと調べられるブックマークレットです。これはオススメしています。

WhatFont bookmark

ttf2eot

ttfをIEに必要なeotフォーマットにコンバートしてくれるツールです。コンバート前にフォントのライセンスに注意してください。

ttf2eot

FF Subsetter

英字フォントのみですが、サブセット化してくれるツールだそうです。フォントブログさんで知りました。使い方も書いてくれています。

FF Subsetter

Web Font Specimen


Webフォントの様々なシーンでの見栄えを確認出来る、というもの。だそうです。(未検証)A List Apartで知りました。

Web Font Specimen

ROCKWELL


PCにインストールされているフォントでWeb上での表示確認が出来ます。

ROCKWELL

@FONT-FACE GENERATOR


先ほどのFont Squirrelが提供するコンバーターです。WOFFにも対応。2年前に記事を書きました

@FONT-FACE GENERATOR

JavaScript

Webフォントと併用するっぽいライブラリです。

LETTERING.JS

1文字づつspanでラップしてくれるライブラリ。楽しいことが出来そうです。:nth-child()と相性良さそうです。

LETTERING.JS

Kern.js

こちらはツールに入れるべきだったんですが、上記LETTERING.JS用のブックマークレットなのでこちらに。LETTERING.JS用にカーニングして、cssを吐き出すブックマークレットです。

Kern.js

FitText

ディスプレイの解像度に合わせてテキストサイズをフィットさせるライブラリ・・・使う予定はまだ無いですけどよく見かけますね。

FitText

Kerning.js

カーニング可能なライブラリ。以前ご紹介しましたのでご参照下さい。

Kerning.js

ギャラリー

Web Font Awards

Webフォントを利用しているWebサイトのデザインコンテストです。Galleryからいろいろ見れます。

Web Font Awards

the WEB FONTS gallery

こちらもデザインギャラリーです。以前ご紹介しました。

the WEB FONTS gallery

ギャラリー2個しかなかったw

前述したとおり、Webフォントに関してはメリットだけでなく、まだまだ問題を抱えている技術です。サイズの量、ライセンスだけでなく、見栄えもよく論点に上がりますので、Webフォント超オススメ!とは言いませんが、覚えて損は無い知識だなぁとも思いますし、Googleのおかげでかなり手軽に使えますので気が向いたら一度使ってみてはいかがでしょうか。

以上、Webフォントに関するTipsやツールのまとめでした。

version 3.0.83 (Wed, 16 Apr 2014 03:56:09 GMT)
http://alexgorbatchev.com/SyntaxHighlighter
JavaScript code syntax highlighter.
Copyright 2004-2013 Alex Gorbatchev.
If you like this script, please donate to
keep development active!

'}},vars:{discoveredBrushes:null,highlighters:{}},brushes:{},regexLib:{multiLineCComments:XRegExp("/\\*.*?\\*/","gs"),singleLineCComments:/\/\/.*$/gm,singleLinePerlComments:/#.*$/gm,doubleQuotedString:/"([^\\"\n]|\\.)*"/g,singleQuotedString:/'([^\\'\n]|\\.)*'/g,multiLineDoubleQuotedString:XRegExp('"([^\\\\"]|\\\\.)*"',"gs"),multiLineSingleQuotedString:XRegExp("'([^\\\\']|\\\\.)*'","gs"),xmlComments:XRegExp("(<|<)!--.*?--(>|>)","gs"),url:/https?:\/\/[\w-.\/?%&=:@;#]*/g,phpScriptTags:{left:/(<|<)\?(?:=|php)?/g,right:/\?(>|>)/g,eof:!0},aspScriptTags:{left:/(<|<)%=?/g,right:/%(>|>)/g},scriptScriptTags:{left:/(<|<)\s*script.*?(>|>)/gi,right:/(<|<)\/\s*script\s*(>|>)/gi}},toolbar:{getHtml:function(e){function t(e,t){return B.toolbar.getButtonHtml(e,t,B.config.strings[t])}for(var n='

',r=B.toolbar.items,i=r.list,a=0,l=i.length;l>a;a++)n+=(r[i[a]].getHtml||t)(e,i[a]);return n+="

"},getButtonHtml:function(t,n,r){return n=e(n),''+e(r)+""},handler:function(e){function t(e){var t=RegExp(e+"_(\\w+)"),n=t.exec(r);return n?n[1]:null}var n=e.target,r=n.className||"",i=s(g(n,".syntaxhighlighter").id),a=t("command");i&&a&&B.toolbar.items[a].execute(i),e.preventDefault()},items:{list:["expandSource","help"],expandSource:{getHtml:function(e){if(1!=e.getParam("collapse"))return"";var t=e.getParam("title");return B.toolbar.getButtonHtml(e,"expandSource",t?t:B.config.strings.expandSource)},execute:function(e){var t=o(e.id);r(t,"collapsed")}},help:{execute:function(){var e=x("","_blank",500,250,"scrollbars=0"),t=e.document;t.write(B.config.strings.aboutDialog),t.close(),e.focus()}}}},findElements:function(e,t){var n=t?[t]:i(document.getElementsByTagName(B.config.tagName)),r=B.config,a=[];if(r.useScriptTags&&(n=n.concat(A())),0===n.length)return a;for(var l=0,s=n.length;s>l;l++){var o={target:n[l],params:p(e,E(n[l].className))};null!=o.params.brush&&a.push(o)}return a},highlight:function(e,t){var n=this.findElements(e,t),r="innerHTML",i=null,a=B.config;if(0!==n.length)for(var l=0,s=n.length;s>l;l++){var o,t=n[l],u=t.target,c=t.params,g=c.brush;if(null!=g){if("true"==c["html-script"]||1==B.defaults["html-script"])i=new B.HtmlScript(g),g="htmlscript";else{var h=b(g);if(!h)continue;i=new h}o=u[r],a.useScriptTags&&(o=M(o)),""!=(u.title||"")&&(c.title=u.title),c.brush=g,i.init(c),t=i.getDiv(o),""!=(u.id||"")&&(t.id=u.id),u.parentNode.replaceChild(t,u)}}},all:function(e){m(window,"load",function(){B.highlight(e)})}};return B.Match=function(e,t,n){this.value=e,this.index=t,this.length=e.length,this.css=n,this.brushName=null},B.Match.prototype.toString=function(){return this.value},B.HtmlScript=function(e){function t(e,t){for(var n=0,r=e.length;r>n;n++)e[n].index+=t}function n(e){for(var n,a=e.code,l=[],s=r.regexList,o=e.index+e.left.length,u=r.htmlScript,c=0,g=s.length;g>c;c++)n=L(a,s[c]),t(n,o),l=l.concat(n);null!=u.left&&null!=e.left&&(n=L(e.left,u.left),t(n,e.index),l=l.concat(n)),null!=u.right&&null!=e.right&&(n=L(e.right,u.right),t(n,e.index+e[0].lastIndexOf(e.right)),l=l.concat(n));for(var h=0,g=l.length;g>h;h++)l[h].brushName=i.brushName;return l}var r,i=b(e),a=new B.brushes.Xml,l=this,s="getDiv getHtml init".split(" ");if(null!=i){r=new i;for(var o=0,u=s.length;u>o;o++)(function(){var e=s[o];l[e]=function(){return a[e].apply(a,arguments)}})();return null==r.htmlScript?(v(B.config.strings.brushNotHtmlScript+e),void 0):(a.regexList.push({regex:r.htmlScript.code,func:n}),void 0)}},B.Highlighter=function(){},B.Highlighter.prototype={getParam:function(e,t){var n=this.params[e];return d(null==n?t:n)},create:function(e){return document.createElement(e)},findMatches:function(e,t){var n=[];if(null!=e)for(var r=0,i=e.length;i>r;r++)"object"==typeof e[r]&&(n=n.concat(L(t,e[r])));return this.removeNestedMatches(n.sort(k))},removeNestedMatches:function(e){for(var t=0,n=e.length;n>t;t++)if(null!==e[t])for(var r=e[t],i=r.index+r.length,a=t+1,n=e.length;n>a&&null!==e[t];a++){var l=e[a];if(null!==l){if(l.index>i)break;l.index==r.index&&l.length>r.length?e[t]=null:l.index>=r.index&&i>l.index&&(e[a]=null)}}return e},figureOutLineNumbers:function(e){var t=[],n=parseInt(this.getParam("first-line"));return y(e,function(e,r){t.push(r+n)}),t},isLineHighlighted:function(e){var t=this.getParam("highlight",[]);return"object"!=typeof t&&null==t.push&&(t=[t]),-1!=h(t,""+e)},getLineHtml:function(e,t,n){var r=["line","number"+t,"index"+e,"alt"+(""+(0==t%2?1:2))];return this.isLineHighlighted(t)&&r.push("highlighted"),0==t&&r.push("break"),'

'+n+"

"},getLineNumbersHtml:function(e,t){var n="",r=a(e).length,i=parseInt(this.getParam("first-line")),l=this.getParam("pad-line-numbers");1==l?l=(""+(i+r-1)).length:1==isNaN(l)&&(l=0);for(var s=0;r>s;s++){var o=t?t[s]:i+s,e=0==o?B.config.space:S(o,l);n+=this.getLineHtml(s,o,e)}return n},getCodeLinesHtml:function(e,t){e=C(e);for(var n=a(e),r=(this.getParam("pad-line-numbers"),parseInt(this.getParam("first-line"))),e="",i=this.getParam("brush"),l=0,s=n.length;s>l;l++){var o=n[l],u=/^( |\s)+/.exec(o),c=null,g=t?t[l]:r+l;null!=u&&(c=""+u[0],o=o.substr(c.length),c=c.replace(" ",B.config.space)),o=C(o),0==o.length&&(o=B.config.space),e+=this.getLineHtml(l,g,(null!=c?''+c+"":"")+o)}return e},getTitleHtml:function(t){return t?"

"+e(t)+"

":""},getMatchesHtml:function(e,t){function n(e){var t=e?e.brushName||a:a;return t?t+" ":""}for(var r=0,i="",a=this.getParam("brush",""),l=0,s=t.length;s>l;l++){var o,u=t[l];null!==u&&0!==u.length&&(o=n(u),i+=N(e.substr(r,u.index-r),o+"plain")+N(u.value,o+u.css),r=u.index+u.length+(u.offset||0))}return i+=N(e.substr(r),n()+"plain")},getHtml:function(t){var n,r,i,a="",s=["syntaxhighlighter"];return 1==this.getParam("light")&&(this.params.toolbar=this.params.gutter=!1),className="syntaxhighlighter",1==this.getParam("collapse")&&s.push("collapsed"),0==(gutter=this.getParam("gutter"))&&s.push("nogutter"),s.push(this.getParam("class-name")),s.push(this.getParam("brush")),t=w(t).replace(/\r/g," "),n=this.getParam("tab-size"),t=1==this.getParam("smart-tabs")?R(t,n):H(t,n),this.getParam("unindent")&&(t=P(t)),gutter&&(i=this.figureOutLineNumbers(t)),r=this.findMatches(this.regexList,t),a=this.getMatchesHtml(t,r),a=this.getCodeLinesHtml(a,i),this.getParam("auto-links")&&(a=I(a)),"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.match(/MSIE/)&&s.push("ie"),a='

'+(this.getParam("toolbar")?B.toolbar.getHtml(this):"")+''+this.getTitleHtml(this.getParam("title"))+""+""+(gutter?'":"")+'"+""+""+"
'+this.getLineNumbersHtml(t)+"'+'
'+a+"
"+"
"+"

"},getDiv:function(e){null===e&&(e=""),this.code=e;var t=this.create("div");return t.innerHTML=this.getHtml(e),this.getParam("toolbar")&&m(c(t,".toolbar"),"click",B.toolbar.handler),this.getParam("quick-code")&&m(c(t,".code"),"dblclick",X),t},init:function(e){this.id=f(),u(this),this.params=p(B.defaults,e||{}),1==this.getParam("light")&&(this.params.toolbar=this.params.gutter=!1)},getKeywords:function(e){return e=e.replace(/^\s+|\s+$/g,"").replace(/\s+/g,"|"),"\\b(?:"+e+")\\b"},forHtmlScript:function(e){var t={end:e.right.source};e.eof&&(t.end="(?:(?:"+t.end+")|$)"),this.htmlScript={left:{regex:e.left,css:"script"},right:{regex:e.right,css:"script"},code:XRegExp("(?"+e.left.source+")"+"(?.*?)"+"(?"+t.end+")","sgi")}}},B}();"undefined"!=typeof exports?exports.SyntaxHighlighter=SyntaxHighlighter:null