我想在我的網頁上使用這個表情符號。#128269;- 🔍
在Android上,瀏覽器將Unicode字形識別為表情符號,并顯示出來。
在桌面上,它呈現為Unicode后備字符——一個帶數字的小方塊。
所以,使用Symbola,Quivira,或者任何其他有正確符號的字體,我可以解決這個問題。
@font-face {
font-family: 'quiviraregular';
src: url('fonts/quivira.woff2') format('woff2');
}
body{
font-family:sans-serif,quiviraregular;
}
然而,現在Android顯示的是字體中的符號,而不是表情符號。
有什么方法可以設置字體家族聲明,讓Android(和iPhone)使用他們內置的彩色表情符號,而所有其他瀏覽器都使用提供的符號字體?
Modernizr具有表情符號支持的(非核心)特征檢測。如果你用cssclasses和表情符號創建自己的Modernizr,你可以使用。添加到html標簽中的no-emoji類具有不同的字體系列。
body {
font-family: sans-serif;
}
.no-emoji body {
font-family: sans-serif, emojisymbols;
}
我創建了一個jsFiddle,如果你有表情符號支持,它會顯示綠色背景;如果沒有表情符號支持,它會顯示紅色背景和Kenichi Kaneko的表情符號字體。不幸的是,我只能在Windows 7 + Firefox上看到表情符號字體,但這可能會給你一個開始。
基于評論的更新
要查看是否可以檢測特定字符是否受支持,讓我們看看Modernizr的表情符號支持功能檢測源代碼:
define(['Modernizr', 'createElement', 'test/canvastext'], function( Modernizr, createElement ) {
Modernizr.addTest('emoji', function() {
if (!Modernizr.canvastext) return false;
var node = createElement('canvas'),
ctx = node.getContext('2d');
ctx.fillStyle = '#f00';
ctx.textBaseline = 'top';
ctx.font = '32px Arial';
ctx.fillText('\ud83d\udc28', 0, 0); // U+1F428 KOALA
return ctx.getImageData(16, 16, 1, 1).data[0] !== 0;
});
});
它的工作原理是創建一個畫布元素,渲染考拉表情符號,并檢查特定像素的紅色通道值,我假設它存在于這個表情符號的每個重現中。
您可以擴展此功能來檢查參數列表中的所有表情是否都受支持,如果不支持,則使用表情字體回退。我認為最好的解決方案是在同一個畫布上渲染每個表情符號,并檢查每個表情符號的邊框內是否至少有一個像素是彩色的。我不確定不支持的表情符號是如何呈現的,可能需要檢測它。
附言:我認為在后備表情符號字體之前指定表情符號的默認字體應該足以解決這個問題,我認為這些表情符號不存在于默認字體中是正確的嗎?
一種方法是將媒體查詢用于沒有本機支持的目標設備(如臺式電腦),并應用自定義字體系列,例如(從廣義上講,您可能希望細化以下內容)
// target devices with 'larger than mobile' screen size...and apply the emoji 'polyfill'
@media only screen and (min-device-width: 768px){
body{
font-family:quiviraregular;
}
}
我拿了@ckuijjer的回答,跟著跑。我發現IE11中16,16位置不靠譜。14、16號位在火狐出現了問題。但到目前為止12,16的位置在我嘗試過的所有地方都有效(IE11,Edge,FF42+,ChromeWindows7、Windows10、OSX10.11)。
export default class EmojiUtils {
static checkEmoji(char) {
var node = document.createElement('canvas');
var ctx = node.getContext('2d');
ctx.fillStyle = '#f00';
ctx.textBaseline = 'top';
ctx.font = '32px Arial';
ctx.fillText(char, 0, 0);
return ctx.getImageData(12, 16, 1, 1).data[0] !== 0;
}
static checkColor() {
var node = document.createElement('canvas');
var ctx = node.getContext('2d');
ctx.fillStyle = '#000';
ctx.textBaseline = 'top';
ctx.font = '32px Arial';
ctx.fillText('\uD83D\uDD34', 0, 0);
var data = ctx.getImageData(16, 16, 1, 1).data;
return data[0] > data[1];
}
static polyfillEmoji() {
if (!EmojiUtils.checkColor()) {
require('emojione/font.css');
} else {
if (!EmojiUtils.checkEmoji('\uD83D\uDD7A')) { //Dancing man Unicode 9.0
require('emojione/font-versioned.css');
}
}
}
}
然后,當頁面加載時,我只需調用EmojiUtils.polyfillEmoji()。
我在我的body font-family中添加了:“EmojiOneColor”、“EmojiOneColor-9”、sans-serif;
font.css:
@font-face {
font-family: 'EmojiOneColor';
font-style: normal;
font-weight: 400;
src: local('EmojiOneColor'), local('EmojiOne Color'), url(emojione-svg.woff);
unicode-range: U+0020, U+0023, U+002A, U+0030-0039, U+00A9, U+00AE, U+200D, U+203C, U+2049, U+20E3, U+2122, U+2139, U+2194-2199, U+21A9-21AA, U+231A-231B, U+2328, U+23CF, U+23E9-23F3, U+23F8-23FA, U+24C2, U+25AA-25AB, U+25B6, U+25C0, U+25FB-25FE, U+2600-2604, U+260E, U+2611, U+2614-2615, U+2618, U+261D, U+2620, U+2622-2623, U+2626, U+262A, U+262E-262F, U+2638-263A, U+2648-2653, U+2660, U+2663, U+2665-2666, U+2668, U+267B, U+267F, U+2692-2694, U+2696-2697, U+2699, U+269B-269C, U+26A0-26A1, U+26AA-26AB, U+26B0-26B1, U+26BD-26BE, U+26C4-26C5, U+26C8, U+26CE-26CF, U+26D1, U+26D3-26D4, U+26E9-26EA, U+26F0-26F5, U+26F7-26FA, U+26FD, U+2702, U+2705, U+2708-270D, U+270F, U+2712, U+2714, U+2716, U+271D, U+2721, U+2728, U+2733-2734, U+2744, U+2747, U+274C, U+274E, U+2753-2755, U+2757, U+2763-2764, U+2795-2797, U+27A1, U+27B0, U+27BF, U+2934-2935, U+2B05-2B07, U+2B1B-2B1C, U+2B50, U+2B55, U+3030, U+303D, U+3297, U+3299, U+FE0F, U+1F004, U+1F0CF, U+1F170-1F171, U+1F17E-1F17F, U+1F18E, U+1F191-1F19A, U+1F1E6-1F1FF, U+1F201-1F202, U+1F21A, U+1F22F, U+1F232-1F23A, U+1F250-1F251, U+1F300-1F321, U+1F324-1F393, U+1F396-1F397, U+1F399-1F39B, U+1F39E-1F3F0, U+1F3F3-1F3F5, U+1F3F7-1F4FD, U+1F4FF-1F53D, U+1F549-1F54E, U+1F550-1F567, U+1F56F-1F570, U+1F573-1F57A, U+1F587, U+1F58A-1F58D, U+1F590, U+1F595-1F596, U+1F5A4-1F5A5, U+1F5A8, U+1F5B1-1F5B2, U+1F5BC, U+1F5C2-1F5C4, U+1F5D1-1F5D3, U+1F5DC-1F5DE, U+1F5E1, U+1F5E3, U+1F5E8, U+1F5EF, U+1F5F3, U+1F5FA-1F64F, U+1F680-1F6C5, U+1F6CB-1F6D2, U+1F6E0-1F6E5, U+1F6E9, U+1F6EB-1F6EC, U+1F6F0, U+1F6F3-1F6F6, U+1F910-1F91E, U+1F920-1F927, U+1F930, U+1F933-1F93A, U+1F93C-1F93E, U+1F940-1F945, U+1F947-1F94B, U+1F950-1F95E, U+1F980-1F991, U+1F9C0;
}
font-versioned.css:
@font-face {
font-family: 'EmojiOneColor-9';
font-style: normal;
font-weight: 400;
src: local('EmojiOneColor'), local('EmojiOne Color'), url(emojione-svg.woff);
unicode-range: U+1F57A, U+1F5A4, U+1F6D1-1F6D2, U+1F6F4-1F6F6, U+1F919-1F91E, U+1F920-1F927, U+1F930, U+1F933-1F93A, U+1F93C-1F93E, U+1F940-1F945, U+1F947-1F94B, U+1F950-1F95E, U+1F985-1F991, U+1F57A, U+1F5A4, U+1F6D1-1F6D2, U+1F6F4-1F6F6, U+1F919-1F91E, U+1F920-1F927, U+1F930, U+1F933-1F93A, U+1F93C-1F93E, U+1F940-1F945, U+1F947-1F94B, U+1F950-1F95E, U+1F985-1F991, U+1F57A, U+1F919-1F91C, U+1F91E, U+1F926, U+1F930, U+1F933-1F939, U+1F93D-1F93E;
}
這樣做的好處是,如果chrome自帶彩色表情符號,它將只加載Unicode 9字符。由于chrome的限制,載入的將是黑白的。在其他具有黑白原生表情符號的系統上,它加載整個表情符號字體。該版本上unicode-range仍然確保僅當頁面上存在表情符號時才加載字體(第一次加載時可能會出現簡短的豆腐)。
sans-serif通用系列的問題是,系統字體通常有黑白字形,用于常見的單代碼點表情符號。特別是,如果這些表情符號與舊的Wingdings符號有某種聯系。
瀏覽器會選擇它們,忽略任何后面的U+FE0F,并愉快地顯示那個字形。
有一個名為表情符號的新的通用字體家族可以用來解決這個問題,如果安裝了系統的顏色表情符號字體,它可以選擇系統的顏色表情符號字體。不幸的是,目前對這個新值的支持還不太好,因此用通常安裝的系統表情字體作為它的前綴仍然是一個好主意。
然后,它可以跟隨一個自己的后備字體,如果沒有找到系統表情符號字體,則使用該字體。字體系列聲明看起來有點像這樣:
font-family: "Some System Font",
"Emoji Font for other System",
emoji,
"quiviraregular";
使用這種技術的網站是Emojipedia。