Я пытаюсь включить SVG-анимацию на страницу Blazor, и кажется, что каждый раз, когда я ее запускаю, она делает разные вещи.
Я хотел бы знать, есть ли что-то, чего мне не хватает, чтобы эта работа работала надежно.
Спасибо.
Вот моя тестовая страница:
@page "/animation"
@rendermode InteractiveServer
<h3>Animation</h3>
<svg width = "1000" height = "1000" xmlns = "http://www.w3.org/2000/svg">
<rect width = "30" height = "50" x = "10" y = "10" fill = "blue">
<animateTransform id = "rect-rot-1"
attributeName = "transform"
begin = "0s"
dur = "5s"
type = "rotate"
from = "0 25 35"
to = "90 25 35" fill = "freeze" />
<animateTransform id = "rect-tran-1"
attributeName = "transform"
begin = "rect-rot-1.end + 1s"
dur = "5s"
type = "translate"
additive = "sum"
from = "0 0"
to = "200 0" />
</rect>
</svg>
<p />
@code {
}
Я пробовал протестировать его как с MS Edge, так и с Firefox, и оба они дали разные результаты:
Я обнаружил, что, по крайней мере при вращении, анимация на основе CSS более надежна в обоих браузерах.
Интересный.
Я могу подтвердить ваши результаты: я не ожидал взаимодействия с браузерами и режимами рендеринга.
Я могу «исправить» это для Edge и Chrome с помощью RenderModes Auto и Server:
<animateTransform id = "rect-rot-1"
attributeName = "transform"
begin = "0.01s"
...
Я не уверен, почему это работает, но Blazor помещает элементы svg в свой виртуальный DOM, поэтому между запуском и полной загрузкой может возникнуть конфликт.
В FireFox вращение работает нормально, но вертикальная анимация никогда не отображается.
Да, я тоже не знала о названии. Теперь он работает стабильно во всех режимах рендеринга.
С помощью SMIL вы должны избегать знаков минус, если используете их в значениях идентификаторов. Таким образом, правильный синтаксис атрибута начала:
<svg width = "1000" height = "1000" xmlns = "http://www.w3.org/2000/svg">
<rect width = "30" height = "50" x = "10" y = "10" fill = "blue">
<animateTransform id = "rect-rot-1"
attributeName = "transform"
begin = "0s"
dur = "5s"
type = "rotate"
from = "0 25 35"
to = "90 25 35" fill = "freeze" />
<animateTransform id = "rect-tran-1"
attributeName = "transform"
begin = "rect\-rot\-1.end + 1s"
dur = "5s"
type = "translate"
additive = "sum"
from = "0 0"
to = "200 0" />
</rect>
</svg>
В качестве альтернативы просто не используйте знаки - в атрибутах id.
Причина в том, что знак - должен обозначать смещение времени например. foo - 1s, поэтому вам нужно сообщить парсеру, что вы этого не делаете.
...Чтобы проанализировать отдельный элемент в списке значений, следующий подход определяет правильную интерпретацию. Кроме того, значения идентификаторов и символы событий являются значениями XML NMTOKEN и поэтому могут содержать точку «.». и символы дефис-минус '-'. Символ обратной косой черты '' должен использоваться для экранирования этих символов в значениях идентификаторов и символах событий, в противном случае эти символы будут интерпретироваться как разделитель точки и знак дефиса-минус соответственно...
Использование знаков минус по какой-то причине работало (иногда) в Edge, но ваш комментарий имеет смысл.
Не стесняйтесь сообщить о проблеме в систему отслеживания ошибок Chrome
Я изменил названия идентификаторов, чтобы избежать знаков минус («-») в комментарии @Robert Longson. Ваше исправление теперь работает и для FireFox. Спасибо.