Problèmes de rendu des polices Safari

Comme vous pouvez le voir ci-dessous, la police Texta-Light dans Chrome apparaît complètement différente avec Safari. Chrome affiche la police comme j'aime, Mais le rendu de Safari sur OS X et iOS semble trop mince. L'image Safari ci-dessous est prise sur iOS et comme vous pouvez le voir pour une raison quelconque, la police apparaît comme s'il y avait deux bits de texte présents.

J'ai cherché une solution mais je n'ai rien trouvé qui fonctionne. J'ai essayé d'utiliser -webkit-font-smoothing: subpixel-antialiased; mais selon cette question , le code ne fonctionne pas plus.

Chrome:

Rendu des polices Chrome

Safari sur iOS:

Rendu des polices Safari

Voici le code pour les images ci-dessus:

h2 {
    font-family: 'Texta-Light', sans-serif;
    font-size: 3.5em;
    line-height: 1.2em;
}

Y a-t-il une solution à cela?

30
demandé sur Community 2015-06-25 20:07:31

6 réponses

Il existe une propriété CSS, text-rendering, qui, dans Safari, est définie par défaut sur optimizeSpeed. Ce que vous voulez changer est:

text-rendering:optimizeLegibility;

entrez la description de l'image ici

À Partir de https://css-tricks.com/almanac/properties/t/text-rendering/

Il y a quatre valeurs possibles:

* auto (par défaut) - le navigateur fait des suppositions instruites sur le moment d'optimiser pour la vitesse, la lisibilité et la précision géométrique tout en dessinant du texte. Sachez que différents navigateurs interprètent cette valeur différemment.

* optimizeSpeed-le navigateur met l'accent sur la vitesse de rendu sur la lisibilité et la précision géométrique lors du dessin du texte. Il désactive le crénage et les ligatures.

* optimizeLegibility - le navigateur met l'accent sur la lisibilité sur la vitesse de rendu et la précision géométrique. Cela permet d'utiliser des informations spéciales de crénage et de ligature facultatives qui peuvent être contenues dans le fichier de police pour certaines polices.

* geometricPrecision-le navigateur met l'accent sur la précision géométrique sur la vitesse de rendu et la lisibilité. Certains aspects des polices-tels que le crénage-ne sont pas mis à l'échelle linéairement, donc geometricPrecision peut rendre le texte en utilisant ces polices bien paraître. Lorsque la police SVG est mise à l'échelle, le navigateur calcule la taille des pixels, puis arrondit à l'entier le plus proche. La propriété geometricPrecision permet une mise à l'échelle plus fluide. Remarque: seuls les navigateurs WebKit appliquent cette valeur fluide, Gecko traite la valeur comme optimizeLegibility.

Il y a un paramètre supplémentaire -WebKit-font-feature-settings, dont l'un d'eux est crénage:

-webkit-font-feature-paramètres

h2 {
     -webkit-font-feature-settings: "kern" 1;
}
16
répondu empedocle 2015-07-06 08:20:41

Si, selon votre commentaire, vous ne servez que .otf, vous devrez également servir les autres types de fichiers.

Cela pourrait causer un problème avec iOs car jusqu'à iOs 4.2, SVG était le seul format à utiliser des polices personnalisées sur l'ipad ou l'iphone.

@font-face {
  font-family: 'MyWebFont';
  src: url('webfont.eot'); /* IE9 Compat Modes */
  src: url('webfont.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
       url('webfont.woff2') format('woff2'), /* Super Modern Browsers */
       url('webfont.woff') format('woff'), /* Pretty Modern Browsers */
       url('webfont.ttf')  format('truetype'), /* Safari, Android, iOS */
       url('webfont.svg#svgFontName') format('svg'); /* Legacy iOS */
}

Un excellent outil à utiliser est la Police Écureuil Webfont Générateur

Modifier: Comme mentionné dans les commentaires, font-weight est défini sur bold par défaut et vous chargez une police light.

10
répondu Guy 2015-07-02 21:29:00

J'ai trouvé un post qui utilise JS pour ajuster le texte-avc la propriété. Voici le code réel:

$(document).ready(function(){
    is_chrome = navigator.userAgent.indexOf('Chrome') > -1;
    is_explorer = navigator.userAgent.indexOf('MSIE') > -1;
    is_firefox = navigator.userAgent.indexOf('Firefox') > -1;
    is_safari = navigator.userAgent.indexOf("Safari") > -1;
    is_opera = navigator.userAgent.indexOf("Presto") > -1;
    is_mac = (navigator.userAgent.indexOf('Mac OS') != -1);
    is_windows = !is_mac;

    if (is_chrome && is_safari){
      is_safari=false;
    }

    if (is_safari || is_windows){
      $('body').css('-webkit-text-stroke', '0.5px');
    }


  });

Vous pouvez modifier le contour de texte d'un autre élément. Espérons que cela aide.

8
répondu Lucho 2015-08-06 01:41:49

Safari a un problème avec les polices. La solution la plus simple pour le problème du texte en double est de clarifier le font-weight:

font-weight: 400;

L'utilisation de la solution JavaScript text stroke de Lucho avec la spécification font-weight rendra votre texte identique à celui de Chrome.

8
répondu Pav Sidhu 2016-05-21 17:03:19

Essayez ceci:

html, body {
    text-rendering: optimizeLegibility;
}

Ou si comme ça ça ne marche pas,

html, body {
    text-rendering: geometricPrecision;
}
4
répondu ZwartyZ 2015-07-05 18:06:56

Basé sur la réponse de @lucho, j'ai utilisé la même approche mais j'applique le correctif dès que la balise <body> se charge. Cela résout le problème avec une police sans ouverte trop mince dans iOS Safari.

<body>
<script>
  (function () {
    var ua = navigator.userAgent
    var isIOSSafari = /iPhone|iPad|iPod/.test(ua) && /AppleWebKit.*Safari\//i.test(ua) && ua.indexOf('Chrome') === -1
    if (isIOSSafari) {
      document.body.style.webkitTextStroke = '.5px'
    }
  })()
</script>

APPROCHE ALTERNATIVE:

Vous pouvez également ajouter une classe comme ios-safari à la balise <html>, puis lui appliquer CSS normalement:

  <script>
  (function () {
    const ua = navigator.userAgent
    const isIOSSafari = /iPhone|iPad|iPod/.test(ua) && /AppleWebKit.*Safari\//i.test(ua) && !ua.includes('Chrome')
    if (isIOSSafari) document.documentElement.classList.add('ios-safari')
  })()
  </script>
</head>

CSS:

.ios-safari {
  -webkit-text-stroke: .5px;
}
0
répondu artnikpro 2018-07-21 22:59:43