微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

jquery – 设置css旋转以将元素指向一个点

我试图使用css 3变换旋转功能将div旋转到一个点.

我达到了这一点:jsfiddle link

$(document).ready(function(){
    var scw,sch,scx,scy;
    calcCenter();
    $(window).resize(function() {         
        calcCenter();
    });
    function calcCenter(){
      sch = $(window).height(); 
      scw = $(window).width(); 
      scx = scw/2;
      scy = sch/2;
        $(".circle").remove();
      var circle = $("<span></span>").addClass('circle').text('.');
      circle.css('top',scy-50+"px");
      circle.css('left',scx-50+"px");
    $(document.body).append(circle);
    }
    function calcAngle(p1,p2){

        var angle = Math.atan2(p2.y - p1.y,p2.x - p1.x) * 180 / Math.PI;
        return angle;
    }



    $(document).click(function(e){  
        var Box = $("<span></span>").addClass('Box');
        var x = e.pageX,y=e.pageY; 
        Box.css('top',y+"px");
        Box.css('left',x+"px"); 

        $(document.body).append(Box);
        var angle = calcAngle({x:x,y:y},{x:scx,y:scy});

        Box.css('-webkit-transform','rotate('+(90+angle)*-1+'deg)');        

        Box.draggable({
                drag: function(e) {
                        var Box = $(this);
                        var x = e.pageX,y=e.pageY; 
                        Box.css('top',y+"px");
                        Box.css('left',x+"px");
                        var angle = calcAngle({x:x,y:scy});

                        Box.css('-webkit-transform','rotate('+(90+angle)*-1+'deg)');


                        }
                      });
    });

    var sunAngle = 1;
    setInterval(function(){
        var sun = $("span.circle")[0];
        $(sun).css('-webkit-transform','rotate('+sunAngle+'deg)');
        sunAngle = (sunAngle+1) %360;           
    },100);
});

我google了“lookat”函数,发现了类似于lookat矩阵的东西.

解决方法

首先,圆圈的中心未正确计算.你的圆圈是120px宽和高,但你通过将它的顶部和左边设置为scy – 50来“居中”它,你应该使用scy – 60(120px的一半是60px).或者甚至更好,也可以动态地计算半圆的宽度和高度,并减去它,以防你改变主意并再次使它变成不同的大小.

我只是静静地做了:

circle.css('top',scy-60+"px");
circle.css('left',scx-60+"px");

其次,您想要计算.Box元素围绕其中心旋转所需的角度,但您可以使用其顶部和左侧位置来执行此操作.那是不对的.

再一次,动态会更好,但现在让我们做静态:

var angle = calcAngle({x:x + 32,y:y + 32},y:scy});

然后我不确定你在用atan2()* 180 / Math.PI做什么,因为atan2返回rads你想要度我仔细检查如何在两者之间进行计算.事实证明它并不像你想象的那么简单. See this answer.

所以我添加一个功能

function radToDegree(rad) {
    return (rad > 0 ? rad : (2*Math.PI + rad)) * 360 / (2*Math.PI)
}

并在返回角度之前实现它:

function calcAngle(p1,p2){      
    var angle = Math.atan2(p2.y - p1.y,p2.x - p1.x);
    return radToDegree(angle);
}

现在,度数从顶部开始,意味着如果角度为0度,它将指向上方,而由于计算的设置方式,您需要它指向右侧.因此,您在最终的旋转计算中添加了90.

如果你的观点开始向上,那就好了,但事实并非如此.它从左下角开始,这是另一个135度.添加它们,你会得到225度的差异.所以:

Box.css('-webkit-transform','rotate('+(angle+225)+'deg)');

瞧,你的剧本有效:http://jsfiddle.net/7ae3kxam/42/

编辑:现在也适用于拖动

原文地址:https://www.jb51.cc/jquery/178134.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐