使用單色 emoji
在 web 設計中 icon 變得越來越重要,在網上有很多關於 icon 的資源,免費的付費的都有。在這裡,介紹如何運用一種已經我們非常熟悉的方式 — emoji ,來當成 icon 使用。
emoji 的一個好處是已經在系統中內建,而 icon 資源還需要從站點伺服器獲取。emoji 只是一些跟普通文字類似的簡單字元,所以這會是傳統 icon 圖片的一種很好的替代方式。
使用 emoji 很簡單,只需要通過鍵盤將其作為文字新增到 HTML 中,或者是直接使用它們的 Unicode 字元碼點。但要把它們當成 icon 使用,還有一點問題。
通常,icon 是單色組成的形狀,但 emoji 並不是。
可以使用 text-shadow
來實現將其變成單色。
<ul>
<li><span class=icon></span> Bicycles</li>
<li><span class=icon>️</span> Planes</li>
<li><span class=icon></span> Trains</li>
</ul>
<ul>
<li><span class=icon></span> Inbox</li>
<li><span class=icon></span> Outbox</li>
<li><span class=icon></span> Folder</li>
</ul>
複製程式碼
加點 css:
.icon {
color: transparent;
text-shadow: 0 0 #ec2930;
}
複製程式碼
將 color
設定成 transparent
會隱藏原本的 emoji,然後我們看到的其實是它的陰影。
另一種實現方式是使用 background-clip
:
.icon {
color: transparent;
background-color: #ec2930;
background-clip: text;
-webkit-background-clip: text;
}
複製程式碼
使用這種方式,還可以設定漸變背景來獲得漸變色的 icon :
.icon {
color: transparent;
background-image: linear-gradient(45deg, blue, red);
background-clip: text;
-webkit-background-clip: text;
}
複製程式碼
Unicode 與 emoji
在上述例子中的 6 個 emoji,有一個跟其餘 5 個是不同型別,就是 ️。我們已經瞭解,emoji 不是什麼魔法,就是一個 Unicode 字元,不同的系統會對其做不同處理,比如在 Windows 7 及以前這些字元本來都是單色的,大概到現在主流的 Windows 10 已經有了各種五顏六色的 emoji。先看看例子中 6 個 emoji 的碼點:
``.codePointAt().toString(16) // 1f6b2
`️`.codePointAt().toString(16) // 2708
``.codePointAt().toString(16) // 1f682
``.codePointAt().toString(16) // 1f4e5
``.codePointAt().toString(16) // 1f4e4
``.codePointAt().toString(16) // 1f4c1
複製程式碼
除了 `️`,其餘 emoji 都不在 Unicode 基本平面(U+0000 ~ U+FFFF)。
很久很久以前,人們以為這世界上的各種符號只需要 16 位就可以搞定,即 65536 個字元。後來發現根本不夠用,於是開始進行擴充套件,增加了 16 個輔助平面,可以表示的範圍是 U+000000 ~ U+10FFFF。JavaScript 中採用的 Unicode 編碼方式是 utf-16,基本平面的使用兩個位元組表示一個字元,輔助平面的需要四個位元組。字元的 Unicode 的表示法在 JavaScript 中如下:
uxxxx
複製程式碼
xxxx
表示字元的 Unicode 碼點,範圍是 u0000~uFFFF。比如:
console.log(`u2708`) //
複製程式碼
這個飛機 長得有點奇怪,跟例子中的 ️ 根本就不是一個。Why?
`️`.length // 2
複製程式碼
`️` 的長度也是 2,不妨看看第二位的碼點
`️`.codePointAt(1).toString(16) // fe0f
複製程式碼
fe0f 這其實是一個 emoji 異體字選擇符,就是將之前版本已經存在的字元進行 emoji 轉換。
所以,需要這樣一起使用:
console.log(`u2708ufe0f`) // ️
複製程式碼
其餘 5 個 emoji,本身就是碼點超過 uffff 的字元,在 ES6 新增一種表示法:
u{xxxxxx}
複製程式碼
就像這樣:
console.log(`u{1f6b2}`) //
console.log(`u{1f682}`) //
console.log(`u{1f4e5}`) //
console.log(`u{1f4e4}`) //
console.log(`u{1f4c1}`) //
複製程式碼
當然,也是可以通過 charCodeAt
獲取不同位置的碼點,使用老派表示法:
const h = ``.charCodeAt(0).toString(16) // d83d
const l = ``.charCodeAt(1).toString(16) // de82
console.log(String.fromCharCode(0xd83d, 0xde82)) //
console.log(`ud83dude82`) //
複製程式碼
基本平面的 /ud800 到 /udfff 是空段,輔助平面共有 2^20 個字元,在 utf-16 編碼時,高位對映到 /ud800 到 /udbff(空間大小 2^10,即 0x400),低位對映到 /udc00 到 /udfff,對應的對映規則計算方式是:
H = Math.floor((char - 0x10000) / 0x400) + 0xD800
L = (char - 0x10000) % 0x400 + 0xDC00
複製程式碼
所以,當知道其碼點時,還可以直接計算其編碼。
原文釋出時間為:2018年07月02日
本文作者:掘金
本文來源:掘金 如需轉載請聯絡原作者