Home  >  Q&A  >  body text

前端 - transform后参数不同,rotate无法正常触发transition的问题。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            .test{
                margin: 50px;
                width: 100px;
                height: 100px;
                background-color: red;
                transition: all 1s;
                transform:  rotate(0) translateX(5px);
            }
            /*css1*/
            .test:hover{
                transform: rotate(360deg);
            }
            /*css2*/
            #btn:hover+.test{
                transform:  rotate(360deg) translateX(0px);
            }
            
        </style>
    </head>
    <body>
        <button id="btn">css2</button>
        <p class="test">
            css1
        </p>
    </body>
</html>

简化了一下样式还是要问呀。
1.初始样式为rotate(0) translateX(5px);过渡至css1,只能触发translateX(5px)的过渡效果。
2.过渡至css2,可以看到平移5px和旋转360度的效果。
如果说rotate的过渡表现是(初始-最终)%360的话,为什么前者是0deg而后者是360deg。
总结一下就是前后transform后具体属性值和属性顺序不匹配则无法有效触发rotate的过渡,是什么原因。
不匹配举例:
1.从transform: rotate(0) translateX(5px);transform: rotate(360deg);
2.从transform: rotate(0) translateX(5px);transform: translateX(5px) rotate(360deg);
3.从transform: translateX(5px);transform: translateX(5px) rotate(360deg);
https://jsfiddle.net/23cc8LvL/

天蓬老师天蓬老师2647 days ago719

reply all(4)I'll reply

  • 天蓬老师

    天蓬老师2017-04-17 11:57:50

    传送门答案在此。

    reply
    0
  • 迷茫

    迷茫2017-04-17 11:57:50

    1.测试结果和参数的个数是否匹配无关
    2.执行动画回退的时候,rotate的角度差与360求余数,实际按余数来执行rotate

    reply
    0
  • PHP中文网

    PHP中文网2017-04-17 11:57:50

    刚试了一下,不只是个数的问题,你交换一下位置,也不行。
    应该就是这样,搜了一下也没有人遇到这问题

    reply
    0
  • PHP中文网

    PHP中文网2017-04-17 11:57:50

    先明白transition实际上就是为元素初始位置发生变化的这个过渡加上补间动画。类似于PPT的“变体”和keynote的“神奇移动”。
    楼主的问题主要是因为点击完btn1后元素旋转到的位置恰巧和btn2事件执行完元素的位置重合了,所以看不见补间动画,换句话说就是没有发生相对位移。
    解决方法:将btn2事件代码里的rotate(180deg)改为其他数值,但要避免再是其完整圈数的倍数以免重合。
    例:

    <script type="text/javascript">
            var testEl = document.querySelector('#test');
            var btn1 = document.querySelector('#btn1');
            var btn2 = document.querySelector('#btn2');
            btn1.onclick = function(){
                testEl.style.transform = 'translateX(100px)  scale(1.8) rotate(540deg)';
                testEl.style.transition = 'all 1s';
            };
            btn2.onclick = function(){
               testEl.style.transform = 'skew(30deg) rotate(90deg)';   
                testEl.style.transition = 'all 1s';
            }
    </script>

    这样应该就解决了。

    reply
    0
  • Cancelreply