Safari font rendering issues

前端 未结 8 790
独厮守ぢ
独厮守ぢ 2020-12-09 02:12

As you can see below, the Texta-Light font in Chrome appears completely different with Safari. Chrome displays the font as I like but Safari\'s rendering on OS X and iOS loo

相关标签:
8条回答
  • 2020-12-09 02:27

    Safari has an issue with fonts. The easiest fix for the duplicate text issue is clarifying the font-weight:

    font-weight: 400;
    

    Using Lucho's Javascript's text stroke solution along with specifying font-weight will make your text the same as it is on Chrome.

    0 讨论(0)
  • 2020-12-09 02:31

    If, as per your comment, you are only serving .otf, you will need to serve the other file types too.

    This could be causing an issue to do with iOs as until iOs 4.2, SVG was the only format to use custom fonts on the ipad or 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 */
    }
    

    A great tool to use is Font Squirrel's Webfont Generator

    Edit: Also as mentioned in the comments the font-weight is set to bold by default and you are loading a light font.

    0 讨论(0)
  • 2020-12-09 02:38

    Try this:

    html, body {
        text-rendering: optimizeLegibility;
    }
    

    or if like that it doesn't work,

    html, body {
        text-rendering: geometricPrecision;
    }
    
    0 讨论(0)
  • 2020-12-09 02:40

    Based on @lucho's answer, I used same approach but I'm applying the fix as soon as <body> tag loads. This fixes the issue with too thin Open Sans font in 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>
    

    ALTERNATIVE APPROACH:

    Alternatively you can add a class like ios-safari to <html> tag and then apply CSS to it normally:

      <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 讨论(0)
  • 2020-12-09 02:41

    I found a post which uses JS to adjust the text-stroke property. Here is the actual code:

    $(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');
        }
    
    
      });
    

    You can modify the text-stroke of some other element. Hope it helps.

    0 讨论(0)
  • 2020-12-09 02:47

    There is a CSS property, text-rendering, which in Safari is by default set to optimizeSpeed. What you want to change is:

    text-rendering:optimizeLegibility;
    

    enter image description here

    From https://css-tricks.com/almanac/properties/t/text-rendering/

    There are four possible values:

    • auto (default) - The browser makes educated guesses about when to optimize for speed, legibility, and geometric precision while drawing text. Be aware that different browsers interpret this value differently.

    • optimizeSpeed - The browser emphasizes rendering speed over legibility and geometric precision when drawing text. It disables kerning and ligatures.

    • optimizeLegibility - The browser emphasizes legibility over rendering speed and geometric precision. This enables the use of special kerning and optional ligature information that may be contained in the font file for certain fonts.

    • geometricPrecision - The browser emphasizes geometric precision over rendering speed and legibility. Certain aspects of fonts—such as kerning—don't scale linearly, so geometricPrecision can make text using those fonts look good. When SVG font is scaled, the browser calculates pixel size, then rounds to the nearest integer. The geometricPrecision property allows for more fluid scaling. Note: Only WebKit browsers apply this fluid value, Gecko treats the value just like optimizeLegibility.

    There is an additional setting -webkit-font-feature-settings, of which one of them is kerning:

    -webkit-font-feature-settings

    h2 {
         -webkit-font-feature-settings: "kern" 1;
    }
    
    0 讨论(0)
提交回复
热议问题