Firefox/Gecko не может анимировать transform="rotate(...)" в SVG?
На странице, над которой я работаю, когда пользователь нажимает на объект, одна группа SVG вращается, а другая вращается.
Код, как он есть, прекрасно работает в WebKit, но совсем не работает в Gecko. Вот блок кода, который не выполняется Gecko:
var totStep = dur*2/msrate, step=0;
window.timer = window.setInterval(function(){
if(step<totStep/2){
var inangle = -50*easeIn(step,totStep/2);
iris.setAttribute("transform","rotate("+inangle+" 23 -82)");}else{
var prog = easeOut2((step-(totStep/2)),totStep/2);
var outangle = 50*prog;
var down = 400*prog;
vinyl.setAttribute("transform","rotate("+(-50+outangle)+" 986 882)");
needle1.setAttribute("transform","translate(0 "+(-400+down)+")");
buttons.setAttribute("transform","translate(0 "+(-400+down)+")");}
step++;
if (step > totStep) {window.clearInterval(window.timer); return}
});
Большая часть этого кода взята из функции, которая открывает глаза при загрузке страницы, и эта функция прекрасно работает в Gecko, поэтому для меня это загадочно.
Вы можете увидеть страницу со всем ее исходным кодом на этой странице. Проблемная функция написана в связанном eye.js. Проблема возникает, когда пользователь нажимает "DJ Docroot" в разделе "Музыка" меню, доступ к которому можно получить, щелкнув в любом месте.
1 ответ
Вам не хватает второго аргумента для setInterval, чтобы указать интервал, через который должна вызываться функция. Так, например, работает следующий код:
window.timer = window.setInterval(function(){
if(step<totStep/2){
var inangle = -50*easeIn(step,totStep/2);
iris.setAttribute("transform","rotate("+inangle+" 23 -82)");}else{
var prog = easeOut2((step-(totStep/2)),totStep/2);
var outangle = 50*prog;
var down = 400*prog;
vinyl.setAttribute("transform","rotate("+(-50+outangle)+" 986 882)");
needle1.setAttribute("transform","translate(0 "+(-400+down)+")");
buttons.setAttribute("transform","translate(0 "+(-400+down)+")");}
step++;
if (step > totStep) {window.clearInterval(window.timer); return}
},10);
Webkit, вероятно, просто принимает значение по умолчанию.
Кроме того, просто предложение, в будущем, возможно, будет легче обнаружить подобные ошибки, если вы примете кодовые соглашения, которые сделают ваш код более разборчивым: http://javascript.crockford.com/code.html
Инструмент как jslint поможет с этим.