SVG-анимация в Blazor непоследовательна

Я пытаюсь включить 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 более надежна в обоих браузерах.

Animista - анимация на ходу!
Animista - анимация на ходу!
Если вы веб-дизайнер или разработчик, вы знаете, что добавление анимации на ваш сайт может помочь сделать его более привлекательным и динамичным....
Повысьте уровень своего сайта с помощью анимации CSS и JavaScript: Пошаговое руководство
Повысьте уровень своего сайта с помощью анимации CSS и JavaScript: Пошаговое руководство
Если вы хотите добавить визуальный интерес к своему сайту, то внедрение анимации с помощью CSS и JavaScript может стать отличным способом сделать это....
2
0
57
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Интересный.

Я могу подтвердить ваши результаты: я не ожидал взаимодействия с браузерами и режимами рендеринга.

Я могу «исправить» это для Edge и Chrome с помощью RenderModes Auto и Server:

<animateTransform id = "rect-rot-1"
                  attributeName = "transform"
                  begin = "0.01s"
                  ...                   

Я не уверен, почему это работает, но Blazor помещает элементы svg в свой виртуальный DOM, поэтому между запуском и полной загрузкой может возникнуть конфликт.

В FireFox вращение работает нормально, но вертикальная анимация никогда не отображается.

Я изменил названия идентификаторов, чтобы избежать знаков минус («-») в комментарии @Robert Longson. Ваше исправление теперь работает и для FireFox. Спасибо.

Barry Lay 07.07.2024 17:31

Да, я тоже не знала о названии. Теперь он работает стабильно во всех режимах рендеринга.

Henk Holterman 07.07.2024 18:36

С помощью 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, но ваш комментарий имеет смысл.

Barry Lay 07.07.2024 17:26

Не стесняйтесь сообщить о проблеме в систему отслеживания ошибок Chrome

Robert Longson 07.07.2024 18:09

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