javascript - 旋转图像而不重置旋转

标签 javascript jquery css rotation transform

我有一个带有图像的页面。单击并按住鼠标按钮,同时拖动光标可绕其中心旋转图像。这是通过以下 JavaScript 代码完成的(基于 this answer to a similar question ):

$(function() {
    var target = $('#david-hasselhoff'),
        originX = target.offset().left + target.width() / 2,
        originY = target.offset().top + target.height() / 2,
        dragging = false;

    target.mousedown(function(e) {
        dragging = true;
    });

    $(document).mouseup(function() {
        dragging = false
    }).mousemove(function(e) {
        var mouseX, mouseY, radians, degrees;

        if (!dragging) {
            return;
        }

        mouseX = e.pageX;
        mouseY = e.pageY;
        radians = Math.atan2(mouseY - originY, mouseX - originX),
        degrees = radians * (180 / Math.PI);

        target.css('-webkit-transform', 'rotate(' + degrees + 'deg)');
        target.css('-ms-transform', 'rotate(' + degrees + 'deg)');
        target.css('transform', 'rotate(' + degrees + 'deg)');
    });
});

这有两个问题:

1) 如果我旋转图像,松开鼠标按钮,然后再次旋转图像,旋转就会重置。我希望能够稍微旋转它,然后单击并拖动以进一步旋转它。

2) 如果我单击图像的左侧并将其顺时针旋转几度,它会立即将旋转设置为 180 度(或更接近 -170 度)。我希望能够在拖动光标时旋转图像,无论图像从图像中心的哪一侧开始。

我希望这是有道理的。这是 fiddle :http://jsfiddle.net/C5QA9/

最佳答案

这里计算旋转的代码是获取图像的垂直中心与光标当前位置之间的 Angular 。为了让点击时图像能够顺利旋转,需要在旋转时减去这个 Angular 。此外,您需要跟踪上次拖动期间旋转离开的位置,并将该 Angular 添加到当前旋转中:

$(function() {
    var target = $('#david-hasselhoff'),
        originX = target.offset().left + target.width() / 2,
        originY = target.offset().top + target.height() / 2,
        dragging = false,
        startingDegrees = 0,
        lastDegrees = 0,
        currentDegrees = 0;

    target.mousedown(function(e) {
        dragging = true;
        mouseX = e.pageX;
        mouseY = e.pageY;
        radians = Math.atan2(mouseY - originY, mouseX - originX),
        startingDegrees = radians * (180 / Math.PI);
    });

    $(document).mouseup(function() {
        lastDegrees = currentDegrees;
        dragging = false;
    }).mousemove(function(e) {
        var mouseX, mouseY, radians, degrees;

        if (!dragging) {
            return;
        }

        mouseX = e.pageX;
        mouseY = e.pageY;
        radians = Math.atan2(mouseY - originY, mouseX - originX),
        degrees = radians * (180 / Math.PI) - startingDegrees + lastDegrees;

        currentDegrees = degrees;

        target.css('-webkit-transform', 'rotate(' + degrees + 'deg)');
        target.css('-ms-transform', 'rotate(' + degrees + 'deg)');
        target.css('transform', 'rotate(' + degrees + 'deg)');
    });
});

这是 fiddle :http://jsfiddle.net/C5QA9/1/

关于javascript - 旋转图像而不重置旋转,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25046630/

相关文章:

javascript - 如何在数学鹅毛笔中输入\sqrt[3]{64}=4

javascript - Jquery 脚本在页面刷新时不起作用

css - 960 css `grid_9 align_right` 没有右对齐

html - CSS 不影响输入按钮的位置/样式

javascript - 我不明白这个功能。 [Codecademy 联系人列表练习]

javascript - 谷歌地图 v2 : how to display various markers with the same coordinates

javascript - 使用chart.js同时创建多个饼图

Jquery表获取总计

javascript - 如何在bxslider中使用 "stopAuto"函数?

html - 使用 bootstrap 将 2 个按钮放在右下角