Я хочу использовать svg-animate для анимации свойств CSS элемента svg-text. Я могу заставить анимацию работать нормально, однако начальная позиция CSS является стилем по умолчанию, а не стилем первого ключевого кадра.
Код ниже иллюстрирует проблему:
<svg id="foo" width="500">
<text x="0" y="100" style="fill: white;">
Some Text
</text>
</svg>
<svg>
<animate
xlink:href="#foo"
attributeType="CSS"
attributeName="font-size"
values="100px; 0px"
keyTimes="0; 1"
dur="1s"
begin="2s"
fill="freeze" />
</svg>
Ожидаемое и желаемое поведение состоит в том, чтобы элемент svg-text изначально отображался как 100 пикселей, подождал 2 секунды, затем сжался до 0 пикселей в течение 1 секунды. Вместо этого элемент svg-text изначально отображается как размер шрифта по умолчанию (~ 14 пикселей), ждет 2 секунды, переходит на 100 пикселей, а затем сжимается до 0 пикселей.
Если вы измените приведенный выше код, чтобы установить размер шрифта элемента svg-text ...
<text x="0" y="100" style="font-size: 100px; fill: white;">
Some Text
</text>
... у вас другая проблема. Теперь элемент svg-text изначально отображается на 100 пикселей, а затем не может быть анимирован. Стиль полностью заменяет анимацию. В этом примере кода используется размер шрифта, но вы столкнетесь с той же проблемой, пытаясь анимировать любой стиль CSS.
Кстати, мне конкретно нужно анимировать с помощью svg-animate, а не анимации перехода CSS, потому что я хочу объединить эту анимацию с анимацией svg-filter (не показанной в этом примере кода).
2 ответа
Вы не анимируете текстовый элемент, вы анимируете весь SVG и добавляете в текст каскад размера шрифта. Вот почему установка стиля для самого текстового элемента предотвращает появление анимации, потому что она переопределяет родительский стиль.
Один из способов решения этой проблемы - переместить идентификатор в текстовый элемент, чтобы анимация была нацелена непосредственно на текстовый элемент. Другой вариант - установить стиль для элемента <svg>
, чтобы его можно было переопределить с помощью анимации. Для них вам нужно установить правильный начальный стиль.
Еще один вариант - иметь 3 значения и установить начало в 0, чтобы анимация сначала запускалась, но ничего не делала, а затем через 2 секунды давала желаемый эффект. Для этого вам не нужен правильный начальный стиль, так как анимация будет отменять его с самого начала.
Роберт опередил меня, и у него есть лучший ответ, так же как я отвечал, так что вот пример того, как я бы это сделал (что соответствует первому методу Робертса) ...
<svg id="foo" width="500">
<text id="footext" x="0" y="100" font-size="100px" style="fill: red;">
Some Text
</text>
</svg>
<svg>
<animate
xlink:href="#footext"
attributeType="CSS"
attributeName="font-size"
values="100px; 0px"
keyTimes="0; 1"
dur="1s"
begin="2s"
fill="freeze" />
</svg>
Похожие вопросы
Новые вопросы
svg
Масштабируемая векторная графика (SVG) — это основанный на XML формат двумерной векторной графики, который также можно использовать в HTML. Не добавляйте этот тег только потому, что ваш проект использует SVG. Вместо этого добавьте тег, если ваш вопрос касается SVG или тесно связан с ним, например, как добиться чего-либо с помощью SVG.