不同的 SVG 图标呈现相同的效果?

Posted

技术标签:

【中文标题】不同的 SVG 图标呈现相同的效果?【英文标题】:Different SVG Icons rendering the same? 【发布时间】:2018-10-14 21:59:23 【问题描述】:

我在我的 react 应用程序中使用“react-svg-loader”导入了两个 SVG 图标

图标作为具有自己路径的组件导入,但输出与代码中第一个图标的输出相同。

为什么会发生这种情况,我该如何解决?

这是我的代码:

import React,  Component  from 'react';

import Navigation from '../Navigation/index.js';
import MainLogo from '../MainLogo/index.js';
import Search from '../Search/index.js';
import './index.css'; // styles from

import Logo from '../../assets/svg/logos/Voo_Main.svg';
import SearchIcon from '../../assets/svg/icons/search.svg';

export default class Header extends Component 

  render() 
    const  navItems  = this.props;

    return (
      <header className="header">

        <SearchIcon />
        <Logo />
      </header>
    );
  
;

这是输出:

这是我的 webpack 配置中的加载器:

// react-svg-loader
// https://www.npmjs.com/package/react-svg-loader

    test: /\.svg$/,
    use: [
             
                 loader: "babel-loader",
             ,
             
                 loader: "react-svg-loader",
                 options: 
                     jsx: true, // true outputs JSX tags
                 ,
             ,
         ],
,

这是来自 DOM 的 SVG 图标的代码:

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"   viewBox="0 0 24 24">
  <defs>
    <path id="a" d="M14.5 16A6.508 6.508 0 0 1 8 9.5C8 5.916 10.916 3 14.5 3S21 5.916 21 9.5 18.084 16 14.5 16m0-15C9.813 1 6 4.813 6 9.5c0 1.983.688 3.807 1.832 5.254l-6.539 6.539a.999.999 0 1 0 1.414 1.414l6.539-6.539A8.443 8.443 0 0 0 14.5 18c4.687 0 8.5-3.813 8.5-8.5C23 4.813 19.187 1 14.5 1"></path>
  </defs>
  <g fill="none" fill-rule="evenodd">
    <mask id="b" fill="#fff">
      <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#a"></use>
    </mask>
    <use fill="#D3D3D3" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#a"></use>
    <g fill="#121A28" mask="url(#b)">
      <path d="M0 24h24V0H0z"></path>
    </g>
  </g>
</svg>

第二个图标:

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"   viewBox="0 0 120 50">
  <defs>
    <path id="a" d="M95.448 0c-6.967 0-13.25 2.905-17.717 7.567C73.262 2.905 66.979 0 60.01 0c-6.974 0-13.263 2.912-17.73 7.578C37.81 2.912 31.523 0 24.548 0 10.992 0 0 10.989 0 24.546c0 13.557 10.992 24.548 24.548 24.548 6.975 0 13.263-2.91 17.732-7.579 4.467 4.668 10.756 7.579 17.73 7.579 6.969 0 13.252-2.908 17.72-7.568 4.469 4.66 10.751 7.568 17.718 7.568 13.56 0 24.552-10.99 24.552-24.548C120 10.989 109.008 0 95.448 0M37.533 19.734l-9.664 14.84a3.968 3.968 0 0 1-3.327 1.8 3.967 3.967 0 0 1-3.33-1.8l-9.661-14.84a3.937 3.937 0 0 1 1.17-5.462 3.971 3.971 0 0 1 5.484 1.167l6.337 9.728 6.332-9.728a3.974 3.974 0 0 1 5.485-1.167 3.94 3.94 0 0 1 1.174 5.462m22.465 15.7c-6.018 0-10.898-4.878-10.898-10.898 0-6.018 4.88-10.899 10.898-10.899 6.021 0 10.903 4.88 10.903 10.9 0 6.02-4.88 10.897-10.903 10.897m35.438 0c-6.018 0-10.898-4.878-10.898-10.898 0-6.018 4.88-10.899 10.898-10.899 6.021 0 10.902 4.88 10.902 10.9 0 6.02-4.88 10.897-10.902 10.897"></path>
  </defs>
  <g fill="none" fill-rule="evenodd">
    <mask id="b" fill="#fff">
      <use xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#a"></use>
    </mask>
    <use fill="#FEFEFE" xmlns:xlink="http://www.w3.org/1999/xlink" xlink:href="#a"></use>
    <g fill="#D4107A" mask="url(#b)">
      <path d="M0 0h120v50H0z"></path>
    </g>
  </g>
</svg>

【问题讨论】:

看起来引用了相同的 ID。要进行测试,请检查呈现页面的 DOM。如果图标的元素具有相同引用的&lt;use xlink:href="#..." /&gt; 形式,则作为加载程序插件的一部分的SVGO 可能已经对它们进行了破坏。尝试设置选项cleanupIDs: false @ccprog 谢谢你,我已将 cleanupID 添加到 svg-loader 的 webpack 配置选项中,但无济于事。我还添加了 SVG 图标的 DOM 输出。图标确实具有与“#a”相同的 ID,因此输出相同。 我冒昧地重新格式化。就像我想的那样:&lt;use xlink:href="#a"&gt; 用于两个图标。这些 ID 与原始文件中使用的 ID 相同吗?在我看来,它仍然像 SVGO 使用的重命名约定。 我在另一个项目中使用了相同的插件 react-svg-loader ,我之前没有遇到过这个问题。这里唯一的区别是我从 Zeplin 下载 SVG 作为资产,而不是由设计师提供。我将检查 SVG 图标的代码。 @ccprog 发现罪魁祸首是 Zeplin 添加了这些标签,因为当我从 Illustrator 手动导出图标时,问题并没有持续存在。感谢您的帮助 【参考方案1】:

如果您将 SVG 转换为 .jsx 文件并修改属性以使其对 .jsx 友好,它将像 .svg 文件一样呈现 SVG。

import * as React from 'react';

const svg = (
    <div>
        <svg 
             
             
            viewBox="0 0 120 50"
        >
            <defs>
                <path 
                    id="a" 
                    d="M95.448 0c-6.967 0-13.25 
                    2.905-17.717 7.567C73.262 2.905 66.979 0 
                    60.01 0c-6.974 0-13.263 2.912-17.73 7.578C37.81 
                    2.912 31.523 0 24.548 0 10.992 0 0 10.989 0 24.546c0 
                    13.557 10.992 24.548 24.548 24.548 6.975 0 13.263-2.91 
                    17.732-7.579 4.467 4.668 10.756 7.579 17.73 7.579 6.969 
                    0 13.252-2.908 17.72-7.568 4.469 4.66 10.751 7.568 17.718 
                    7.568 13.56 0 24.552-10.99 24.552-24.548C120 10.989 109.008 
                    0 95.448 0M37.533 19.734l-9.664 14.84a3.968 3.968 0 0 1-3.327 
                    1.8 3.967 3.967 0 0 1-3.33-1.8l-9.661-14.84a3.937 3.937 0 0 1 
                    1.17-5.462 3.971 3.971 0 0 1 5.484 1.167l6.337 
                    9.728 6.332-9.728a3.974 3.974 0 0 1 5.485-1.167 3.94 3.94 0 
                    0 1 1.174 5.462m22.465 15.7c-6.018 0-10.898-4.878-10.898-10.898 
                    0-6.018 4.88-10.899 10.898-10.899 6.021 0 10.903 4.88 10.903 
                    10.9 0 6.02-4.88 10.897-10.903 10.897m35.438 0c-6.018 
                    0-10.898-4.878-10.898-10.898 0-6.018 4.88-10.899 10.898-10.899 
                    6.021 0 10.902 4.88 10.902 10.9 0 6.02-4.88 10.897-10.902 10.897"
                />
            </defs>
            <g fill="none" fillRule="evenodd">
                <mask id="b" fill="#fff">
                    <use xmlns="http://www.w3.org/1999/xlink" xlinkHref="#a"/>
                </mask>
                <use fill="#FEFEFE"/>
                <g fill="#D4107A" mask="url(#b)">
                    <path d="M0 0h120v50H0z"/>
                </g>
            </g >
        </svg >
    </div>
);

请原谅蓝色背景。这是我在测试开发环境中的背景颜色。

【讨论】:

以上是关于不同的 SVG 图标呈现相同的效果?的主要内容,如果未能解决你的问题,请参考以下文章

汉堡图标:尽管像素对齐,但面包+汉堡的大小相同?

存储 svg 图标的最佳实践?

如何将不同尺寸的 SVG 设置为相同的高度?

使用 CSS 变换在悬停时缩放 SVG 矩形

关键帧动画问题

setState 不更新字体真棒图标