raj*_*esh 8 css jquery css3 css-transforms
我试图使用css 3变换旋转功能将div旋转到一个点.
我达到了这一点:jsfiddle链接
$(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:y},{x:scx,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);
});
Run Code Online (Sandbox Code Playgroud)
我google了"lookat"函数,发现了类似于lookat矩阵的东西.
首先,您的圆心没有被正确计算。您的圆的宽度和高度为 120 像素,但您可以通过将其顶部和左侧设置为scy - 50您应该使用的位置来“居中” scy - 60(120 像素的一半是 60 像素)。或者更好的是,还可以动态计算半圆的宽度和高度并减去它,以防您改变主意并再次将其设为不同的大小。
我只是静态地做到了:
circle.css('top',scy-60+"px");
circle.css('left',scx-60+"px");
Run Code Online (Sandbox Code Playgroud)
其次,您想要计算.box元素需要围绕其中心旋转的角度,但您使用其顶部和左侧位置来执行此操作。那是不正确的。
同样,动态会更好,但现在让我们做静态:
var angle = calcAngle({x:x + 32,y:y + 32},{x:scx,y:scy});
Run Code Online (Sandbox Code Playgroud)
然后我不确定你在做什么atan2() * 180 / Math.PI,因为atan2返回 rads 并且你想要度数我仔细检查了如何在两者之间计算。事实证明,事情并没有你想象的那么简单。看到这个答案。
所以我添加了一个函数:
function radToDegree(rad) {
return (rad > 0 ? rad : (2*Math.PI + rad)) * 360 / (2*Math.PI)
}
Run Code Online (Sandbox Code Playgroud)
并在返回角度之前实现它:
function calcAngle(p1,p2){
var angle = Math.atan2(p2.y - p1.y, p2.x - p1.x);
return radToDegree(angle);
}
Run Code Online (Sandbox Code Playgroud)
现在,度数从顶部开始,这意味着如果角度为 0 度,它将指向上方,而由于计算的设置方式,您需要它指向右侧。所以你添加+ 90到你的最终轮换计算中。
如果你的观点是向上的,那会很好,但事实并非如此。它从左下角开始,这是另一个 135 度。把这些加起来,你就会得到 225 度的差异。所以:
box.css('-webkit-transform','rotate('+(angle+225)+'deg)');
Run Code Online (Sandbox Code Playgroud)
瞧,你的脚本有效:http : //jsfiddle.net/7ae3kxam/42/
编辑:现在也适用于拖动