Как анимировать форму пути без использования SMIL?

Фрагмент ниже показывает, что я хочу сделать. Но есть некоторые проблемы:

  1. Как сделать эту анимацию без использования SMIL?
    SMIL устарел и плохо поддерживается браузерами.
  2. Как сделать так, чтобы черный путь проходил через правый конец синего?
    Красный, синий и зеленый пути имеют одинаковую длину.
  3. Анимация должна повторяться вниз-вверх-вниз-вверх и так далее.

Первый вопрос является основным. У меня есть некоторые идеи по поводу остальных, но я не могу применить их, пока не будет решен первый вопрос. Я написал другие вопросы, чтобы уточнить, что я делаю.

http://jsfiddle.net/2yLxpjaw/2/

svg {
    outline: 1px solid silver;
}

path {
    opacity: .25;
    fill: none;
    stroke-width: 16;
    stroke-linecap: round;
}

#test {
    opacity: .5;
}
<svg width="200" height="200">
    <path stroke="red" d="m 22 100 q 68 0 136 -68" />
    <path stroke="blue" d="m 22 100 q 68 0 156 0" />
    <path stroke="green" d="m 22 100 q 68 0 136 68" />
    <path id="test" stroke="black" d="m 22 100 q 68 0 136 -68" />
    <animate xlink:href="#test"
             attributeName="d"
             from="m 22 100 q 68 0 136 -68"
             to="m 22 100 q 68 0 136 68"
             dur="3s"
             repeatCount="indefinite" />
</svg>

PS: Тот же вопрос на русском.


person Qwertiy    schedule 29.10.2015    source источник
comment
Javascript требуется, я думаю   -  person Paulie_D    schedule 29.10.2015
comment
Кстати, есть ли другой вариант языка stackoverflow? (кроме РУ)   -  person max    schedule 29.10.2015
comment
Почему этот вопрос слишком широк? Я предоставил решение, в котором используется устаревшая технология (smil), и спросил, как реализовать ее рекомендуемым способом (css).   -  person Qwertiy    schedule 29.10.2015
comment
@makshh, что ты имеешь в виду?   -  person Qwertiy    schedule 29.10.2015
comment
Вы дали ссылку на свой вопрос на русском языке. Есть ли в stackoverflow другие языки, кроме русского?   -  person max    schedule 29.10.2015
comment
@makshh, насколько я знаю, есть много других языков, но только для программирования близких предметов. Но аудитория здесь намного шире.   -  person Qwertiy    schedule 29.10.2015
comment
@makshh, Stack Overflow на португальском языке был единственным из них, кто вышел из бета-версии. Русский очень близок к этому. Также вы можете увидеть некоторую информацию на Area51.   -  person Qwertiy    schedule 29.10.2015
comment
Спасибо, мне просто было интересно. Ха-ха, на самом деле две минуты назад я добавил pt. перед stackoverflow.com, чтобы проверить, есть ли португальская версия (повезло). :)   -  person max    schedule 29.10.2015
comment
Вы смотрите на snapsvg.io?   -  person dlane    schedule 29.10.2015
comment
SMIL имеет отличную поддержку браузеров. Через leunen.me/fakesmile он работает практически со всем, что поддерживает SVG и javascript, независимо от того, объявлен ли Chrome устаревшим. или не. На самом деле в Chrome есть другой неродной подключаемый модуль SMIL: github.com/ericwilligers/svg-animation. доступны, так что есть много причин, чтобы придерживаться SMIL   -  person Robert Longson    schedule 30.10.2015


Ответы (3)


Насколько я знаю, это невозможно сделать только с помощью svg. И ни с CSS.

Вы можете либо использовать библиотеку SVG-анимации, например snap.svg, либо написать собственную небольшую JS-анимацию (например, с помощью RequestAnimationFrame) .

person Karsten Buckstegge    schedule 29.10.2015
comment
Но smil устарел, и использование CSS-анимации и ключевых кадров считается его заменой. Реально ли отказаться от поддержки смайлов в браузерах, когда нет замены указанной функции? Мне это кажется нелогичным. - person Qwertiy; 29.10.2015
comment
CSS-анимация является частичной заменой SMIL на данный момент... Javascript временно заменяет все остальное. - person Paulie_D; 29.10.2015
comment
SMIL никогда не был реализован во многих браузерах. К сожалению, время от времени производители браузеров отказываются от, казалось бы, полезных технологий, и в основном на то есть свои причины. Например. технология, убивающая производительность браузера при использовании или что-то в этом роде. - person Karsten Buckstegge; 29.10.2015
comment
А еще - из Chrome собираются убрать поддержку смайлов. Зачем им это, если он работает и полноценной замены ему нет? - person Qwertiy; 29.10.2015
comment
@Qwertiy Есть замена, которая называется веб-анимацией. В настоящее время он реализуется в Firefox и Chrome, но ни его спецификация, ни реализация еще не завершены. - person Robert Longson; 20.11.2015
comment
@RobertLongson, не могли бы вы показать пример (в качестве ответа) или дать ссылку для получения дополнительной информации? - person Qwertiy; 20.11.2015
comment
@RobertLongson, как его можно использовать? - person Qwertiy; 20.11.2015

Я тоже думаю, что для этого потребуется js, но для этого примера это не так сложно и может быть включено прямо в ваш документ svg:

svg {
    outline: 1px solid silver;
}

path {
    opacity: .25;
    fill: none;
    stroke-width: 16;
    stroke-linecap: round;
}

#test {
    opacity: .5;
}
<svg width="200" height="200">
    <path stroke="red" d="m 22 100 q 68 0 136 -68" />
    <path stroke="blue" d="m 22 100 q 68 0 156 0" />
    <path stroke="green" d="m 22 100 q 68 0 136 68" />
    <path id="test" stroke="black" d="m 22 100 q 68 0 136 -68" />
   <script type="application/javascript">
    // get your element
    var tst = document.querySelector('#test');
    // get the required segment (here the quadratic curve)
    var seg = tst.pathSegList[tst.pathSegList.length-1];
    // your required properties
    var start = -68,
        end = 68,
        dur = 3000;
     
    // the distance of our journey
    var dist = end-start;
    var speed = dist/dur;
    var startTime = performance.now();
    // set your animation function
    (function move(time){
      // request the next frame as soon as possible
      requestAnimationFrame(move);
      // get the position at our current time
      var pos = (time-startTime)*speed+start;
      // we finished th first animation
      if(pos > end){
        // reset and repeat
        pos = start; 
        startTime= time;
        }
      // update our point position
      seg.y = pos;
      })();
    </script>
</svg>

Ps: запятая в атрибуте d допускается только между двумя числами (для разделения векторных значений), ваш фрагмент не будет работать в FF.

person Kaiido    schedule 30.10.2015

Чтобы анимировать SVG, вам просто нужно использовать полифилл SMIL.

Полифил — это специальный фрагмент кода javascript, который обеспечивает поддержку функций, отсутствующих в браузере, переводя исходную кодировку в ту, которую браузер может понять.

Полифил SMIL, созданный Эриком Виллигерсом, делает именно это: он переводит SMIL в API веб-анимации, который поддерживает даже браузер Microsoft. Он настолько эффективен, что разработчики Google Chrome решили отказаться от встроенной поддержки SMIL и сосредоточиться на веб-анимации, предоставив полифиллу Эрику Виллигерсу задачу воспроизведения файлов SMIL в Chrome.

Кто-то ошибочно истолковал это как отказ от поддержки SMIL в Chrome и раскритиковал разработчиков за этот выбор. Но это не было настоящим устареванием, а просто перемещением работы по интерпретации SMIL на уровне полифилла.

На самом деле сами разработчики Chrome процитировали полифилл Willigers в самом официальном объявлении о своем намерении отказаться от SMIL.

Так что, если вы прочитали в Интернете о кончине SMIL, не волнуйтесь. «Смерть» СМИЛ была сильно преувеличена. Это больше похоже на перерождение.

Чтобы использовать SMIL во всех браузерах, включая IE и EDGE, вам просто нужно добавить этот полифилл javascript на свою веб-страницу:

https://github.com/ericwilligers/svg-animation

Вот демонстрационная страница с использованием полифилла, созданного Томом Бирном, автором популярного экспортера flash2svg:

страница без полифилла:
http://www.tbyrne.org/staging/smil-polyfill/tears.htm

и та же страница с полифиллом:
http://www.tbyrne.org/staging/smil-polyfill/tears_polyfill.htm

Если вы посмотрите на источник, это в значительной степени самоочевидно.

Кроме того, производительность полифилла часто выше, чем у оригинального SMIL, потому что во многих браузерах веб-анимация ускоряется аппаратно, а SMIL обычно нет.

person Emanuele Sabetta    schedule 16.03.2016