Маска работает правильно на конкретные линии

Описание

Пытаюсь создать иконку мины. С таким кодом...

<svg width="32" height="32" viewBox="-16 -16 32 32" xmlns="http://www.w3.org/2000/svg">
    <defs>
        <mask id="circle-clip">
            <rect x="-16" y="-16" width="64" height="64" fill="white" />
            <circle r="2" cx="-2" cy="-2" fill="black" />
        </mask>
    </defs>
    <line x1="-11" y1="0" x2="11" y2="0" stroke="#151515" stroke-linecap="round" />
    <line x1="0" y1="-11" x2="0" y2="11" stroke="#151515" stroke-linecap="round" />
    <line x1="-7" y1="-7" x2="7" y2="7" stroke="#151515" stroke-linecap="round" />
    <line x1="7" y1="-7" x2="-7" y2="7" stroke="#151515" stroke-linecap="round" />
    <circle r="7" cx="0" cy="0" fill="#151515" mask="url(#circle-clip)" />
</svg>

...получается вот так:

Теперь, чтобы в вырезанной круговой части убирать линии, использую ту же маску и на них что и на большой круг.
Если я использую маску на диагональные линии, то все работает отлично:

<svg width="32" height="32" viewBox="-16 -16 32 32" xmlns="http://www.w3.org/2000/svg">
    <defs>
        <mask id="circle-clip">
            <rect x="-16" y="-16" width="64" height="64" fill="white" />
            <circle r="2" cx="-2" cy="-2" fill="black" />
        </mask>
    </defs>
    <line x1="-11" y1="0" x2="11" y2="0" stroke="#151515" stroke-linecap="round" />
    <line x1="0" y1="-11" x2="0" y2="11" stroke="#151515" stroke-linecap="round" />
    <line x1="-7" y1="-7" x2="7" y2="7" stroke="#151515" stroke-linecap="round" mask="url(#circle-clip)" />
    <line x1="7" y1="-7" x2="-7" y2="7" stroke="#151515" stroke-linecap="round" mask="url(#circle-clip)" />
    <circle r="7" cx="0" cy="0" fill="#151515" mask="url(#circle-clip)" />
</svg>

Если я использую маску на НЕ диагональные линии, то они исчезают полностью:

<svg width="32" height="32" viewBox="-16 -16 32 32" xmlns="http://www.w3.org/2000/svg">
    <defs>
        <mask id="circle-clip">
            <rect x="-16" y="-16" width="64" height="64" fill="white" />
            <circle r="2" cx="-2" cy="-2" fill="black" />
        </mask>
    </defs>
    <line x1="-11" y1="0" x2="11" y2="0" stroke="#151515" stroke-linecap="round" mask="url(#circle-clip)" />
    <line x1="0" y1="-11" x2="0" y2="11" stroke="#151515" stroke-linecap="round" mask="url(#circle-clip)" />
    <line x1="-7" y1="-7" x2="7" y2="7" stroke="#151515" stroke-linecap="round" mask="url(#circle-clip)" />
    <line x1="7" y1="-7" x2="-7" y2="7" stroke="#151515" stroke-linecap="round" mask="url(#circle-clip)" />
    <circle r="7" cx="0" cy="0" fill="#151515" mask="url(#circle-clip)" />
</svg>

Насколько я понимаю, маску правильно настроил...

Вопрос

Почему это происходит?
Как это исправить?


Ответы (1 шт):

Автор решения: Alexey Ten

Я нашёл вот такой тикет в багтрекере Chromium-а, и похоже это какой-то специфический случай для объектов с пустым bounding box.

Можно задать maskUnits="userSpaceOnUse" x="-16" y="-16" у маски.

А можно просто сгруппировать все элементы и поставить маску на группу.

<svg width="320" height="320" viewBox="-16 -16 32 32" xmlns="http://www.w3.org/2000/svg">
    <defs>
      <mask id="circle-clip">
        <rect x="-16" y="-16" width="64" height="64" fill="white" />
        <circle r="2" cx="-2" cy="-2" fill="black" />
      </mask>
    </defs>
    <g mask="url(#circle-clip)">
      <line x1="-11" y1="-0" x2="11" y2="0" stroke="#151515" stroke-linecap="round" />
      <line x1="0" y1="-11" x2="0" y2="11" stroke="#151515" stroke-linecap="round" />
      <line x1="-7" y1="-7" x2="7" y2="7" stroke="#151515" stroke-linecap="round" />
      <line x1="7" y1="-7" x2="-7" y2="7" stroke="#151515" stroke-linecap="round" />
    <circle r="7" cx="0" cy="0" fill="#151515" />
    </g>
</svg>

→ Ссылка