代码之家  ›  专栏  ›  技术社区  ›  Webwoman

ReactJS\usvg:如何在Firefox中为SVG的文本元素导入自定义字体?

  •  0
  • Webwoman  · 技术社区  · 5 年前

    我在使用NextJs的网络服务器上,codesandbox.io 以及stackblitz.com 阻止我在他们的云界面上下载字体。我已经创建了一个Github repo,这样您就可以自己在本地测试代码了。链接如下: https://github.com/Hocoh/svg_font_firefox/blob/master/README.md

    我将导入一个自定义字体,以便在Firefox中为SVG的文本元素使用,该文本元素将用作剪辑路径,以便在其上设置面板的动画 发现文本效果 . 为了简单起见,我在示例中只集成了一个面板,而在实际示例中有五个面板。当前呈现无法实现页面中的自定义字体。 要导入自定义字体,我已尝试:

    • 在文本和文本范围中使用字体族属性,
    • 使用内联样式,

    如果我理解的很好,Firefox遵循SVG规范的严格实现,这就可以解释为什么我的代码在Google Chrome和Opera中工作得很好,比如说在严格的遵从性之上,只是简单的CSS和选择器,在Firefox中会失败。

    如何在SVG文本的元素上显示自定义字体?

    从“React”导入React;

    导出默认值()=>(

     <svg 
    
        xmlns="http://www.w3.org/2000/svg"
        xmlnsXlink="http://www.w3.org/1999/xlink" 
        width="100%" height="100%"
        // viewBox="50% 50% 20% 20%"
    >
    
        {/* define style in SVG scope */} 
        <defs>
            {/* work when importing external  stylesheet
                 <style type="text/css"> 
                    {` 
                       @import url('https://fonts.googleapis.com/css?family=Dancing+Script&display=swap');
                    `}
                </style>
            */}
    
            {/* fail on local font's importing*/}
    
            {/* fail using relative path
                <style type="text/css"> 
                    {` 
                        @font-face{
                            font-family:AnuDaw;
                            src:
                                url("../font/Anud/AnuDaw.ttf") format("truetype"),
                                url("../font/Anud/AnuDaw.woff") format("woff"),
                                url("../font/Anud/AnuDaw.woff2") format("woff2"),
                                url("../font/Anud/AnuDaw.eot"),
                                url("../font/Anud/AnuDaw.eot?#iefix") format('embedded-opentype'),
                                url("../font/Anud/AnuDaw.svg")  format('svg');
                        }
                        text{
                            font-family: AnuDaw;
                            font-size:3em;
                        }
                    `}
                </style>
            */}
    
            {/* fail using root path*/}
             <style type="text/css"> 
                {` 
                    @font-face{
                        font-family:AnuDaw;
                        src:
                            url("../font/Anud/AnuDaw.ttf") format("truetype"),
                            url("../font/Anud/AnuDaw.woff") format("woff"),
                            url("../font/Anud/AnuDaw.woff2") format("woff2"),
                            url("../font/Anud/AnuDaw.eot"),
                            url("../font/Anud/AnuDaw.eot?#iefix") format('embedded-opentype'),
                            url("../font/Anud/AnuDaw.svg")  format('svg');
                    }
                    text{
                        font-family: AnuDaw;
                        font-size:3em;
                    }
                `}
            </style>
        </defs>
        <defs> 
            <g  
                className="text_group"        
                id="panel_animation"
               // style={{fontFamily:"AnuDaw"}}
                y="0"
    
            >
                 <text   
                        wordSpacing="-.45em"    
                        fontFamily="AnuDaw"
                    >
                    <tspan  x="0%" y="0%"  
                        dy="1.6em"   
                        >So</tspan> 
                    <tspan  x="0%" y="-5%" 
                        dy="3em"  
                        fontFamily="AnuDaw">Food</tspan>
                    </text> 
    
            </g>
        </defs> 
    
        <use
            width="100%" height="100%" 
            x="50%"
            xlinkHref="#panel_animation"                      
        /> 
    </svg>    
      )
    
    0 回复  |  直到 5 年前
        1
  •  1
  •   Peter T Bosse II    5 年前

    基于 your Github repo ,我相信这个问题是由于Next.js 不提供“字体”目录。静态资产需要从名为“Static”、“public”或“src/public”的目录(最后两个)提供服务 require Next.js 9.1 or later ).

    我已经 submitted a PR 这似乎解决了你所描述的问题,至少在我的测试中。如果它不能解决你的问题,请随时伸出援手,我很乐意进一步帮助你。

        2
  •  0
  •   Webwoman    5 年前

    此外,我还要补充彼得T博塞二世的回答,在我的情况下 的字体版本不适用于Firefox,但适用于其他浏览器,所以我必须管理字体的 延伸 所以在Firefox中也可以使用。

    目前我不知道为什么 真字型字体 的字体版本在Firefox中不起作用。如果我重新编译的话 的字体版本现在也可以与Firefox一起使用。

    同时,我简单地把 沃夫 沃夫2 的版本的字体在我的@font face导入顶部-导入似乎在第一个文件时停止可能是为了性能优化,所以它没有测试浏览器与其他字体的兼容性。

    现在我已经把 的版本的字体在我的@font face导入顶部它在Firefox上也运行良好。

    浏览器使用 沃夫 的文件,即WOFF1标准版本的WOFF扩展名,它位于@font face导入的顶部,因此根据devconsole网络的反馈,它是第一个加载的字体。