SVG изменяется при преобразовании в символ

У меня есть этот фиктивный svg, показывающий круг с какой-то серой фигурой внутри

<svg viewBox="0 0 86 86" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<defs>
    <circle id="path-1" cx="43" cy="43" r="43"></circle>
</defs>
<g stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
    <g transform="translate(-585.000000, -391.000000)">
        <g transform="translate(585.000000, 391.000000)">
            <mask id="mask-2" fill="white">
                <use xlink:href="#path-1"></use>
            </mask>
            <use id="Oval" fill="currentcolor" xlink:href="#path-1"></use>
            <g id="Group" mask="url(#mask-2)" fill="#b8b8b8">
                <g transform="translate(21.500000, 27.823529)" id="Page-1">
                    <path d="M0.5,0.176470588 L0.5,58.1764706 L15.5,58.1764706 L15.5,49.1764706 L29.5,49.1764706 L29.5,31.1764706 L7.5,31.1764706 L7.5,37.1764706 Z"></path>
                </g>
            </g>
        </g>
    </g>
</g>

когда я конвертирую его в спрайт с помощью gulp-svg-sprite с символом режима, я получаю такой результат

<?xml version="1.0" encoding="UTF-8" ?><svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><symbol viewBox="0 0 86 86" id="company"><defs><circle id="aa" cx="43" cy="43" r="43"/></defs><g fill="none" fill-rule="evenodd"><mask id="ab" fill="#fff"><use xlink:href="#aa"/></mask><use fill="currentcolor" xlink:href="#aa"/><g mask="url(#ab)" fill="#b8b8b8"><path d="M22 28v58h15v-9h14V59H29v6z"/></g></g></symbol></svg>

Теперь серая фигура выпадает из круга, и это даже происходит, если я копирую корневые def- и g-теги из моего оригинального svg прямо в тег-символ. Я также попытался вставить clipPath в символьную версию, но безуспешно.

Что мне здесь не хватает?

2 ответа

Возможно, это не полный ответ, но мне удалось заставить его работать;

Сначала я расширил свои определения с помощью clipPath, используя мой круг

<defs>
    <circle id="circle" cx="43" cy="43" r="43"></circle>
    <clipPath id="clippath"><use overflow="visible" xlink:href="#circle" /></clipPath>
</defs>

Затем, используя clipPath в моей первой группе и переключившись с gulp-svg-sprite на gulp-svgstore (который перемещает определения вверх, над символами), я получаю то, что я ожидаю, как в виде одного svg, так и в виде спрайта символа svg.

ОБНОВЛЕНО: Упрощение svg может работать... попробуйте примеры ниже, один с использованием символов, другой без (в случае, если код спрайта gulp не может иметь вложенные символы) ... это может быть проблемой с областью defs.

svg {
  width: 100px;
}
<svg viewBox="0 0 86 86" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
  <defs>
    <symbol id="c">
      <circle cx="43" cy="43" r="43" fill="currentColor" />    
    </symbol>
    <mask id="mask" color="#fff">
      <use xlink:href="#c" />
    </mask>
  </defs>
  <use xlink:href="#c" color="#666" />
  <path fill="#999" mask="url(#mask)" d="M10 0v60h30v-10h20v-20h-30v9z" />
</svg>

<svg viewBox="0 0 86 86" xmlns="http://www.w3.org/2000/svg">
  <defs>
    <mask id="mask2" color="#fff">
      <circle cx="43" cy="43" r="43" fill="#FFF" />
    </mask>
  </defs>
  <circle cx="43" cy="43" r="43" fill="currentColor" />
  <path fill="#999" mask="url(#mask2)" d="M10 0v60h30v-10h20v-20h-30v9z" />
</svg>

Другие вопросы по тегам