EDIT: à l'origine, je n'ai vérifié que les navigateurs de bureau - mais avec les navigateurs mobiles, l'image est encore plus compliquée.Canvas.measureText différences sur les navigateurs sont énormes
Je suis tombé sur un problème étrange avec certains navigateurs et ses capacités de rendu de texte et je ne suis pas sûr de pouvoir faire quoi que ce soit pour éviter cela.
Il semble que WebKit et (moins cohérent) Firefox sur Android créent un texte légèrement plus grand en utilisant la bibliothèque Canvas 2D. Je voudrais ignorer l'apparence visuelle pour l'instant, mais plutôt se concentrer sur les mesures de texte, car ceux-ci peuvent être facilement comparés.
J'ai utilisé les deux méthodes communes pour calculer la largeur du texte:
- Canvas 2D API et mesurer texte
- méthode DOM
tel que décrit dans cette question: Calculate text width with JavaScript cependant, les deux donnent plus ou moins le même résultat (sur tous les navigateurs).
function getTextWidth(text, font) {
// if given, use cached canvas for better performance
// else, create new canvas
var canvas = getTextWidth.canvas || (getTextWidth.canvas = document.createElement("canvas"));
var context = canvas.getContext("2d");
context.font = font;
var metrics = context.measureText(text);
return metrics.width;
};
function getTextWidthDOM(text, font) {
var f = font || '12px arial',
o = $('<span>' + text + '</span>')
.css({'font': f, 'float': 'left', 'white-space': 'nowrap'})
.css({'visibility': 'hidden'})
.appendTo($('body')),
w = o.width();
return w;
}
J'ai modifié le violon un peu en utilisant les polices Google qui permet d'effectuer des mesures de texte pour un ensemble de polices échantillons (s'il vous plaît attendre les WebFonts à charger avant de cliquer sur le bouton de mesure):
http://jsfiddle.net/aj7v5e4L/15/ (mis à jour à la force poids de police et le style)
l'exécution de ce sur différents navigateurs montre le problème que j'ai (en utilisant la chaîne « S »):
Les différences entre tous les navigateurs de bureau sont mineures - seul Safari se démarque comme ça - il est de l'ordre de 1% et 4% ce que j'ai vu, en fonction de la police. Donc ce n'est pas grand - mais jette mes calculs. MISE À JOUR: J'ai aussi testé quelques navigateurs mobiles - et sur iOS tous sont au même niveau que Safari (en utilisant WebKit sous le capot, donc pas de surprise) - et Firefox sur Android est très activé. J'ai lu que la précision du sous-pixel n'est pas vraiment supportée par tous les navigateurs (IE plus anciens par exemple) - mais arrondir même n'aide pas - car je peux alors avoir une largeur différente. L'utilisation de la police standard fournie avec le contexte renvoie exactement les mêmes mesures entre Chrome et Safari - donc je pense que c'est uniquement lié aux polices Web. Je suis un peu perplexe de ce que je pourrais faire maintenant - comme je pense que je fais juste quelque chose de mal car je n'ai rien trouvé sur le net - mais le violon est aussi simple que possible . J'ai passé toute la journée là-dessus vraiment - alors vous êtes mon seul espoir maintenant.
J'ai quelques solutions de contournement moche dans ma tête (par exemple rendre le texte sur les navigateurs affectés 4% plus petit) - que je voudrais vraiment éviter.
Votre table de résultats a été faite avec la chaîne '" S "'? Si oui, j'ai '15.73333..' sur firefox pour android sur la première police, qui est plus proche de vos résultats de safari que de tout autre. Vous n'avez pas accès à un vrai clavier pour l'instant, mais que se passe-t-il lorsque vous forcez le poids de la police? – Kaiido
Oui, a été créé avec la chaîne "S" - n'a même pas touché le royaume des navigateurs mobiles - qui pourrait ouvrir encore plus de problèmes;) - va essayer la police de poids – Michael