Почему анимация SVG останавливается при использовании xlink:href для внешнего файла

По какой-то причине мой spinner.svg не анимируется при использовании xlink:href. Встраивание SVG на страницу и использование xlink:href работает нормально, как показано во фрагменте ниже.

Проблема: статичный (и сплошной!) счетчик вместо анимации

Сплошной счетчик - без анимации

Почему теги анимации SVG внезапно перестают действовать? Ссылка должна работать, поскольку изображение действительно отображается.

EDIT: может ли это быть связано с теневым домом и внешней ссылкой? Согласно Саре Суэйдан "Целевой элемент должен быть частью текущего SVG фрагмент документа». Я мог бы перегружать то, что означает «фрагмент документа», но для меня фрагменты документа принадлежат стране Shadow DOM, и я подозреваю, что анимация SMIL может не работать при использовании операторов <use> из-за этого?

Рабочие версии

.xlinked {
  color: green;
}

img {
  color: red; // not taking effect - of course! just a test.
}

.embedded {
  color: blue;
}
  
<h1>xlink local</h1>
<svg class="xlinked">
    <!-- could not get this external reference to work?
    <use xlink:href="http://imgh.us/spinner_1.svg" />
    -->
    <use xlink:href="#spinner" />
</svg>

<h1>embedded</h1>
<div class="embedded">
    <svg id="embedded"  xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid">
        <circle cx="50" cy="50" r="45" stroke="rgba(43,43,43,0.3)" fill="none" stroke-width="10" stroke-linecap="round"/>
        <circle cx="50" cy="50" r="45" stroke="currentColor" fill="none" stroke-width="6" stroke-linecap="round">
            <animate attributeName="stroke-dashoffset" dur="2s" repeatCount="indefinite" from="0" to="502"/>
            <animate attributeName="stroke-dasharray" dur="2s" repeatCount="indefinite" values="150.6 100.4;1 250;150.6 100.4"/>
        </circle>
    </svg>
</div>

<h1>img</h1>
<img src="http://imgh.us/spinner_1.svg" />

<h1>External absolute xlink (not working)</h1>
<svg>
    <!-- could not get this external reference to work. should be the same as a local reference?  -->
    <use xlink:href="http://imgh.us/spinner_1.svg" />
</svg>

<h1>Source SVG with symbols for xlink reference </h1>
<svg xmlns="http://www.w3.org/2000/svg"><symbol id="spinner" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid"><circle cx="50" cy="50" r="45" stroke="rgba(43,43,43,0.3)" fill="none" stroke-width="10" stroke-linecap="round"/><circle cx="50" cy="50" r="45" stroke="currentColor" fill="none" stroke-width="6" stroke-linecap="round"><animate attributeName="stroke-dashoffset" dur="2s" repeatCount="indefinite" from="0" to="502"/><animate attributeName="stroke-dasharray" dur="2s" repeatCount="indefinite" values="150.6 100.4;1 250;150.6 100.4"/></circle></symbol></svg>


person oligofren    schedule 15.02.2017    source источник


Ответы (1)


В SVG1.1 элемент Use требует ссылки на фрагмент SVG, а не на URL-адрес SVG. Попробуйте добавить атрибут id к корневому элементу svg внешнего файла SVG и добавьте хеш-строку к значению href используемого элемента, например так.

внешний svg (spinner_1.svg)

<svg xmlns="http://www.w3.org/2000/svg" id="root">
<!--svg structure-->
</svg>

html использует внешний файл SVG

<svg>
    <use xlink:href="http://imgh.us/spinner_1.svg#root" />
</svg>

Примечание. В SVG2 вы можете установить URL-адрес SVG в атрибут href используемого элемента. См. https://www.w3.org/TR/2016/CR-SVG2-20160915/struct.html#UseElement

person defghi1977    schedule 15.02.2017
comment
Хотя это объясняет, почему прямая внешняя ссылка, упомянутая во фрагменте, не работает, это не объясняет основной вопрос, почему анимация не работает. Как вы можете видеть на картинке, я ссылаюсь на фрагмент svg как (..)#spinner. Это работает, но анимация мертва. - person oligofren; 15.02.2017
comment
В вопрос добавлена ​​информация о SMIL от Сары Суэйдан. - person oligofren; 15.02.2017
comment
Он работает в FireFox, но не в Chrome. Я больше не могу сказать, почему, извините. - person defghi1977; 15.02.2017
comment
Потому что у chrome всегда была совершенно неправильная xlink... Они не могут установить правильный baseURI или получить данные более чем на двух уровнях из внешних источников... Но этот ответ правильный. plnkr.co/edit/VhqTAnUIcBxDA06QsYc0?p=preview - person Kaiido; 15.02.2017
comment
@Kaiido не уверен, какое отношение xlink имеет к тому, что анимация перестала работать? он находит настоящий svg, но анимация не запускается. - person oligofren; 15.02.2017
comment
@oligofren Но у анимированных элементов есть как минимум внутренний атрибут xlink:href, указывающий на их цель. w3.org/TR/2001/REC-smil-animation -20010904/ - person Kaiido; 15.02.2017
comment
@Кайидо, хорошая мысль! даже если это не явно, это, конечно, неявно! Поскольку в спецификации говорится, что если xlink:href не существует в анимированном элементе, он автоматически нацелится на его родительский элемент, я предположил, что смогу обойти все эти проблемы. - person oligofren; 15.02.2017
comment
@defghi1977 defghi1977 Вы правы, на самом деле он отлично работает в Firefox, но не в Chrome. Я думаю, мне придется прибегнуть к встраиванию этого. - person oligofren; 15.02.2017
comment
@Kaiido, но поскольку это работает в Firefox, а реализация Chrome ошибочна, то реальный ответ, почему это работает, - это не этот ответ, а неисправность реализации Chrome? Просто пытаюсь быть откровенным. - person oligofren; 15.02.2017
comment
@oligofren, да, ответчик может отредактировать свой ответ, чтобы сообщить об этом. Примечание: углубившись в эту проблему, я обнаружил, что FF также не учитывает внешнюю анимацию, если целевой элемент был установлен через атрибут href. Кроме того, и хром, и FF с удовольствием анимируют путь, даже если он связан (<use><animate></use>). Но я думаю, это вам не поможет, так как вам придется использовать один <use> для каждой цели... - person Kaiido; 15.02.2017
comment
@kaiido FF 51 должен правильно соблюдать href. Если этого не происходит, вызовите ошибку в bugzilla, прикрепив тестовый пример к ошибка. - person Robert Longson; 15.02.2017