У меня есть следующий код, который я применяю при нажатии:
$("#search").click(function()
{
if (searchForth)
{
animateRotate(45,"#search");
searchForth = false;
}
else
{
animateRotate(-45,"#search");
searchForth = true;
}
});
И вызываемая функция:
function animateRotate(d,element)
{
var elem = $(element);
$({deg: 0}).animate({deg: d},{
duration: 600,
step: function(now)
{
elem.css({
transform: "rotate(" + now + "deg)"
});
}
});
}
Когда функция вызывается, элемент поворачивается на 45 градусов от позиции по умолчанию, что я и хочу. Однако, когда я снова нажимаю на элемент, функция применяет поворот на -45 градусов, но делает это из положения элемента по умолчанию, а не из положения, в котором элемент остался после предыдущего поворота. Почему это так и как это исправить, чтобы вторая анимация «отрывалась» от конечной позиции первой анимации?



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


var searchForth = false;
var angle=0;
$("#search").click(function()
{
if (searchForth)
{
angle += 45;
animateRotate(angle,"#search");
searchForth = false;
}
else
{
angle -= 45;
animateRotate(angle,"#search");
searchForth = true;
}
});
function animateRotate(d,element)
{
var elem = $(element);
$(elem).animate({deg: d},{
duration: 600,
step: function(now)
{
elem.css({
transform: "rotate(" + now + "deg)"
});
}
});
}<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id = "search">Search</button>Сначала вам нужно получить текущую повернутую позицию, а затем добавить / удалить от нее 45 градусов в соответствии со значением searchForth.
Посмотрите на это для получения дополнительной информации: Получить элемент -moz-transform: повернуть значение в jQuery
var searchForth=false;
$("#rotate").click(function()
{
if (searchForth)
{
animateRotate(45,this);
searchForth = false;
}
else
{
animateRotate(-45,this);
searchForth = true;
}
});
function animateRotate(d,element)
{
var startDeg = getRotationDegrees($(element));
var elem = $(element);
$(elem).animate({deg: (startDeg + d)},{
duration: 600,
step: function(now)
{
elem.css({
transform: "rotate(" + now + "deg)"
});
}
});
}
function getRotationDegrees(obj) {
var matrix = obj.css("-webkit-transform") ||
obj.css("-moz-transform") ||
obj.css("-ms-transform") ||
obj.css("-o-transform") ||
obj.css("transform");
if (matrix !== 'none') {
var values = matrix.split('(')[1].split(')')[0].split(',');
var a = values[0];
var b = values[1];
var angle = Math.round(Math.atan2(b, a) * (180/Math.PI));
} else { var angle = 0; }
return (angle < 0) ? angle + 360 : angle;
}<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id = "rotate">Rotate me!</div>Как насчет использования перехода и преобразования CSS3?
$(function() {
var deg = 45;
var srh = $('#search').on('click', function(e) {
srh.css('transform', 'rotate(' + (deg) + 'deg)');
deg = -(deg);
});
});#search {
transition: transform 1s ease;
}<script src = "https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button id = "search">Search</button>
$({deg: 0})так чего вы ожидаете?