Я хочу использовать 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 (не показанной в этом примере кода).

0
mattthew 30 Ноя 2014 в 13:48

2 ответа

Лучший ответ

Вы не анимируете текстовый элемент, вы анимируете весь SVG и добавляете в текст каскад размера шрифта. Вот почему установка стиля для самого текстового элемента предотвращает появление анимации, потому что она переопределяет родительский стиль.

Один из способов решения этой проблемы - переместить идентификатор в текстовый элемент, чтобы анимация была нацелена непосредственно на текстовый элемент. Другой вариант - установить стиль для элемента <svg>, чтобы его можно было переопределить с помощью анимации. Для них вам нужно установить правильный начальный стиль.

Еще один вариант - иметь 3 значения и установить начало в 0, чтобы анимация сначала запускалась, но ничего не делала, а затем через 2 секунды давала желаемый эффект. Для этого вам не нужен правильный начальный стиль, так как анимация будет отменять его с самого начала.

0
Robert Longson 30 Ноя 2014 в 14:20
Спасибо. Это было намного проще, чем я ожидал.
 – 
mattthew
1 Дек 2014 в 00:19

Роберт опередил меня, и у него есть лучший ответ, так же как я отвечал, так что вот пример того, как я бы это сделал (что соответствует первому методу Робертса) ...

<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>

jsfiddle

0
Ian 30 Ноя 2014 в 14:30