【问题标题】:GSAP timeline animationGSAP 时间线动画
【发布时间】:2017-03-03 21:41:02
【问题描述】:

我正在尝试使用 gsap 制作时钟动画。问题是我的实际脚本并不精确。我需要的是:

  • 按下按钮
  • 开始动画(整小时旋转)
  • 然后再次按下按钮停止等待 2 秒并继续这样做
  • 只需开始 -> 旋转 -> 停止(2 秒延迟) -> 重复

我的实际解决方案无法正常工作,因为一段时间后它不会在 12 小时内停止分针(可能是因为 setInterval 或 setTimeout 不那么准确,所以它会自行去同步。

我如何通过适当的解决方案来解决这个问题。也许时间线内的时间线不知何故?

Link to CodePen

实际脚本:

var gsapClock = (function ($) {
var s;
return {
settings:      {
  $minuteHand: $('#minute-hand'),
  $hourHand:   $('#hour-hand'),
  $buttonTop:   $('#button-top')
},
init:function () {
  s = this.settings;
  this.bindUIActions();
},
bindUIActions: function () {

  var tl = new TimelineMax();
  function buttonPress(){
    TweenMax.to(s.$buttonTop, .1, {
      y: 4
    });
    TweenMax.to(s.$buttonTop, .1, {
      y: 0,
      delay: .1
    })
  }


  tl.add(
    TweenMax.to(s.$minuteHand, 2, {rotation: "360", repeat: -1, ease: Power0.easeNone, transformOrigin: '50% 100%'}),
    TweenMax.to(s.$hourHand, 48, {rotation: "360", repeat: -1, ease: Power0.easeNone, transformOrigin: '0% 50%'})
  );
  tl.pause();

  function animationControll() {
    buttonPress();
    tl.resume();
    setTimeout(function() {
      buttonPress();
      tl.pause();
    }, 2000);
  }

  animationControll();
  setInterval(function() {
    animationControll();
  }, 3500);
}
}
})(jQuery);

gsapClock.init();

【问题讨论】:

    标签: javascript jquery animation timeline gsap


    【解决方案1】:

    我可能会这样做(有很多方法):

    var gsapClock = (function ($) {
      var s;
      return {
        settings:      {
          $minuteHand: $('#minute-hand'),
          $hourHand:   $('#hour-hand'),
          $buttonTop:   $('#button-top')
        },
        init:function () {
          s = this.settings;
          this.bindUIActions();
        },
        bindUIActions: function () {
    
          var tl = new TimelineMax();
    
          //make it easier to play with the timing:
          var durations = {press:0.1, minute:2, hour:48, pause:2};
    
          //since we want to stop the hour hand motion each time the minute hand goes around, it's easiest to just put it in its own tween so we can pause()/resume(). This could easily be a timeline if you prefer. 
          var hour = TweenMax.to(s.$hourHand, durations.hour, {rotation: 360, repeat: -1, ease: Power0.easeNone, transformOrigin: '0% 50%'});
    
          //put the button press into its own repeating timeline
          var buttonPress = new TimelineMax({repeat:-1, repeatDelay:durations.minute - (durations.press * 2)});
          //when the button is fully depressed, pause the "hour" tween. We do a repeat:1, yoyo:true as a simple way to make the button return to its original position rather than using two tweens (down, then up)
          buttonPress.to(s.$buttonTop, durations.press, {y:4, repeat:1, yoyo:true, onRepeat:function() {hour.pause();}});
    
          //the 2nd time the button is depressed, resume() the hour timeline. 
          buttonPress.to(s.$buttonTop, durations.press, {y:4, repeat:1, yoyo:true, onRepeat:function() {hour.resume();}}, durations.pause);
    
          //main timeline - do the repeating minute hand animation that's repeated. Notice the repeatDelay is used for the appearance of pausing. 
          tl.to(s.$minuteHand, durations.minute, {rotation: "360", repeat: -1, repeatDelay:durations.pause, ease: Power0.easeNone, transformOrigin: '50% 100%'});
    
          //nest the buttonPress timeline at exactly the right spot.
          tl.add(buttonPress, durations.minute - durations.press);
        }
      }
    })(jQuery);
    
    gsapClock.init();
    

    代码笔: http://codepen.io/GreenSock/pen/GWqddB?editors=0010

    这就是你想要的效果吗?

    【讨论】:

    • 这是完美的解决方案,我想出了不同的codepen link,但你的还是要好得多谢谢!
    猜你喜欢
    • 2021-09-04
    • 1970-01-01
    • 2022-10-05
    • 1970-01-01
    • 2022-07-13
    • 1970-01-01
    • 2022-06-13
    • 1970-01-01
    • 2017-07-06
    相关资源
    最近更新 更多