Fonts
1. CSS font-family
在 CSS 中,可以使用 font-family 屬性來指定字體,瀏覽器渲染文字時候會根據這個屬性應用於元素。如果沒有指定這個屬性或者指定的字體不存在於客戶的計算機上,則瀏覽器會使用默認字體。
<style>
.line {
font-family: 'Courier New', Courier, monospace;
}
</style>
<p>Hello World!</p>
- 如果沒有設置 font-family,瀏覽器會使用默認字體應用於元素。
- 如果 font-family 屬性指定的字體,在本地計算機沒有,則使用默認字體
- 如果字體的名稱有空格,則必須要使用引號。
- 使用 font-family 屬性可以指定一個字體,也可以指定一組字體列表——將多個字體用逗號分割
- 如果指定一組字體列表,則會依次查找,第一個字體本地沒有,則使用第二個。如果指定的字體列表中的字體,本地計算機都沒有,則瀏覽器使用默認字體應用於元素
2. Web safe fonts (網絡安全字體)
系統中通常只有一定數量的字體可用,並且不同的系統中的字體可能不相同,所以在 Windows 上可以用的字體,在其他系統中不一定可以用。
開發者指定的字體,在自己的電腦上已經被安裝,所以可以正常顯示。但客戶端機器並沒有安裝整個字體,則客戶端會使用默認字體顯示。所以開發者考慮哪一些字體是客戶端基本都會被安裝的。
有一些字體在常見系統(Windows, Mac, 常見的Linux發行版, Android和iOS版本)中都可以用,這些字體就是安全字體。
具體參考:
https://developer.mozilla.org/en-US/docs/Learn/CSS/Styling_text/Fundamentals#Web_safe_fonts
3. Web fonts (網絡字體)
Web 字體是一種 CSS 功能,允許指定的字體文件被下載到本地。
這是一種非常有效的方式,這樣字體就不受限於本地是否安裝了字體,而且大部分瀏覽器都支持Web 字體。
網絡字體使用方式:
-
Setp 1 下載網絡字體;在 CSS 中,使用
@font-face
關鍵字下載網絡字體,有2個必要屬性-
src
指定字體資源, -
font-family
自定義一個名稱。
@font-face { font-family: "myFont"; src: url("myFont.ttf"); }
-
-
Setp 2 使用字體;設置
font-family
屬性,而這時font-family
設置的是網絡字體的名稱,而不再是系統的字體。(網絡字體的名稱在上一步已經定義。).line { font-family: 'myFont; }
3.1. 關於Web字體
- Web 字體作為一種技術,從 IE 4 開始就得到了支持。
- 瀏覽器支持不同的字體格式,因此您需要多種字體格式以獲得良好的跨瀏覽器支持。
大多數瀏覽器都支持WOFF/WOFF2(Web Open Font Format versions 1 and 2, Web 開放字體格式版本1和2),它是最有效的格式,但似乎舊版本IE只支持EOT(Embedded Open Type, 嵌入式開放類型)的字體,可能需要包含一個SVG版本的字體支持舊版本的 iPhone 和 Android 瀏覽器。 - 字體一般都不能自由使用。必須為他們付費,或者遵循其他許可條件,比如在代碼中(或者在您的站點上)提供字體創建者。不應該在沒有授權的情況下偷竊字體。
3.2. 字體格式
-
TureType(.ttf)格式
.ttf 字體是 Windows 和 Mac 的最常見的字體,是一種 RAW 格式,支持這種字體的瀏覽器有 ID9+、Firefox3.5+、Chrome4+、Safari3+、Opera10+、iOS Mobile、Safari4.2+
-
OpenType(.otf)格式
.otf 字體被認為是一種原始的字體格式,其內置在 TureType 的基礎上,支持這種字體的瀏覽器有 Firefox 3.5+、Chrome4.0+、Safari3.1+、Opera10.0+、iOS Mobile、Safari4.2+
-
Web Open Font Format(.woff) 格式
.woff 字體是 Web 字體中最佳格式,它是一個開放的 TrueType/OpenType 的壓縮版本,同時也支持元數據包的分離,支持這種字體的瀏覽器有 IE9+、Firefox3.5+、Chrome6+、Safari3.6+、Opera11.1+
-
Embedded Open Type(.eot)格式
.eot 字體是 IE 專用字體,可以從 TrueType創建此格式字體,支持這種字體的瀏覽器有 IE4+
-
SVG(.svg)格式
.svg 字體是基於 SVG 字體渲染的一種格式,支持這種字體的瀏覽器有 Chrome4+、Safari3.1+、Opera10.0+、iOS Mobile Safari3.2+
不同的瀏覽器支持的格式不同,一些瀏覽器的老舊版本,它們只支持老舊版本的字體格式。例如, 大多數現代瀏覽器都支持WOFF / WOFF2(Web Open Font Format versions 1 and 2,Web開放字體格式版本1和2),它是最有效的格式,但是舊版本IE只支持EOT (Embedded Open Type,嵌入式開放類型)的字體,你可能需要包括一個SVG版本的字體支持舊版本的iPhone和Android瀏覽器
所以我們一般都會把這幾種字體都提供,讓瀏覽器自己選擇,這樣可以獲得更好的兼容性。
字體一般不能自由使用,必須要付費,或者遵循一些條件。不應該在沒有授權的情況下偷竊字體。
3.3. 聲明字體,@font-face
@font-face {
font-family: 'myFont';
font-display: swap;
src: url('webfont.eot'); /* IE9 */
src: url('webfont.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
url('webfont.woff2') format('woff2'),
url('webfont.woff') format('woff'), /* chrome、firefox */
url('webfont.ttf') format('truetype'), /* chrome、firefox、opera、Safari, Android, iOS 4.2+*/
url('webfont.svg#webfont') format('svg'); /* iOS 4.1- */
}
font-family
定義字體的名稱,就像“宋體”,“微軟雅黑”,“console”之類的內置的字體一樣。
src
有2部分:
-
url:指定要導入(下載)的字體文件的路徑
-
format:聲明字體文件的格式,它允許瀏覽器更快地找到可以使用的字體,可選項。
src
可以列出多個聲明,用逗號分隔。
瀏覽器按聲明順序找到它可以使用的字體,因此把最好的格式放在前面,把比較久的格式放在后面。比如WOFF2一般放在最前面,TTF放在最后面。
eot
字體和IE是一個例外,eot
是IE創建的一種格式,只有IE支持,並且IE9不支持format聲明,所以會有2個src
聲明,其中一個是專門針對eot
和IE9的
http://www.w3help.org/zh-cn/causes/RF1001
https://www.w3.org/Submission/EOT/
4. 獲取網絡字體
可以通過一些字體服務商獲取字體,有一些是收費的,也有一些是免費的。
4.1. 通過互聯網獲得字體,使用 iconfont
國內也有不少網站提供字體,但一般用阿里的 iconfont ,在首頁上方的菜單欄選擇 在線字體
Step 1 在最上面的文本框中輸入要應用字體的文字,比如:
我是一個任性的孩子,我希望,每一個時刻都象彩色蠟筆那樣美麗。
(輸入的這行句子總共有30個文字)
Step 2 添加你要應用的字體格式。
Step 3 下載並解壓文字,
在你需要應用的字體文字的展示框里,選擇本地下載,下載得到一個zip文件,將其解壓,就得到了字體文件。
阿里提供了在線引用和下載到本地兩種引用方式,但這里我們選擇下載,本地測試不能使用在線引用。@@@具體官方有解釋,參考官方的 webfont前端使用幫助 里 Q&A 的第三條。
解壓之后會看到有.eot .svg .ttf .woff .woff2 這些格式的文件,這些就是字體文件。
4.2. 簡單了解字體文件
這些文件直接打開,基本都是亂碼,沒法直接查看,唯獨 .svg
我們是可以直接打開的。
打開 .svg
我們可以發現2個重要的東西:
- (針對我剛才那段文字生成的svg)里面總共有26個
<glyph>
元素 - 每個元素都有一個
unicode
屬性
首先來看 unicode
屬性:
這個 unicode
屬性就是表示一個文字的 unicode
碼,我們截取剛才輸入文字的部分,看下面文字和 unicode
編碼的對照:
我 是 一 個 任 性 的 孩 子 ,
我是一个任性的孩子,
我是一个任性的孩子,
(第一行是文字,第二行是對應的10進制 unicode
編碼,第三行是對應的16進制 unicode
編碼)
.svg
文件里的 unicode
使用的是16進制 unicode
編碼,所以把上面的16進制 unicode
編碼去 .svg
文件里查找,每一個都能找到。並且仔細看 <glyph>
的排序方式,是根據 unicode
編碼順序排序的。所以每一個 <glyph>
都對應了一個文字的 unicode
和顯示(屬性d)。
再來看 <glyph>
元素:
每一個 <glyph>
都對應了一個文字的 unicode
和顯示(屬性d),但這里總共只有26個 <glyph>
,而我們的文字總共有30個,為什么只有26個 <glyph>
呢?
因為我們輸入的30個文字中有3個文字是重復的:“我”,“一“,“,”(逗號)。不重復的文字共26個,所以阿里的 iconfont 只給我們生成了我們輸入的這個26個文字,並且是根據 unicode
編碼順序排序的。所以這里要注意我們下載的字體只有這26個文字,其他文字沒有這種字體。
另外還有個.html文件,這是使用字體的詳細步驟,共3步。
4.3. 聲明和使用字體
其實使用方式在 .html 文件里都有說明,跟着操作即可。
<style>
/* 第一步:使用font-face聲明字體 */
@font-face {
font-family: 'hello-web-font';
font-display: swap;
src: url('webfont.eot');
/* IE9 */
src: url('webfont.eot?#iefix') format('embedded-opentype'),
/* IE6-IE8 */
url('webfont.woff2') format('woff2'),
url('webfont.woff') format('woff'),
/* chrome、firefox */
url('webfont.ttf') format('truetype'),
/* chrome、firefox、opera、Safari, Android, iOS 4.2+*/
url('webfont.svg#webfont') format('svg');
/* iOS 4.1- */
}
/* Step 2, 定義使用 webfont 的樣式 */
.my-web-font {
font-family: "hello-web-font" !important;
font-size: 16px;
font-style: normal;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}
</style>
<!-- Step 3. 為文字加上對應的樣式 -->
<p class="my-web-font">我是一個任性的孩子,我希望,每一個時刻都象彩色蠟筆那樣美麗。</p>
<p class="my-web-font">我希望,能在心愛的白紙上畫畫,畫出笨拙的自由</p>
上面的例子中,特地多加了一行話,來看一下結果:
我是一個任性的孩子,我希望,每一個時刻都象彩色蠟筆那樣美麗。
我希望,能在心愛的白紙上畫畫,畫出笨拙的自由
結果差不多如上面這種效果,為什么有一些字體被改變,有一些使用的確實默認字體呢?
因為我們生成的字體文件只有我們生成的那26個文字,第一行就是我們生成的內容,所以第一行全部改變了字體,而第二行只有字體文件中包含的那幾個文字( unicode
編碼),才會有對應的字體實現。
5. 字體圖標
首先來看一下不同的字體,下面有3種不同的字體,分別是:默認字體、vivaldi 字體、Wingdings 字體。
(這個3個字體都是 Windows 系統默認就已經安裝的字體)
<span>ABC123</span>
<span style="font-family:vivaldi">ABC123</span>
<span style="font-family:Wingdings">ABC123</span>
上面的代碼輸出結果如下:
ABC123
ABC123
ABC123
第一行是默認字體。
第二行字體非常漂亮,但也很好理解,因為我們在處理文檔時會經常使用各種漂亮的字體。
第三個就比較奇怪了,第三行就是"ABC123",但是字體把他顯示成了"特殊"的文字,用戶感覺這不像一個文字,更像一個圖標,但本質上他就是一個文字、一段編碼。
所以字體圖標就是一個文字,稱作字體“圖標”是因為應用某個字體之后,這個文字看上去“像”一個”圖標“。
5.1. 字體圖標的應用
網站上總是有各種圖標,比如返回按鈕有一個表示返回的小圖標,比如菜單欄——用戶信息一般有個用戶小人圖標,購物車有個購物車圖標。
以前小圖標都是用精靈圖處理,精靈圖處理有3個缺點
- 要寫樣式
- 精靈圖是小圖片,放大會失真
- 精靈圖是圖片,無法修改顏色
在CSS中,可以使用字體圖標替代精靈圖,並且有許多優點:
- 將所有圖標打包成字體庫、減少請求(字體被打包,訪問網頁時候一次性被下載)
- 具有矢量性,放大不會失真,隨意放大縮小可保證清晰度
- 使用靈活,便於維護(因為他是一個文字,所以可以所以修改顏色、樣式、大小等;對字體應用字體樣式要比修改圖片靈活的多。)
5.2. 通過互聯網獲得字體圖標,使用 iconfont
字體圖標本質上就是文字,所以生成字體圖標和生成Web字體沒有任何區別。在 iconfont 首頁上方的菜單欄找到 圖標庫 - 官方圖標庫
在圖表庫中搜索自己想要的圖標,然后鼠標移動到圖標上選擇那個”購物車“,把圖標保存到自己的購物車里。
圖標都添加完成之后,選擇右上角的購物車,然后在購物車里選擇添加到項目。(如果沒項目則添加項目)
然后進入項目頁面,在項目頁面選擇“下載到本地”
打開文件夾會發現和網絡字體一樣,會有多個字體文件和一個demo.html。詳細操作在demo.html里頭都有。
接下去,使用方式就和網絡字體一樣(使用 unicode
字體),
Step 1 聲明字體,使用 @font-face
Step 2 定義樣式
Step 3 應用樣式,注意:這一部需要指定具體 unicode
編碼
使用字體圖標的步驟 Step 3 看上去略微不同——需要自己指定 unicode
編碼,但實際上和字體文字一樣(字體圖標就是字體文字),因為在字體文字里頭,我也強調了我們只下載了我們生成的文字,如果對字體文件里沒有的文字應用該字體,則這些文字不會有任何變化,會使用默認字體顯示。所以字體圖標的 Step 3 ——要指定自己的 unicode
編碼,其實和字體文字一樣,只不過字體圖標在使用的時候我們就是要使用指定的圖標(文字),所以你需要使用哪個圖標,就要在這里使用對應 unicode
編碼。
前面兩個步驟和字體文字一樣,且demo.html種已經有詳細描述,只是 Step 3 要注意使用對應的 unicode
編碼,比如我使用的一個購物車圖標的 unicode
編碼是:
<span class="hello-icon-font"></span>
5.3. 結合偽元素使用
unicode
編碼的方式出現在 HTML 里頭,不直觀,如果光看代碼,不可能知道這表示一個購物車“圖標”
<span class="my-icon-font"></span>
使用CSS偽元素添加文字(unicode
編碼),並且通過給CSS樣式的名稱更加直觀,這是一個好主意。
比如:
Step 2 定義字體圖標樣式
.my-icon-font{
font-family: hello-icon-font;
}
Step 3 使用偽元素,因為這個“圖標”表示一個購物車,所以給定義的樣式名稱叫“cart”,這樣更直觀。
.cart::before{
content: "\e641"; /*  */
}
既然是一個字體,就能修改字體屬性,(之前樣式寫在 Step 2 里)
.cart::before{
content: "\e641"; /*  */
color: red;
font-size: 50px;
}
Step 4 就是原來的 Step 3 ,應用樣式到元素
<span class="my-icon-font cart"></span>
參考:
https://developer.mozilla.org/en-US/docs/Learn/CSS/Styling_text/Web_fonts