Limited availability
å®éªæ§: è¿æ¯ä¸é¡¹å®éªæ§ææ¯
å¨å°å
¶ç¨äºç产ä¹åï¼è¯·ä»ç»æ£æ¥æµè§å¨å
¼å®¹æ§è¡¨æ ¼ã
Local Font Access API æä¾äºä¸ç§è®¿é®ç¨æ·æ¬å°å®è£ çå使°æ®çæºå¶ââè¿å æ¬æ´é«å±æ¬¡ç详ç»ä¿¡æ¯ï¼ä¾å¦åç§°ãæ ·å¼åç³»åï¼ä»¥ååºå±å使件çåå§åèå 容ã
æ¦å¿µåç¨æ³Web åä½å
许 Web 设计人åæä¾å¨ Web ææ¡£ä¸ä½¿ç¨çèªå®ä¹åä½ï¼å èå¨å®ç° Web æçæ¹é¢å
·æé©å½æ§æä¹ãéè¿ @font-face
at è§åï¼Web åä½å¯ä»¥éè¿ url()
彿°ä¸æä¾ç URL å è½½ã
@font-face
è¿æå
¶ä»å 个æç¨çç¹æ§ãç¹å«æ¯ï¼ä½ è¿å¯ä»¥å¨ local()
彿°ä¸æå®åä½ç宿´åç§°æ Postscript åç§°ï¼ä»¥åè¯æµè§å¨å¨ç¨æ·è®¡ç®æºä¸å®è£
äºè¯¥å使¶ä½¿ç¨æ¬å°å¯æ¬ãè¿å¹¶é没æé®é¢ââlocal()
ä½ä¸ºæçº¹åéå·²ç»åå¾èåæèã
æ¤å¤ï¼ç±äºåç¡®çå使䏾å访é®åºå±å使°æ®ï¼ä¾å¦ï¼åºç¨è¿æ»¤å¨å转æ¢ï¼æ¹é¢çææï¼é«ç«¯è®¾è®¡å·¥å ·åæ¥é¾ä»¥å¨ Web 䏿ä¾ãå½åçåºç¨ç¨åºé常ä¾èµäºåéåæ³ï¼ä¾å¦è¦æ±ç¨æ·å°åä½ä¸ä¼ å°æå¡å¨ï¼å¨æå¡å¨ä¸å¤çåä½ä»¥è·ååå§åèæ°æ®ï¼æè å®è£ åç¬çæ¬å°ç¨åºä»¥æä¾éå åè½ã
Local Font Access API çå建就æ¯ä¸ºäºè§£å³è¿äºé®é¢ã
Window.queryLocalFonts()
æ¹æ³æä¾å¯¹æ¬å°å®è£
çåä½çæ°ç»ç访é®ï¼æ¯ä¸ªåä½é½ç±ä¸ä¸ª FontData
对象å®ä¾è¡¨ç¤ºãFontData
æå¤ä¸ªå±æ§ï¼æä¾å¯¹åç§°ãæ ·å¼åå使ç访é®ï¼å¹¶ä¸å®è¿æä¸ä¸ª blob()
æ¹æ³ï¼æä¾å¯¹å
å«åºå±å使件çåå§åèå
容ç Blob
ç访é®ã
å¨éç§åå®å ¨æ¹é¢ï¼
Window.queryLocalFonts()
æ¶ï¼ç³»ç»ä¼è¯·æ±ç¨æ·æäºè®¿é®å
¶æ¬å°åä½çæéãæ¤æéçç¶æå¯ä»¥éè¿æé APIï¼local-fonts
æéï¼æ¥è¯¢ãlocal-fonts
æéçç¥æ§å¶å¯¹æ¤ç¹æ§ç访é®ãFontData
代表å个æ¬å°åä½ã
Window.queryLocalFonts()
è¿åä¸ä¸ª Promise
ï¼å®ä¼å
ç°ä¸ä¸ªè¡¨ç¤ºæ¬å°å¯ç¨åä½ç FontData
å¯¹è±¡çæ°ç»ã
æå ³å®æ¶æ¼ç¤ºï¼è¯·åé åä½éæ©æ¼ç¤ºã
ç¹æ§æ£æµif ("queryLocalFonts" in window) {
// æ¯ææ¬å°åä½è®¿é® API
}
å使䏾
以ä¸ä»£ç çæ®µå°æ¥è¯¢ææå¯ç¨åä½å¹¶æå°å æ°æ®ãä¾å¦ï¼è¿å¯ä»¥ç¨äºå¡«å åä½éæ©å¨æ§ä»¶ã
async function logFontData() {
try {
const availableFonts = await window.queryLocalFonts();
for (const fontData of availableFonts) {
console.log(fontData.postscriptName);
console.log(fontData.fullName);
console.log(fontData.family);
console.log(fontData.style);
}
} catch (err) {
console.error(err.name, err.message);
}
}
访é®åºå±æ°æ®
blob()
æ¹æ³æä¾å¯¹åºå± SFNT æ°æ®ç访é®ââè¿æ¯ä¸ç§å¯ä»¥å
å«å
¶ä»å使 ¼å¼çåä½æä»¶æ ¼å¼ï¼ä¾å¦ PostScriptãTrueTypeãOpenType æ Web 弿¾å使 ¼å¼ï¼WOFFï¼ã
async function computeOutlineFormat() {
try {
const availableFonts = await window.queryLocalFonts({
postscriptNames: ["ComicSansMS"],
});
for (const fontData of availableFonts) {
// `blob()` æ¹æ³è¿åä¸ä¸ªå
嫿æä¸å®æ´ç SFNT å
è£
å使°æ®ç Blobã
const sfnt = await fontData.blob();
// ä»
è£åªåºæä»¬éè¦çåèé¨åï¼å 4 个åèæ¯ SFNT çæ¬ä¿¡æ¯ã
// è§èï¼https://learn.microsoft.com/zh-cn/typography/opentype/spec/otff#organization-of-an-opentype-font
const sfntVersion = await sfnt.slice(0, 4).text();
let outlineFormat = "UNKNOWN";
switch (sfntVersion) {
case "\x00\x01\x00\x00":
case "true":
case "typ1":
outlineFormat = "truetype";
break;
case "OTTO":
outlineFormat = "cff";
break;
}
console.log("ç¢éå使 ¼å¼ï¼", outlineFormat);
}
} catch (err) {
console.error(err.name, err.message);
}
}
è§è æµè§å¨å
¼å®¹æ§ åè§
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4