CSS ãã©ã³ãèªã¿è¾¼ã¿ API
Baseline
Widely available
*
This feature is well established and works across many devices and browser versions. Itâs been available across browsers since â¨2020å¹´1æâ©.
* Some parts of this feature may have varying levels of support.
CSS ãã©ã³ãèªã¿è¾¼ã¿ API ã¯ããã©ã³ããªã½ã¼ã¹ãåçã«èªã¿è¾¼ãããã®ã¤ãã³ãã¨ã¤ã³ã¿ã¼ãã§ã¤ã¹ãæä¾ãã¾ãã
ã¡ã¢:
ãã®æ©è½ã¯ã¦ã§ãã¯ã¼ã«ã¼ã§å©ç¨ã§ãã¾ãï¼self.fonts ãFontFaceSet ã«ã¢ã¯ã»ã¹ããæ©è½ãæä¾ãã¾ãï¼ã
æ¦å¿µã¨ä½¿ç¨æ¹æ³
CSSã¹ã¿ã¤ã«ã·ã¼ãã§ã¯ãã«ã¹ã¿ã ãã©ã³ãã使ç¨ãããã¨ãã§ãã¾ãã @font-face ã«ã¼ã«ã§ãã¦ã³ãã¼ããããã©ã³ããæå®ãã font-family ããããã£ã§è¦ç´ ã«é©ç¨ãã¾ãã
ãã©ã³ãããã¦ã³ãã¼ãããããã®ç¹ã¯ãã¦ã¼ã¶ã¼ã¨ã¼ã¸ã§ã³ãã«ãã£ã¦å¶å¾¡ããã¾ãã
ã»ã¨ãã©ã®ã¨ã¼ã¸ã§ã³ãã¯ããã©ã³ããæåã«å¿
è¦ã«ãªã£ãã¨ãã ãåå¾ãã¦èªã¿è¾¼ããããç¥è¦ã§ããã»ã©ã®é
å»¶ãçãããã¨ãããã¾ãã
CSS ãã©ã³ãèªã¿è¾¼ã¿ API ã¯ããã©ã³ããã§ã¤ã¹ããã¤åå¾ããèªã¿è¾¼ã¾ãããã¤ææ¸ãã¯ã¼ã«ã¼ãè¨å®ãããã©ã³ããã§ã¤ã¹éåã«è¿½å ãããããå¶å¾¡ã追跡ãããã¨ã§ããã®åé¡ãå æãã¾ãã ãã©ã³ããã§ã¤ã¹ãææ¸ãã¯ã¼ã«ã¼ã®ãã©ã³ããã§ã¤ã¹éåã«è¿½å ãããã¨ã§ãã¦ã¼ã¶ã¼ã¨ã¼ã¸ã§ã³ãã¯å¿ è¦ã«å¿ãã¦é¢é£ãããã©ã³ããªã½ã¼ã¹ãèªåçã«åå¾ãèªã¿è¾¼ããã¨ãã§ãã¾ãã ãã©ã³ããã§ã¤ã¹ã¯ããã©ã³ããã§ã¤ã¹éåã«è¿½å ãããåã§ãå¾ã§ãèªã¿è¾¼ããã¨ãã§ãã¾ãããæç»ã«ä½¿ç¨ããåã«å¿ ãè¨å®ããã«ã¯è¿½å ããªããã°ãªãã¾ããã
ãã©ã³ããã§ã¤ã¹ã¯FontFaceãªãã¸ã§ã¯ãã§å®ç¾©ãã¾ãããã®ãªãã¸ã§ã¯ã㯠CSS @font-face ã«ã¼ã«ã¨ã»ã¼åãæ¹æ³ã§ããã¤ããªã¼ã¾ã㯠URL ãã©ã³ãã®ã½ã¼ã¹ã¨ãã©ã³ãã®ä»ã®ããããã£ãæå®ãã¾ãã
FontFace ãªãã¸ã§ã¯ãã¯ã Document.fonts 㨠WorkerGlobalScope.fonts ã使ç¨ãã¦ããããææ¸ã¾ãã¯ã¯ã¼ã«ã¼ FontFaceSet ã«è¿½å ããã¾ãã
ä½è
㯠FontFace ã¾ã㯠FontFaceSet ã使ç¨ãã¦ãã©ã³ãã®ãã¦ã³ãã¼ããèµ·åããèªã¿è¾¼ã¿å®äºãç£è¦ãããã¨ãã§ãã¾ãã
FontFaceSet ã使ç¨ããã¨ãããã«ããã¼ã¸ã§å¿
è¦ãªãã¹ã¦ã®ãã©ã³ããèªã¿è¾¼ã¾ããææ¸ã¬ã¤ã¢ã¦ããå®äºããã¨ãã«å¤æãããã¨ãã§ãã¾ãã
FontFace.status ããããã£ã¯ããã©ã³ããã§ã¤ã¹ã®èªã¿è¾¼ã¿ã¹ãã¼ã¿ã¹ã示ãã¾ãã unloadedãloadingãloadedãfailed ã®ããããã§ãã
ã¹ãã¼ã¿ã¹ã¯æå㯠unloaded ã§ãã
ãã®ã¹ãã¼ã¿ã¹ã¯ããã¡ã¤ã«ããã¦ã³ãã¼ãããã¦ããã¨ãããã©ã³ããã¼ã¿ãå¦çããã¦ããã¨ãã«ã¯ loading ã«è¨å®ããããã©ã³ãå®ç¾©ã䏿£ãªã¨ãããã©ã³ããã¼ã¿ãèªã¿è¾¼ããã¨ãã§ããªãã¨ãã«ã¯ failed ã«è¨å®ããã¾ãã
ãã©ã³ããã§ã¤ã¹ãã¼ã¿ãï¼å¿
è¦ã§ããã°ï¼æ£å¸¸ã«åå¾ãããèªã¿è¾¼ã¾ããå ´åãã¹ãã¼ã¿ã¹ã¯ loaded ã«è¨å®ããã¾ãã
ãã©ã³ããã§ã¤ã¹ã®å®ç¾©
ãã©ã³ããã§ã¤ã¹ã¯ FontFace ã³ã³ã¹ãã©ã¯ã¿ã¼ ã使ç¨ãã¦ä½æãã¾ããã³ã³ã¹ãã©ã¯ã¿ã¼ã¯å¼æ°ã¨ãã¦ãã©ã³ããã¡ããªã¼ããã©ã³ãã½ã¼ã¹ããªãã·ã§ã³ã®è¨è¿°åãåãã¾ãã
ãããã®å¼æ°ã®æ¸å¼ã¨ææ³ã¯ãåçã® @font-face å®ç¾©ã¨åãã§ãã
ãã©ã³ãã½ã¼ã¹ã¯ ArrayBuffer ã«å
¥ã£ããã¤ããªã¼ãã¼ã¿ã§ãããã©ã³ããªã½ã¼ã¹ã® URL ã§ããã¾ãã¾ããã
URL ã½ã¼ã¹ã使ç¨ããå
¸åçãªãã©ã³ããã§ã¤ã¹å®ç¾©ã¯ä¸è¨ã®ããã«ãªãã¾ãã
URL ãã©ã³ãã½ã¼ã¹ã«ã¯ url() 颿°ãè¦æ±ããããã¨ã«æ³¨æãã¦ãã ããã
const font = new FontFace("myfont", "url(myfont.woff)", {
style: "italic",
weight: "400",
stretch: "condensed",
});
ã¡ã¢:
font-face ã¨åæ§ã«ãããã¤ãã®è¨è¿°åã¯ãã©ã³ããã¼ã¿ä¸ã®æå¾
ããããã¼ã¿ã表ãããã©ã³ãã®ç
§åã«ç¨ãããã¾ãããä»ã«ãå®éã«çæããããã©ã³ããã§ã¤ã¹ã®ããããã£ãè¨å®/å®ç¾©ãããã®ãããã¾ãã
ä¾ãã°ãstyleã "italic" ã«è¨å®ããã¨ããã®ãã¡ã¤ã«ã«ã¤ã¿ãªãã¯ä½ã®ãã©ã³ããå«ã¾ãã¦ãããã¨ã示ãã¾ãããããçã¨ãªããã¡ã¤ã«ãæå®ãããã©ããã¯ä½è
次第ã§ãã
ãã¤ããªã¼ã½ã¼ã¹ã«ãããã©ã³ããã§ã¤ã¹ã¯ããã©ã³ãå®ç¾©ãæå¹ã§ãã©ã³ããã¼ã¿ãèªã¿è¾¼ããã¨ãã§ããã°èªåçã«èªã¿è¾¼ã¾ãã¾ãã FontFace.status ã¯ãæåããã° loadedãããã§ãªããã° failed ã«è¨å®ããã¾ã
URL ãã½ã¼ã¹ã¨ãããã©ã³ããã§ã¤ã¹ã¯æ¤è¨¼ããã¾ãããèªåçã«ã¯èªã¿è¾¼ã¾ãã¾ãããFontFace.status ã¯ããã©ã³ããã§ã¤ã¹å®ç¾©ãæå¹ã§ããã° unloaded ã«è¨å®ããããã§ãªããã° failed ã«è¨å®ãã¾ãã
ææ¸ãã¯ã¼ã«ã¼ã¸ã®ãã©ã³ãã®è¿½å
ãã©ã³ããã§ã¤ã¹ã¯é常ãã¦ã¼ã¶ã¼ã¨ã¼ã¸ã§ã³ããå¿
è¦ãªã¨ãã«èªåçã«ãã©ã³ããèªã¿è¾¼ããã¨ãã§ããããã«ãææ¸ã¾ãã¯ã¯ã¼ã«ã¼ FontFaceSet ã«è¿½å ãããããã¹ããã¬ã³ããªã³ã°ããããã«ãã©ã³ãã使ç¨ããããã«ã¯è¿½å ããå¿
è¦ãããã¾ãã
ä¸è¨ã®ã³ã¼ãã¯ããã©ã³ããã§ã¤ã¹ãææ¸ã«è¿½å ããã¦ãããã¨ã示ãã¦ãã¾ãã
// ãã©ã³ããã§ã¤ã¹ãå®ç¾©
const font = new FontFace("myfont", "url(myfont.woff)", {
style: "italic",
weight: "400",
stretch: "condensed",
});
// document.fonts (FontFaceSet) ã«è¿½å
document.fonts.add(font);
ãã©ã³ãã®èªã¿è¾¼ã¿
ãã©ã³ããã§ã¤ã¹ã¯ãFontFace.load() ãå¼ã³åºãã¦æåã§èªã¿è¾¼ããã¨ãã§ãã¾ããããã©ã³ããã§ã¤ã¹ã FontFaceSet ã«è¿½å ããã¦ããå ´å㯠FontFaceSet.load() ãå¼ã³åºãã¦èªã¿è¾¼ããã¨ãã§ãã¾ãã
ãã§ã«èªã¿è¾¼ã¾ãã¦ãããã©ã³ããèªã¿è¾¼ããã¨ãã¦ãä½ã®å¹æããªããã¨ã«æ³¨æãã¦ãã ããã
ä¸è¨ã³ã¼ãã¯ããã©ã³ããã§ã¤ã¹ãå®ç¾©ãããããææ¸å ã®ãã©ã³ãã«è¿½å ããããã¦ãã©ã³ãã®èªã¿è¾¼ã¿ãéå§ããæ¹æ³ã示ãã¦ãã¾ãã
// ãã©ã³ããã§ã¤ã¹ãå®ç¾©
const font = new FontFace("myfont", "url(myfont.woff)");
// document.fonts (FontFaceSet) ã«è¿½å
document.fonts.add(font);
// ãã©ã³ãã®èªã¿è¾¼ã¿
font.load();
// ãã¹ã¦ã®ãã©ã³ããèªã¿è¾¼ã¾ããã¾ã§å¾
ã¤
document.fonts.ready.then(() => {
// ããã¹ããã¬ã³ããªã³ã°ããããã«ãã©ã³ãã使ç¨ï¼ä¾ãã°ãã£ã³ãã¹ãªã©ã§ï¼
});
ãªãã font.load() ã¯ãããã¹ãè¿ãã®ã§ããã®å¾ã« then ãé£éããããã¨ã§ããã©ã³ãèªã¿è¾¼ã¿ã®å®äºãå¦çãããã¨ãã§ãã¾ãã
document.fonts.ready ã使ç¨ãããã¨ãã§ãã¾ããææ¸å
ã®ãã¹ã¦ã®ãã©ã³ãã解決ãããã¬ã¤ã¢ã¦ããå®äºããã¨ãã«ã®ã¿å¼ã³åºãããããã§ãã
ã¤ã³ã¿ã¼ãã§ã¤ã¹
FontFace-
使ç¨å¯è½ãªåä¸ã®ãã©ã³ããã§ã¤ã¹ã表ãã¾ãã
FontFaceSet-
ãã©ã³ããã§ã¤ã¹ãèªã¿è¾¼ã¿ããã¦ã³ãã¼ãç¶æ ããã§ãã¯ããã¤ã³ã¿ã¼ãã§ã¤ã¹ã§ãã
FontFaceSetLoadEvent-
FontFaceSetãèªã¿è¾¼ããã³ã«çºè¡ããã¾ãã
ä¾
>åºæ¬çãªãã©ã³ãã®èªã¿è¾¼ã¿
ãã®ä¾ã¯ã¨ã¦ãåç´ã§ãGoogle Fonts ãããã©ã³ããèªã¿è¾¼ã¾ãããã£ã³ãã¹ã«ããã¹ããæç»ããããã«ä½¿ç¨ãããã¨ã示ãã¦ãã¾ãã
ãã®ä¾ã§ã¯ã使ç´å¾ã¨èªã¿è¾¼ã¿å¾ã® status ããã°åºåãã¦ãã¾ãã
HTML
ãã®ã³ã¼ãã§ã¯ãæç»ããããã®ãã£ã³ãã¹ã¨ããã°åºåããããã®ããã¹ãã¨ãªã¢ãå®ç¾©ãã¦ãã¾ãã
<canvas id="js-canvas"></canvas>
<textarea id="log" rows="3" cols="100"></textarea>
JavaScript
æåã«ããã°åºåããè¦ç´ ã¨ããã¦ã³ãã¼ããããã©ã³ãã§ããã¹ããã¬ã³ããªã³ã°ããããã«ä½¿ç¨ãããã£ã³ãã¹ãåå¾ãã¾ãã
const log = document.getElementById("log");
const canvas = document.getElementById("js-canvas");
canvas.width = 650;
canvas.height = 75;
次ã«ã FontFace ãå®ç¾©ã㦠URL ã½ã¼ã¹ã Google Font ã¨ãã document.fonts ã«è¿½å ãã¾ãã
ããã¦ããã©ã³ãã®ã¹ãã¼ã¿ã¹ããã°åºåãã¾ãã unloaded ã«ãªã£ã¦ããã¯ãã§ãã
const bitterFontFace = new FontFace(
"FontFamily Bitter",
"url(https://fonts.gstatic.com/s/bitter/v7/HEpP8tJXlWaYHimsnXgfCOvvDin1pK8aKteLpeZ5c0A.woff2)",
);
document.fonts.add(bitterFontFace);
log.textContent += `Bitter font: ${bitterFontFace.status}\n`; // > Bitter font: unloaded
次ã«ã FontFace.load() ã¡ã½ãããå¼ã³åºãã¦ãã©ã³ããã§ã¤ã¹ãèªã¿è¾¼ã¿ãè¿ããããããã¹ãå¾
ã¡ã¾ãã
ãããã¹ã解決ããããèªã¿è¾¼ãã ã¹ãã¼ã¿ã¹ããã°åºåãï¼loaded ã«ãªã£ã¦ããã¯ãï¼ãèªã¿è¾¼ãã ãã©ã³ãã§ããã¹ãããã£ã³ãã¹ã§æç»ãã¾ãã
bitterFontFace.load().then(
() => {
log.textContent += `Bitter font: ${bitterFontFace.status}\n`; // > Bitter font: loaded
const ctx = canvas.getContext("2d");
ctx.font = '36px "FontFamily Bitter"';
ctx.fillText("Bitter font loaded", 20, 50);
},
(err) => {
console.error(err);
},
);
ãªãã FontFace.loaded ããããã£ãè¿ããããã¹ãã¾ã㯠FontFaceSet.ready ãå¾
ã¤ãã¨ãã§ãã¾ãã
ã¡ã¢
çµæã¯ä¸è¨ã®ããã«è¡¨ç¤ºããã¾ãã ãã¦ã³ãã¼ããããã©ã³ãã§ãã£ã³ãã¹ã«æç»ããããã©ã³ãåã¨ãèªã¿è¾¼ãåã¨å¾ã®èªã¿è¾¼ã¿ç¶æ³ã示ããã°ã表示ããã¦ããã¯ãã§ãã
ãã©ã³ãã®èªã¿è¾¼ã¿ã¨ã¤ãã³ã
ãã®ä¾ã¯ååã®ãã®ã¨ä¼¼ã¦ãã¾ããã FontFaceSet.load() ã使ç¨ãã¦ãã©ã³ããèªã¿è¾¼ãã§ããç¹ãç°ãªãã¾ãã
ã¾ãããã©ã³ãã®èªã¿è¾¼ã¿ã¤ãã³ããå¾
ã¡åãããæ¹æ³ã示ãã¦ãã¾ãã
HTML
<canvas id="js-canvas"></canvas>
<textarea id="log" rows="25" cols="100"></textarea>
JavaScript
ä¸è¨ã®ã³ã¼ãã§ã¯ãããã¹ããæç»ããããã®ãã£ã³ãã¹ã³ã³ããã¹ããå®ç¾©ãããã©ã³ããã§ã¤ã¹ãå®ç¾©ãããããææ¸å ã®ãã©ã³ããã§ã¤ã¹éåã«è¿½å ãã¦ãã¾ãã
const log = document.getElementById("log");
const canvas = document.getElementById("js-canvas");
canvas.width = 650;
canvas.height = 75;
const ctx = canvas.getContext("2d");
const oxygenFontFace = new FontFace(
"FontFamily Oxygen",
"url(https://fonts.gstatic.com/s/oxygen/v5/qBSyz106i5ud7wkBU-FrPevvDin1pK8aKteLpeZ5c0A.woff2)",
);
document.fonts.add(oxygenFontFace);
log.textContent += `Oxygen status: ${oxygenFontFace.status}\n`;
次ã«ããã©ã³ããã§ã¤ã¹éåã«å¯¾ã㦠load() ã使ç¨ããèªã¿è¾¼ããã©ã³ããæå®ãã¾ãã
ãã®ã¡ã½ãã㯠Promise ãè¿ãã¾ãã
ãããã¹ã解決ãããå ´åããã®ãã©ã³ãã使ç¨ãã¦ããã¹ããæç»ãã¾ãã
æå¦ãããå ´åã¯ã¨ã©ã¼ããã°åºåããã¾ãã
document.fonts.load("36px FontFamily Oxygen").then(
(fonts) => {
log.textContent += `Bitter font: ${fonts}\n`; // > Oxygen font: loaded
log.textContent += `Bitter font: ${oxygenFontFace.status}\n`; // > Oxygen font: loaded
ctx.font = '36px "FontFamily Oxygen"';
ctx.fillText("Oxygen font loaded", 20, 50);
},
(err) => {
console.error(err);
},
);
ãããã¹ãå¾
ã¤ä»£ããã«ãã¤ãã³ãã使ç¨ãã¦ãã©ã³ãã®èªã¿è¾¼ã¿å¦çã追跡ãããã¨ãã§ãã¾ãã
ä¸è¨ã®ã³ã¼ã㯠loading ã¤ãã³ã㨠loadingerror ã¤ãã³ããå¾
ã¡åããããããã®å ´åã®ãã©ã³ããã§ã¤ã¹ã®æ°ããã°åºåãã¦ãã¾ãã
loadingdone`ã¤ãã³ããªã¹ãã¼ã§ã¯ãããã«ãã©ã³ããã§ã¤ã¹ãå復å¦çãããã¡ããªã¼åããã°åºåãã¦ãã¾ãã
document.fonts.addEventListener("loading", (event) => {
log.textContent += `loading_event: ${event.fontfaces.length}\n`;
});
document.fonts.addEventListener("loadingerror", (event) => {
log.textContent += `loadingerror_event: ${event.fontfaces.length}\n`;
});
document.fonts.addEventListener("loadingdone", (event) => {
log.textContent += `loadingdone_event: ${event.fontfaces.length}\n`;
event.fontfaces.forEach((value) => {
log.textContent += ` fontface: ${value.family}\n`;
});
});
æå¾ã®ã³ã¼ãã¯ã FontFaceSet.ready ãè¿ããããã¹ã使ç¨ãã¦ããã©ã³ãã®èªã¿è¾¼ã¿å®äºãç£è¦ããæ¹æ³ã示ãã¦ãã¾ãã
ä»ã®ã¡ã«ããºã ã¨ã¯ç°ãªããããã¯ææ¸å
ã®å®ç¾©ãããã©ã³ãããã¹ã¦ãã¦ã³ãã¼ããããã¬ã¤ã¢ã¦ããå®äºããã¨ãã«è¿ãã¾ãã
ãããã¹ã解決ããã¨ãææ¸å ã®ãã©ã³ããã§ã¤ã¹ã®å¤ãå復å¦çãã¾ãã
document.fonts.ready.then(function () {
log.textContent += `\nFontFaces in document: ${document.fonts.size}.\n`;
for (const fontFace of document.fonts.values()) {
log.textContent += "FontFace:\n";
for (const property in fontFace) {
log.textContent += ` ${property}: ${fontFace[property]}\n`;
}
}
});
çµæ
ä¸è¨ã®åºåã§ã¯ "Oxygen "ãã©ã³ãã§æç»ããããã¹ãã表示ãã¦ãã¾ãã
ã¾ããã¤ãã³ãããã®ãã°åºåã¨ã document.fonts.ready ãè¿ããããã¹ã解決ããã¿ã¤ãã³ã°ã示ãã¦ãã¾ãã
仿§æ¸
| Specification |
|---|
| CSS Font Loading Module Level 3 > # fontface-interface > |