使用jQuery使多个对象在相同的轨道上旋转但具有不同的位置

时间:2014-02-12 00:12:27

标签: javascript jquery css rotation orbital-mechanics

您好我试图找到一个小脚本的解决方案,它可以围绕1个中心旋转对象,但对我来说这似乎有点太棘手了。 我找到了几乎完美的解决方案,并尝试修改它以满足我的需求,但这是一个问题。

我试图制作3个带文字的物体,以相同的速度,相同的轨道但不同的起始位置旋转,好像它们是等边三角形的顶点(顶点)。

到目前为止我的fiddle

    ( function ( $ ) {
        jQuery.fn.orbit = function(s, options){
            var settings = {
                            orbits:    1     // Number of times to go round the orbit e.g. 0.5 = half an orbit
                           ,period:    3000  // Number of milliseconds to complete one orbit.
                           ,maxfps:    25    // Maximum number of frames per second. Too small gives "flicker", too large uses lots of CPU power
                           ,clockwise: false  // Direction of rotation.
            };
            $.extend(settings, options);  // Merge the supplied options with the default settings.

            return(this.each(function(){
                var p        = $(this);

/* First obtain the respective positions */

                var p_top    = p.css('top' ),
                    p_left   = p.css('left'),
                    s_top    = s.css('top' ),
                    s_left   = s.css('left');

/* Then get the positions of the centres of the objects */

                var p_x      = parseInt(p_top ) + p.height()/2,
                    p_y      = parseInt(p_left) + p.width ()/2,
                    s_x      = parseInt(s_top ) + s.height()/2,
                    s_y      = parseInt(s_left) + s.width ()/2;

/* Find the Adjacent and Opposite sides of the right-angled triangle */
                var a        = s_x - p_x,
                    o        = s_y - p_y;

/* Calculate the hypotenuse (radius) and the angle separating the objects */

                var r        = Math.sqrt(a*a + o*o);
                var theta    = Math.acos(a / r);

/* Calculate the number of iterations to call setTimeout(), the delay and the "delta" angle to add/subtract */

                var niters   = Math.ceil(Math.min(4 * r, settings.period, 0.001 * settings.period * settings.maxfps));
                var delta    = 2*Math.PI / niters;
                var delay    = settings.period  / niters;
                if (! settings.clockwise) {delta = -delta;}
                niters      *= settings.orbits;

/* create the "timeout_loop function to do the work */

                var timeout_loop = function(s, r, theta, delta, iter, niters, delay, settings){
                    setTimeout(function(){

/* Calculate the new position for the orbiting element */

                        var w = theta + iter * delta;
                        var a = r * Math.cos(w);
                        var o = r * Math.sin(w);
                        var x = parseInt(s.css('left')) + (s.height()/2) - a;
                        var y = parseInt(s.css('top' )) + (s.width ()/2) - o;

/* Set the CSS properties "top" and "left" to move the object to its new position */

                        p.css({top:  (y - p.height()/2),
                               left: (x - p.width ()/2)});

/* Call the timeout_loop function if we have not yet done all the iterations */

                        if (iter < (niters - 1))  timeout_loop(s, r, theta, delta, iter+1, niters, delay, settings);
                    }, delay);
                };

/* Call the timeout_loop function */

                timeout_loop(s, r, theta, delta, 0, niters, delay, settings);
            }));
        }
    }) (jQuery);

       $('#object1'  ).orbit($('#center'  ), {orbits:  2, period:  8000});
$('#object2'  ).orbit($('#center'  ), {orbits:  4, period:  4000});
$('#object3'  ).orbit($('#center'  ), {orbits:  8, period:  2000});

HTML:

<h1> Example</h1>
<div id='rotation'>
    <div id='center'    >C</div>
    <div id='object1'  >Text1</div>
    <div id='object2'  >Text2</div>
    <div id='object3'  >Text3</div>
</div>

CSS:

#rotation {position: relative; width: 600px; height: 600px; background-color: #898989}
#center         {position: absolute; width:  20px; height:  20px;
           top: 300px; left: 300px; background-color: #ffffff;
           -moz-border-radius: 40px; border-radius: 40px;
           text-align: center; line-height: 15px;
}
#object1        {position: absolute; width:  36px; height:  36px;
           top: 300px; left: 200px; background-color: #ff8f23;
           -moz-border-radius: 18px; border-radius: 18px;
           text-align: center; line-height: 30px;
}

#object2        {position: absolute; width:  36px; height:  36px;
           top: 300px; left: 200px; background-color: #ff8f23;
           -moz-border-radius: 18px; border-radius: 18px;
           text-align: center; line-height: 30px;
}

#object3        {position: absolute; width:  36px; height:  36px;
           top: 300px; left: 200px; background-color: #ff8f23;
           -moz-border-radius: 18px; border-radius: 18px;
           text-align: center; line-height: 30px;
}

我为每个物体使用了不同的速度和转速,因为我无法弄清楚如何设置不同的起始位置而不会弄乱。如果我触摸CSS中任何对象的x,y坐标,那么轨道就会混乱。似乎对象位置计算是连通的。如果我改变坐标,那么计算也会改变。但我无法弄清楚如何解决这个问题。

2 个答案:

答案 0 :(得分:0)

如果更改每个元素的起始位置并调用每个元素的.orbit函数,则传递相同的参数,它应该有效。

检查出来:fiddle

这是你小提琴的略微修改版本。 (在调用.orbit函数时更改了起始位置和参数。

如果我错了或者我没有回答你的问题,请纠正我。

答案 1 :(得分:0)

让它按预期工作

Fiddle

Jquery代码:

var txt = $('#text .txt'), txtLen = txt.size();

var deg2rad = function(a) { return a*Math.PI/180.0; }

var angle = 0, speed=0.1, delay = 0, r = 100;

(function rotate() {
for (var i=0; i<txtLen; i++) {

    var a = angle - (i * 360 / txtLen);

    $(txt[i]).css({top: r+(Math.sin(deg2rad(a))*r), left: r+(Math.cos(deg2rad(a))*r)});
}

angle = (angle - speed) % 360;

setTimeout(rotate, delay);
})(); 

var rotation = function (){
$("#image").rotate({
   duration: 6000,
  angle:360, 
  animateTo:0, 
  callback: rotation,
  easing: function (x,t,b,c,d){        

      var d = 6000
      return c*(t/d)+b;

  }
});
}
rotation();





var txt2 = $('#text2 .txt2'), txt2Len = txt2.size();

var deg2rad = function(a) { return a*Math.PI/180.0; }

var angle = 13, speed=0.2, delay = 0, r = 100;

(function rotate() {
for (var i=0; i<txt2Len; i++) {

    var a = angle - (i * 360 / txt2Len);

    $(txt2[i]).css({top: r+(Math.sin(deg2rad(a))*r), left:
r+(Math.cos(deg2rad(a))*r)});
}
// increment our angle and use a modulo so we are always in the range [0..360] degrees
angle = (angle - speed) % 360;
// after a slight delay, call the exact same function again
setTimeout(rotate, delay);
})();  // invoke this boxed function to initiate the rotation

var rotation = function (){
$("#image").rotate({
   duration: 6000,
  angle:360, 
  animateTo:0, 
  callback: rotation,
  easing: function (x,t,b,c,d){        


      var d = 6000
      return c*(t/d)+b;

  }
});
}
rotation();