【问题标题】:How to avoid anti-clockwise rotation animation when reseting rotation from 360deg to 0 deg?将旋转从 360 度重置为 0 度时如何避免逆时针旋转动画?
【发布时间】:2017-05-28 09:46:18
【问题描述】:

我正在创建一个看起来像花哨的轮子的动画,当将旋转从 360 度重置为 0 度时,它以逆时针方向为轮子设置动画,如何避免这种情况???

HTML

<ul class="cm">
  <li><span>01</span></li>
  <li><span>02</span></li>
  <li><span>03</span></li>
  <li><span>04</span></li>
  <li><span>05</span></li>
  <li><span>06</span></li>
  <li><span>07</span></li>
  <li><span>08</span></li>
</ul>

SCSS

$Brdr: #7d868c;
  *{
    -webkit-box-sizing: border-box;
    -moz-box-sizing: border-box;
    box-sizing: border-box;
    &:before,&:after{
      -webkit-box-sizing: border-box;
      -moz-box-sizing: border-box;
      box-sizing: border-box;
    }
  }
  %notaList{
    margin: 0;
    padding: 0;
    list-style: none;
  }

  $node: 8;
  $s: 80px;
  $rotation: 0;

  .cm{
    top: 50%;
    left: 0;
    right: 0;
    width: $s;
    height: $s;
    margin: auto;
    display: block;
    position: absolute;
    transition: transform 0.8s ease-out;
    transform:rotate(#{$rotation}deg);
    @extend %notaList;
    background: rgba(#000, 0.5);
    border-radius: 50%;
    li{
      left: 0;
      top:-($s*2 - ($s/2));
      color:#333;
      width:90%;
      height: 90%;
      display: block;
      position: absolute;
      margin-bottom: ($s*2 - ($s/2));

      & > span{
        display: block;
        padding: 36%;
        text-align: center;
        overflow: hidden;
        background: #CCC;
        border-radius: 5px 5px 50% 50%;
        transition: transform 0.8s ease-out;
      }
      @for $i from 1 through $node{
        &:nth-child(#{$i}n) {
          transform-origin: 50% ($s*2);
          transform: rotate(($i - 1) * 360deg/$node);
          & > span {
            transform:rotate(($rotation * -1) - (($i - 1) * 360deg/$node));
          }
        }
      }
    }
  }

JQuery

var i = 1,
    nodes = 8;

setInterval(function(){
  var rotation = i * 360 / nodes;
  i = i + 1;

  $('.cm').css({
    'transform': 'rotate(' + rotation + 'deg)'
  }).attr('data-rotation', rotation);

  $('.cm li').each(function (node){
    r = (node) * 360/nodes;
    $($('.cm li')[node]).find('span').css({
      'transform': 'rotate(' + ((rotation*-1) - r) + 'deg)'
    });
  });

  if(i >= nodes){
    i = 0;
  }
}, 1000);

JsFiddle 链接:

https://jsfiddle.net/aspjsplayground/hqczLby7/

【问题讨论】:

  • 在看到您对 kva 答案的第二条评论后:也许可以尝试通过一个类添加 CSS 过渡(例如,如果缺少该类,则没有过渡)。在重置之前删除该类,并在完成后将其添加回来。

标签: javascript jquery css animation


【解决方案1】:

我已经编辑了您的 jsfiddle,以便在重置为 0 时不会为旋转设置动画。

这样做时使用window.requestAnimationFrame 会很有帮助,因为修改transition 不是即时的。

https://jsfiddle.net/hqczLby7/8/

【讨论】:

    【解决方案2】:

    只需从代码中删除这部分,旋转角度就会增加
    45 90 135 180 225 270 315 360 405 450等等..

    if(i >= nodes){
    i = 0;}
    

    【讨论】:

    • 但是当旋转角度无限大或超出范围时,这可能会导致浏览器崩溃。
    • 你可以使用关键帧
    • 但是我想严格使用 Javascript 来做,因为我想用这个做更多的事情,CSS 关键帧并不完全符合我的要求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-03
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多