2015-02-27 2 views
1

У меня есть простой SVG, в котором есть элемент, вращающийся вокруг кругового пути. Когда пользователь зависает, вращение становится быстрее, изменяя атрибут dur. Проблема заключается в том, что элемент переходит в другую позицию, когда это происходит. Как это можно решить?Изменение скорости анимации SVG динамически без перекоса положения

$('g').hover(
 
    function() { 
 
    $(this).find('animateMotion').attr('dur', '3s'); 
 
    }, 
 
    function() { 
 
    $(this).find('animateMotion').attr('dur', '7s'); 
 
    } 
 
);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<svg width='500' height='500'> 
 
    <g> 
 
    <path id='circle' d='M 250, 250 m -200, 0 a 200,200 0 1,0 400,0 a 200,200 0 1,0 -400,0' fill='none' stroke='red' stroke-width='10' /> 
 
    <circle cx="50" cy="50" r="40" fill="red" transform='translate(-50, -50)'> 
 
     <animateMotion dur="7s" repeatCount="indefinite"> 
 
     <mpath xlink:href="#circle" /> 
 
     </animateMotion> 
 
    </circle> 
 
    </g> 
 
</svg>

ответ

2

Настройка анимации временной шкалы так, чтобы анимация в той же точке.

var firstTime = true; 
 
$('g').hover(
 
    function() { 
 
    $(this).find('animateMotion').attr('dur', '3s'); 
 
    if (firstTime) { 
 
     firstTime = false; 
 
     return; 
 
    } 
 
    document.getElementById("root").setCurrentTime(
 
     document.getElementById("root").getCurrentTime() * 3/7); 
 
    }, 
 
    function() { 
 
    $(this).find('animateMotion').attr('dur', '7s'); 
 
    document.getElementById("root").setCurrentTime(
 
     document.getElementById("root").getCurrentTime() * 7/3);  } 
 
);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<svg id="root" width='500' height='500'> 
 
    <g> 
 
    <path id='circle' d='M 250, 250 m -200, 0 a 200,200 0 1,0 400,0 a 200,200 0 1,0 -400,0' fill='none' stroke='red' stroke-width='10' /> 
 
    <circle cx="50" cy="50" r="40" fill="red" transform='translate(-50, -50)'> 
 
     <animateMotion dur="3s" repeatCount="indefinite"> 
 
     <mpath xlink:href="#circle" /> 
 
     </animateMotion> 
 
    </circle> 
 
    </g> 
 
</svg>

+0

Это работает намного лучше, но я все еще получаю прыжку в первый раз, когда я парить. После этого он работает отлично, но до того, как еще есть прыжок. – lurkit

+0

Потому что анимация начинается быстро. Это не замедляется, пока вы не замерли один раз и перестали парить. Это кажется странным для меня, но это ваша функциональность, я полагаю. –

+0

Прошу прощения, я ошибся в начальном посте, и анимация должна начинаться медленно. Вы знаете, как заставить его работать с анимацией с медленным начальным значением? – lurkit

Смежные вопросы