Skip to content

Instantly share code, notes, and snippets.

@384400
Last active October 8, 2016 20:57
Show Gist options
  • Save 384400/45dd59b4ce5c86c1823a to your computer and use it in GitHub Desktop.
Save 384400/45dd59b4ce5c86c1823a to your computer and use it in GitHub Desktop.
[JavaScript] [Css] [Html] Comment utiliser une police de caractères personnalisée ?

Comment utiliser une police de caractères personnalisée ?

Avec [Google Fonts] (https://fonts.google.com/), la police personnalisée doit être indiquée dans body et pas dans html !

Cependant, à l'heure où nous rédigeons ces lignes, quelques bogues empêchent la prise en charge de certains caractères spéciaux, comme les ellipses. Par exemple, si nous appelons la fonte Source Sans Pro en utilisant [Google Fonts] (https://fonts.google.com/)...

<link href="https://fonts.googleapis.com/css?family=Source+Sans+Pro" rel="stylesheet">
<style>
    body {
        font-family: 'Source Sans Pro', 'Times New Roman';
    }
</style>

... le glyphe 0x2026 n'est pas reconnu.

En revanche, si nous appelons la fonte Source Sans Pro directement...

<style>
    @font-face {
        font-family: 'My font';
        src: url('source/SourceSansPro-Regular.ttf') format('truetype');
    }
    html {
        font-family: 'My Font', 'Times New Roman';
    }
</style>

... le glyphe 0x2026 est reconnu.

C'est pourquoi, nous préférons embarquer nos propres polices de caractère, sans recourir à un service tiers, même si cet usage limite la vitesse de chargement des pages.

Rares (inexistants ?) sont les jeux de polices qui comprennent tous les glyphes. Aussi convient-il d'éviter les caractères exotiques au format Ascii (si le caractère n'existe pas, le navigateur recherche un substitut par défaut dans les polices installées sur la machine, voire affiche un infâme carré). Ils seront avantageusement remplacés par des icônes au format Svg.

[The LaTeX Font Catalogue] (http://www.tug.dk/FontCatalogue/) permet d'obtenir des polices complètes, d'aspect professionnel, avec des licences d'utilisation libres.

Comme le pointe Chris Coyier, il est envisageable de demander l'affichage conditionnel des polices de caractères personnalisées grâce aux Media Queries : [Using @font-faces] (https://css-tricks.com/snippets/css/using-font-face/).

Désormais, nous nous limitons à l'embarquement des polices de caractères au format True Type Font (Ttf), dont le support est satisfaisant dans la plupart des navigateurs.

Paul Irish explique comment utiliser le script [WebFont Loader] (https://developers.google.com/fonts/docs/webfont_loader?csw=1) : [Quick guide to webfonts via @font-face] (http://www.html5rocks.com/en/tutorials/webfonts/quick/).

Avec [WebFont Loader] (https://developers.google.com/fonts/docs/webfont_loader?csw=1), qui évite l'effet Fout (Flash Of Unstyled Text, c'est-à-dire un clignotement du contenu), la page est affichée dans la police de caractères par défaut et, lorsque la police est téléchargée, le texte s'enrichit de la police de caractères personnalisée.

Les polices de caractères au format Open Type Font (Otf) sont évidemment plus précises que les polices au format TrueType Font (Otf) et, en corollaire, les fichiers nettement plus importants : ils ralentissent la vitesse de chargement d'une page ou alourdissent la taille d'un fichier généré au format Portable Document Format (Pdf).

Voici un exemple d'usage dans une feuille de style...

@font-face {
	font-family: 'Roboto';
	src: url('fonts/Roboto-Regular.ttf') format('truetype');
}
@font-face {
	font-family: 'Roboto Bold';
	src: url('fonts/Roboto-Bold.ttf') format('truetype');
}
@font-face {
	font-family: 'Roboto Italic';
	src: url('fonts/Roboto-RegularItalic.ttf') format('truetype');
}
@font-face {
	font-family: 'Roboto Bold Italic';
	src: url('fonts/Roboto-BoldItalic.ttf') format('truetype');
}
html {
	font-family: 'Roboto', sans-serif;
}
h1, h2, h3, h4, h5, h6 {
	font-family: 'Roboto Bold', sans-serif;
}
strong {
	font-family: 'Roboto Bold', sans-serif;
}
em {
	font-family: 'Roboto Italic', sans-serif;
}
strong em {
	font-family: 'Roboto Bold Italic', sans-serif;
}

Le fichier glyph-emulator.html constitue un outil permettant de voir si une police de caractère contient les glyphes demandés.

Le fichier glyph-renderer.html permet de comparer les fontes dans les trois familles principales : Sans-Serif, Serif, Monospace.

<!DOCTYPE html>
<html lang="fr">
<head>
<title>Comment utiliser une police de caractères personnalisée ?</title>
<style>
.wf-loading body {
font-family: sans-serif;
visibility: hidden;
}
.wf-active body {
font-family: 'Noto Sans', sans-serif;
visibility: visible;
}
</style>
</head>
<body>
<script>
WebFontConfig = {
google: { families: [ 'Noto+Sans::latin' ] },
timeout: 2000
};
var wf = document.createElement('script');
wf.src = ('https:' == document.location.protocol ? 'https' : 'http') +
'://ajax.googleapis.com/ajax/libs/webfont/1.5.18/webfont.js';
wf.type = 'text/javascript';
wf.async = 'true';
var s = document.getElementsByTagName('script')[0];
s.parentNode.insertBefore(wf, s);
})();
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8" />
<title>Émulateur de glyphes</title>
<style>
@font-face {
font-family: 'My font';
src: url('source/SourceSansPro-Regular.ttf') format('truetype');
}
html {
font-family: 'My Font', 'Times New Roman';
}
body {
font-size: 2em;
margin: auto;
width: 1024px;
}
table {
font-size: inherit;
width: 100%;
}
table, th, td {
border: 0.625em solid #444;
}
td {
text-align: center;
}
td:nth-child(3) {
font-family: 'Times New Roman';
}
.notes {
background-color: #eee;
font-family: Consolas, Monaco, Courier, monospace;
font-size: smaller;
margin: auto 2.5%;
padding: 2.5%;
}
ul.zoom {
list-style-type: none;
margin-left: 0;
padding-left: 0;
}
ul.zoom li {
background-color: #444;
color: #fff;
cursor: pointer;
display: inline;
font-family: Consolas, Monaco, Courier, monospace;
padding: 0.25em;
}
ul.zoom li:nth-child(1) {
margin-right: 0.25em;
}
ul.zoom li:nth-child(2) {
margin-left: 0.25em;
}
</style>
</head>
<body>
<h1>Émulateur de glyphes</h1>
<div class="notes">
<h2>Présentation</h2>
<p>Lorsque nous recourons à l&#x2019;affichage d&#x2019;une police de caractères personnalisée, il est difficile de déterminer si chaque glyphe existe. Par défaut, les navigateurs affichent des caractères de substitution. Selon nos test empiriques conduits avec Mozilla Firefox (version 49.0.1) et Google Chrome (version 53.0.2785.143) sous Windows 10, la substitution s&#x2019;effectue dans l'ordre suivant&#x202F;: si le glyphe demandé n&#x2019;existe pas, un caractère de substitution est recherché dans la police générique éventuellement déclarée et, en cas d&#x2019;échec, dans n&#x2019;importe quelle police installée dans le système d&#x2019;exploitation.</p>
<p>Dans nos travaux de typographie, nous utilisons les glyphes suivants&#x202F;: <em>0x0020</em>, <em>0x00A0</em>, <em>0x202F</em>, <em>0x2003</em>, <em>0x2002</em>, <em>0x2004</em>, <em>0x2005</em>, <em>0x2006</em>, <em>0x2009</em>, <em>0x200A</em>, <em>0x00AD</em>, <em>0x002D</em>, <em>0x2010</em>, <em>0x2011</em>, <em>0x2012</em>, <em>0x2013</em>, <em>0x2014</em>, <em>0x2043</em>, <em>0x2026</em>, <em>0x00AB</em>, <em>0x00BB</em>, <em>0x0026</em>, <em>0x2019</em>, <em>0x0022</em>, <em>0x003D</em>, <em>0x002F</em>, <em>0x003C</em>, <em>0x003E</em>.</p>
<p>Or, <a href="http://www.babelstone.co.uk/Software/BabelMap.html" title="aller sur BabelMap (s'ouvre dans une nouvelle fenêtre)" target="blank">BabelMap</a> indique que notre liste de glyphes est exclusivement supportée par les polices <em>Microsoft PhagsPa</em>, <em>Microsoft Sans Serif</em>, <em>Segoe UI Symbol</em> et <em>Times New Roman</em> qui sont présentes dans notre système d&#x2019;exploitation.</p>
<p>Aussi avons-nous conçu cet outil rudimentaire&#x2026; Après un pangramme illustratif, nous comparons un à un chaque glyphe. La première colonne indique le nom du caractère, la deuxième le rendu du caractère dans la police souhaitée, la troisième le rendu du caractère dans la police par défaut. Dans la présente page, nous comparons <em>Source Sans Pro</em> et <em>Times New Roman</em>&#x202F;: si les deux caractères sont identiques, nous pouvons en conclure que <em>Noto Serif</em> ne comprend pas le glyphe correspondant. La comparaison est encore plus facile en agrandissant le texte. En revanche, les espaces posent un problème de représentation&#x202F;!</p>
<p>En cas de doute, il est possible de recourir aux outils de développement de Firefox. L&#x2019;outil de Chrome est moins convivial.</p>
<p>Sous Firefox, un clic droit sur le caractère puis sur <em>Examiner l&#x2019;élément</em> affiche la police de caractères réellement utilisée dans l&#x2019;onglet <em>Polices</em>.</p>
<p>Sous Chrome, un clic droit sur le caractère puis sur <em>Inspecter</em> dans le menu déroulant affiche la police de caractères réellement utilisée dans l&#x2019;onglet <em>Styles</em> et dans la section <em>Rendered Fonts</em> ou, à défaut, dans <em>Filter</em>.</p>
<p><em>Nota</em>. La discussion <a href="http://stackoverflow.com/questions/884177/how-can-i-determine-what-font-a-browser-is-actually-using-to-render-some-text" title="lire la discussion sur Stack Overflow (s'ouvre dans une nouvelle fenêtre)" target="-blank"><em>How can I determine what font a browser is actually using to render some text?</em></a> affiche des copies d&#x2019;écran.</p>
</div>
<h2>Pangrammes</h2>
<p>Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d&#x2019;exquis rôtis de bœuf au kir à l’aÿ d&#x2019;âge mûr & cætera !</p>
<p>Portez ce vieux whisky au juge blond qui fume sur son île intérieure, à côté de l&#x2019;alcôve ovoïde, où les bûches se consument dans l&#x2019;âtre, ce qui lui permet de penser à la cænogénèse de l&#x2019;être dont il est question dans la cause ambiguë entendue à Moÿ, dans un capharnaüm qui, pense-t-il, diminue çà et là la qualité de son œuvre.</p>
<ul class="zoom">
<li onclick="resizeText(1); return false;" title="agrandir le texte">A +</li>
<li onclick="resizeText(-1); return false;" title="rétrécir le texte">A -</li>
</ul>
<h2>Liste des glyphes souhaités</h2>
<p><strong>|</strong>&#x20; &#xA0; &#x202F; &#x2003; &#x2002; &#x2004; &#x2005; &#x2006; &#x2009; &#x200A; &#xAD; &#x002D; &#x2010; &#x2011; &#x2012; &#x2013; &#x2014; &#x2043; &#x2026; &#x00AB; &#x00BB; &#x0026; &#x2019; &#x22; &#x3D; &#x2F; &#x3C; &#x3E;<strong>|</strong></p>
<ul class="zoom">
<li onclick="resizeText(1); return false;" title="agrandir les caractères">A +</li>
<li onclick="resizeText(-1); return false;" title="rétrécir les caractères">A -</li>
</ul>
<h2>Espaces</h2>
<table>
<tr>
<td>Espace sécable</td>
<td>&#x20;</td>
<td>&#x20;</td>
</tr>
<tr>
<td>Espace insécable</td>
<td>&#xA0;</td>
<td>&#xA0;</td>
</tr>
<tr>
<td>Espace fine insécable</td>
<td>&#x202F;</td>
<td>&#x202F;</td>
</tr>
<tr>
<td>Cadratin</td>
<td>&#x2003;</td>
<td>&#x2003;</td>
</tr>
<tr>
<td>Demi-cadratin</td>
<td>&#x2002;</td>
<td>&#x2002;</td>
</tr>
<tr>
<td>Quart de cadratin</td>
<td>&#x2005;</td>
<td>&#x2005;</td>
</tr>
<tr>
<td>Sixième de cadratin</td>
<td>&#x2006;</td>
<td>&#x2006;</td>
</tr>
<tr>
<td>Espace fine</td>
<td>&#x2009;</td>
<td>&#x2009;</td>
</tr>
<tr>
<td>Espace ultra-fine</td>
<td>&#x200A;</td>
<td>&#x200A;</td>
</tr>
</table>
<ul class="zoom">
<li onclick="resizeText(1); return false;" title="agrandir les caractères">A +</li>
<li onclick="resizeText(-1); return false;" title="rétrécir les caractères">A -</li>
</ul>
<h2>Tirets et traits d&#x2019;union</h2>
<table>
<tr>
<td>Trait d&#x2019;union conditionnel</td>
<td>&#xAD;</td>
<td>&#xAD;</td>
</tr>
<tr>
<td>Signe moins</td>
<td>&#x2D;</td>
<td>&#x2D;</td>
</tr>
<tr>
<td>Trait d&#x2019;union</td>
<td>&#x2010;</td>
<td>&#x2010;</td>
</tr>
<tr>
<td>Trait d&#x2019;union insécable</td>
<td>&#x2011;</td>
<td>&#x2011;</td>
</tr>
<tr>
<td>Tiret numérique</td>
<td>&#x2012;</td>
<td>&#x2012;</td>
</tr>
<tr>
<td>Tiret moyen</td>
<td>&#x2013;</td>
<td>&#x2012;</td>
</tr>
<tr>
<td>Tiret long</td>
<td>&#x2014;</td>
<td>&#x2014;</td>
</tr>
<tr>
<td>Puce trait d&#x2019;union</td>
<td>&#x2043;</td>
<td>&#x2043;</td>
</tr>
</table>
<ul class="zoom">
<li onclick="resizeText(1); return false;" title="agrandir les caractères">A +</li>
<li onclick="resizeText(-1); return false;" title="rétrécir les caractères">A -</li>
</ul>
<h2>Autres caractères spéciaux</h2>
<table>
<tr>
<td>Points de suspension</td>
<td>&#x2026;</td>
<td>&#x2026;</td>
</tr>
<tr>
<td>Guillemet ouvrant</td>
<td>&#xAB;</td>
<td>&#xAB;</td>
</tr>
<tr>
<td>Guillemet fermant</td>
<td>&#xBB;</td>
<td>&#xBB;</td>
</tr>
<tr>
<td>Et commercial</td>
<td>&#x26;</td>
<td>&#x26;</td>
</tr>
<tr>
<td>Guillemet simple fermant, guillemet-apostrophe</td>
<td>&#x2019;</td>
<td>&#x2019;</td>
</tr>
<tr>
<td>Guillemets droits</td>
<td>&#x22;</td>
<td>&#x22;</td>
</tr>
<tr>
<td>Égal</td>
<td>&#x3D;</td>
<td>&#x3D;</td>
</tr>
<tr>
<td>Barre oblique</td>
<td>&#x2F;</td>
<td>&#x2F;</td>
</tr>
<tr>
<td>Inférieur</td>
<td>&#x3C;</td>
<td>&#x3C;</td>
</tr>
<tr>
<td>Supérieur</td>
<td>&#x3E;</td>
<td>&#x3E;</td>
</tr>
</table>
<ul class="zoom">
<li onclick="resizeText(1); return false;" title="agrandir les caractères">A +</li>
<li onclick="resizeText(-1); return false;" title="rétrécir les caractères">A -</li>
</ul>
<h2>Ligatures</h2>
<table>
<tr>
<td>Œ</td>
<td>&#x152;</td>
<td>&#x152;</td>
</tr>
<tr>
<td>œ</td>
<td>&#x153;</td>
<td>&#x153;</td>
</tr>
<tr>
<td>Æ</td>
<td>&#xC6;</td>
<td>&#xC6;</td>
</tr>
<tr>
<td>æ</td>
<td>&#xE6;</td>
<td>&#xE6;</td>
</tr>
<tr>
<td>ff</td>
<td>&#xFB00;</td>
<td>&#xFB00;</td>
</tr>
<tr>
<td>fi</td>
<td>&#xFB01;</td>
<td>&#xFB01;</td>
</tr>
<tr>
<td>fl</td>
<td>&#xFB02;</td>
<td>&#xFB02;</td>
</tr>
</table>
<ul class="zoom">
<li onclick="resizeText(1); return false;" title="agrandir les caractères">A +</li>
<li onclick="resizeText(-1); return false;" title="rétrécir les caractères">A -</li>
</ul>
<script>
function resizeText(multiplier) {
if (document.body.style.fontSize == '') {
document.body.style.fontSize = '2em';
}
document.body.style.fontSize = parseFloat(document.body.style.fontSize) + (multiplier * 0.2) + 'em';
}
</script>
</body>
</html>
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="utf-8" />
<title>Visualisateur de glyphes</title>
<style>
@font-face {
font-family: 'My Sans Serif font';
src: url('source/SourceSansPro-Regular.ttf') format('truetype');
}
@font-face {
font-family: 'My Serif font';
src: url('source/SourceSerifPro-Regular.ttf') format('truetype');
}
@font-face {
font-family: 'My Monospace font';
src: url('source/SourceCodePro-Regular.ttf') format('truetype');
}
html {
font-family: 'My Sans Serif font';
}
body {
font-size: 2em;
margin: auto;
width: 1024px;
}
.sans-serif {
font-family: 'My Sans Serif Font';
}
.serif {
font-family: 'My Serif Font';
}
.monospace {
font-family: 'My Monospace Font';
}
ul.zoom li {
background-color: #444;
color: #fff;
cursor: pointer;
display: inline;
font-family: Consolas, Monaco, Courier, monospace;
padding: 0.25em;
}
ul.zoom li:nth-child(1) {
margin-right: 0.25em;
}
ul.zoom li:nth-child(2) {
margin-left: 0.25em;
}
</style>
</head>
<body>
<h1>Visualisateur de glyphes</h1>
<h2><em>Sans Serif</em> (sans empattements)</h2>
<div class="sans-serif">
<p>Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d&#x2019;exquis rôtis de bœuf au kir à l’aÿ d&#x2019;âge mûr & cætera !</p>
<p>Portez ce vieux whisky au juge blond qui fume sur son île intérieure, à côté de l&#x2019;alcôve ovoïde, où les bûches se consument dans l&#x2019;âtre, ce qui lui permet de penser à la cænogénèse de l&#x2019;être dont il est question dans la cause ambiguë entendue à Moÿ, dans un capharnaüm qui, pense-t-il, diminue çà et là la qualité de son œuvre.</p>
<ul class="zoom">
<li onclick="resizeText(1); return false;" title="agrandir le texte">A +</li>
<li onclick="resizeText(-1); return false;" title="rétrécir le texte">A -</li>
</ul>
</div>
<h2><em>Serif</em> (avec empattements)</h2>
<div class="serif">
<p>Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d&#x2019;exquis rôtis de bœuf au kir à l’aÿ d&#x2019;âge mûr & cætera !</p>
<p>Portez ce vieux whisky au juge blond qui fume sur son île intérieure, à côté de l&#x2019;alcôve ovoïde, où les bûches se consument dans l&#x2019;âtre, ce qui lui permet de penser à la cænogénèse de l&#x2019;être dont il est question dans la cause ambiguë entendue à Moÿ, dans un capharnaüm qui, pense-t-il, diminue çà et là la qualité de son œuvre.</p>
<ul class="zoom">
<li onclick="resizeText(1); return false;" title="agrandir le texte">A +</li>
<li onclick="resizeText(-1); return false;" title="rétrécir le texte">A -</li>
</ul>
</div>
<h2><em>Monospace</em> (à chasse fixe)</h2>
<div class="monospace">
<p>Dès Noël où un zéphyr haï me vêt de glaçons würmiens je dîne d&#x2019;exquis rôtis de bœuf au kir à l’aÿ d&#x2019;âge mûr & cætera !</p>
<p>Portez ce vieux whisky au juge blond qui fume sur son île intérieure, à côté de l&#x2019;alcôve ovoïde, où les bûches se consument dans l&#x2019;âtre, ce qui lui permet de penser à la cænogénèse de l&#x2019;être dont il est question dans la cause ambiguë entendue à Moÿ, dans un capharnaüm qui, pense-t-il, diminue çà et là la qualité de son œuvre.</p>
<ul class="zoom">
<li onclick="resizeText(1); return false;" title="agrandir le texte">A +</li>
<li onclick="resizeText(-1); return false;" title="rétrécir le texte">A -</li>
</ul>
</div>
<script>
function resizeText(multiplier) {
if (document.body.style.fontSize == '') {
document.body.style.fontSize = '2em';
}
document.body.style.fontSize = parseFloat(document.body.style.fontSize) + (multiplier * 0.2) + 'em';
}
</script>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment