代码之家  ›  专栏  ›  技术社区  ›  Desolator

在javascript中使用鼠标拖动事件的图像旋转器

  •  1
  • Desolator  · 技术社区  · 16 年前

    我一整天都在找这个剧本。 有人知道我可以用鼠标拖动事件来旋转图像的脚本吗?使用javascript。

    事先谢谢。

    4 回复  |  直到 12 年前
        2
  •  0
  •   alfred    15 年前

    我有一个实现的想法,因为我还需要写这篇文章,除非你已经有了一个解决方案,所以我想有它:)

    无论如何,请执行以下操作:

    /**编辑:删除了我的伪代码以支持前面的真实代码。**/

    总之…我会执行这个程序并通知你。 当然,除非在接下来的几个小时内有人会发送他的实现:—) /**编辑:感谢那些**/

    更新: 在这里,不管怎样(旋转一个图像到另一个图像:) 它工作得很好,如果你要导入这个,jsut做一点清理。 它是跨浏览器。

    HTML:

    <div id="centered" style=" /* margin-left:400px; computed in javacript*/ ">
        <img id="static" src="" style="position:absolute; z-index:-1">
        <img id="rotating" src="" >
    </div>
    

    包括:

    // jquery.min.js, jQueryRotate.js (discussed above)
    

    JavaScript:

    var alpha=0
    var dragOrig = null
    var mouseInPic = new Point(0,0)
    var diff
    var imageNo = 0
    
    function swapImage_or_something(i /* or get src from somewhere else*/) {
    
        $("#static").attr("src", arrCfgImages[i].src)
        $("#rotating").attr("src", arrCfgImages[i].src)
    
    
        $("#static").height(450);
        $("#rotating").height(450);
    
        $("#centered").css ({
            "margin-left": ($(document).width()-$("#static").width())/2 
        })
    
        $("#rotating").rotate(0)
    
    }
    
    
    function doEventBinding() {
    
        $(document).bind("mousedown", function (e) {
            dragOrig = new Point (mouseInPic.x, mouseInPic.y)
    
            e.preventDefault() 
            return 
    
    
        });
        $(document).bind("mouseup", function (e) {
            if (dragOrig) {
                dragOrig = null
                alpha+=diff
                diff=0
            }
        }); 
        $(document).bind("mousemove", function (e) {
            var x = -1*(Math.round($("#rotating").width()/2+0.01) - (e.pageX - $("#rotating").offset().left - (isIE ? 2 : 0)))
            var y = Math.round($("#rotating").height()/2+0.01) - (e.pageY - $("#rotating").offset().top - (isIE ? 2 : 0))
            mouseInPic = new Point(x,y) 
    
            if (dragOrig) {
                var cp = new Point(0,0)
                var deg1 = getAngleBetweenPoints(dragOrig, cp)
                var deg2 = getAngleBetweenPoints(mouseInPic, cp)
                diff = (deg1-deg2)
                diff = diff<0 ? diff+360 : diff>360 ? diff-360 : diff
                diff = diff>180 ? diff-360 : diff
                //my$("debug").innerHTML = diff
                $('#rotating').rotate(alpha+diff); 
                e.preventDefault() 
            }
        });
    
    }
    

    也:

    var toRAD = 1/180*Math.PI;
    var toDEG = 180/Math.PI;
        function getAngle(dx,dy) {
            var ang
            if (dx!=0) {
                var rad = Math.atan(dy/dx) + (dx<0?Math.PI:0)
                ang = rad*toDEG
                if (ang<0) ang+=360;
            } else {
                ang = dy>0 ? 90 : 270;
            }
            return ang;
        }
    
        function getAngleBetweenPoints (p1, p2) {
            var dx = p1.x-p2.x
            var dy = p1.y-p2.y
            return getAngle (dx, dy)
        }
    
        3
  •  0
  •   arpo    12 年前

    格林斯托克有一个疯狂的幻想旋转功能。看一看: https://www.greensock.com/draggable/ 向下滚动以旋转。 不幸的是,它不是完全免费的。

        4
  •  -1
  •   Desolator    15 年前

    你走吧。这是我的解决方案,它只适用于IE for FF版本,您可以在FF和其他浏览器中找到与VML对象等效的内容:

    <META HTTP-EQUIV="MSThemeCompatible" CONTENT="yes">
    
    <HEAD>
    <script>
    var dragok = false; 
    var gotElementSelected = false;
    var currentElement = null;
    
    function move()
    {
         if (dragok)
         {
            tempX = event.clientX + document.body.scrollLeft;
            tempY = event.clientY + document.body.scrollTop; 
    
            //rotating
            document.getElementById(currentElement).style.rotation=tempX+tempY;
    
            return false;
         }
    }
    
    function down(){
         dragok = true;
         if(gotElementSelected && currentElement !=null) 
            {
                 document.onmousemove = move;
                 return false;
            }
     }
    
    function up()
    {
        if(gotElementSelected && currentElement !=null)
            {    
                gotElementSelected = false;
                dragok = false;
                document.onmousemove = null; 
                currentElement = null;  
            }
    }
    </script>
    
    <STYLE>.rvml {
        BEHAVIOR: url(#default#VML)
    }
    </STYLE>
    </HEAD>
    
    <BODY bgcolor=DDDDDD>
    <?xml:namespace prefix = rvml ns = "urn:schemas-microsoft-com:vml" />
    <rvml:image style="POSITION: absolute; WIDTH: 100px; DISPLAY: none; HEIGHT: 100px; TOP: 100px; LEFT:100px; rotation: 0" id=myimage class=rvml 
    onmousedown="gotElementSelected=true; currentElement=this.attributes.getNamedItem('id').value; selectedElement=currentElement;" 
    onclick="select_element(this.attributes.getNamedItem('id').value); selectedElement=this.attributes.getNamedItem('id').value;" 
    src = "path/to/your/image" coordsize = "21600,21600"></rvml:image>