基礎(chǔ)知識
@font-face雖然是CSS3模塊,但是IE4時代開始就已經(jīng)支持了它,只不過跟現(xiàn)在CSS3的功能相比完全不可比。
先看看http://www.css88.com/book/css/rules/@font-face.htm
可以看出,各種瀏覽器對它的支持五花八門,所以,寫出一個全瀏覽器兼容的定義字體的代碼就很重要。
@font-face的本質(zhì)就是先定義,后使用?,F(xiàn)在我們先定義:
@font-face {
font-family: 'diyfont';
src: url('diyfont.eot'); /* IE9+ */
src: url('diyfont.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
url('diyfont.woff') format('woff'), /* chrome、firefox */
url('diyfont.ttf') format('truetype'), /* chrome、firefox、opera、Safari, Android, iOS 4.2+*/
url('diyfont.svg#fontname') format('svg'); /* iOS 4.1- */
}
這種寫法的原因是:瀏覽器會從前往后嘗試使用字體,優(yōu)先使用eot字體,如果不兼容瀏覽器,就使用woff字體,依然不兼容就使用ttf字體,還不兼容就使用svg字體。
這里需要介紹一下eot格式、ttf格式、woff格式、svg格式。
.eot ,Embedded Open Type,主要用于早期版本的IE,是其專有格式,帶有版權(quán)保護和壓縮。
.ttf ,TrueType,在操作系統(tǒng)里更為常見,在web上使用的話,是為了兼容早期僅支持TTF和OTF的瀏覽器。由于體積比較大,還需要服務器額外壓縮。
.otf,OTF擴展名的O表示OpenType - PostScript字體,采用的是PostScript曲線,支持OpenType高級特性。
.woff ,Web Open Font Format,可以看作是ttf的再封裝,加入了壓縮和字體來源信息,通常比ttf小40%。也是當前web字體的主流格式。
.woff2 ,Web Open Font Format 2.0,相比woff最大的優(yōu)化應該是加強了字體的壓縮比。目前 支持的瀏覽器 只有正在互飆版本號的Chrome和Firefox。
.svg,基于SVG字體渲染的一種格式,支持這種字體的瀏覽器有【Chrome4+,Safari3.1+,Opera10.0+,iOS Mobile Safari3.2+】。
圖標字體
我們看看著名的glyphicons-halflings圖標字體庫都提供了哪些文件:

看來它提供全了。更著名的Font Awesome圖標字體,提供了哪些文件呢?

那么glyphicons-halflings如何聲明呢?
@font-face {
font-family: 'Glyphicons Halflings';
src: url("../fonts/glyphicons-halflings-regular.eot");
src: url("../fonts/glyphicons-halflings-regular.eot?#iefix") format("embedded-opentype"),
url("../fonts/glyphicons-halflings-regular.woff2") format("woff2"),
url("../fonts/glyphicons-halflings-regular.woff") format("woff"),
url("../fonts/glyphicons-halflings-regular.ttf") format("truetype"),
url("../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular") format("svg"); }
再看看Font Awesome怎么聲明的:
@font-face {
font-family: 'FontAwesome';
src: url('../fonts/fontawesome-webfont.eot?v=4.7.0');
src: url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),
url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),
url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),
url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),
url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');
font-weight: normal;
font-style: normal;
}
找到規(guī)律了吧,聲明的順序是:
1、先聲明字體家族的名稱。
2、單獨聲明一個資源,聲明eot。
3、再聲明一個資源,依次聲明eot?#iefix、woff2、woff、otf、ttf、svg#xxx。順序一定不要錯。資源的格式是url('...') format('...')。
現(xiàn)在,我們研究一下怎么使用這兩個字體。其實字體的開發(fā)方會給你提供一個CSS文件,完全不用你自己考慮如何使用字體。大致如下:
.glyphicon {
position: relative;
top: 1px;
display: inline-block;
font-family: 'Glyphicons Halflings';
font-style: normal;
font-weight: normal;
line-height: 1;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
.glyphicon-asterisk:before {
content: "\002a";
}
......
當你想使用一個圖標文字的時候,只需要用一個span標簽,加上兩個類,就可以使用了。
<span class="glyphicon glyphicon-asterisk"></span>
文字字體
現(xiàn)在我只想用一個文字字體,并不想用圖標字體,怎么辦?
首先,我們要去找字體,比如從Google Web Fonts和Dafont.com尋找自己需要的字體?,F(xiàn)在我從Dafont.com下載了一個“Lost in Wild”字體,這個字體長相很囂張。我們試一試。
我把壓縮包下載到本機服務器的www目錄,解壓,里面有otf和ttf兩種文件,分別為60KB和155KB。我先在HTML文件寫一段CSS規(guī)則:
@font-face {
font-family: 'Lost and Wild';
src: url('/lost_in_wild/Lost in Wild.otf') format('opentype'),
url('/lost_in_wild/Lost in Wild.ttf') format('truetype');
font-weight: normal;
font-style: normal;
}
.font-lostandwild {
font-family: 'Lost and Wild';
}
然后構(gòu)建一個簡單的HTML文件,主要內(nèi)容是:
<p class="font-lostandwild">Too young, too simple, sometimes naive!</p>
打開頁面我們看看效果:

雖然看起來很亂,但是我們用起來是成功了。不過請注意,http://www.css88.com/book/css/rules/@font-face.htm 這里已經(jīng)明確顯示,IE6-8是不支持otf/ttf字體的,所以如果要兼容到IE8,你找的字體庫里面必須要含有.eot文件,如果沒有,要么找轉(zhuǎn)換工具做一個.eot文件,要么就放棄這個字體庫。
轉(zhuǎn)換工具:
1、ttf2eot,這是一個node.js實現(xiàn)的庫,使用起來很簡單。
2、微軟的WEFT 3.2,是一個程序,微軟出的程序的易用性不用懷疑。
最后,你可能會問,為啥沒有提中文網(wǎng)絡(luò)字體?中文字體由于體積大,一般都在5MB以上,所以不適合作為網(wǎng)絡(luò)字體使用。有些網(wǎng)站“強行”使用上了中文網(wǎng)絡(luò)字體,用戶體驗很差,因為你剛打開網(wǎng)頁的時候,5MB的字體文件還沒后臺下載下來,所以你看到的字體都是默認字體,等了10秒之后,后臺把字體下載下來,然后網(wǎng)頁會“一抖”,其實是瀏覽器重新渲染一遍字體,然后你才能看到正確的字體。所以,如果你找到了一款2M以內(nèi)的中文字體,就可以嘗試用用,否則沒必要為了字體加大網(wǎng)頁體積,你還有一種方法是把字寫到圖里面,貼一張圖即可。