马黑黑 发表于 2022-3-28 08:18

了解一下transform rotate运动一周的奥秘

<style type="text/css">
        .txtBox { font:normal 16px/20px serif; }
        .txtBox p { padding: 8px 0; }
        .txtBox p {padding: 8px 0;}
        .codeBox { margin: auto; padding: 12px 10px; max-width: 760px; border: 1px solid #aaa; box-shadow: 1px 1px 1px #ccc; border-radius: 4px; background: rgba(255, 255, 255, .7); }
        .codeBox pre { font: 14px Sans-serif; color: #000; }
</style>

<div class="txtBox">
        <p>CSS3的transform中有一个rotate旋转运动,看似简单,但里面有坑。先看一下如下实体元素对象的CSS和HTML代码:</p>
        <div class="codeBox">
                <pre>&lt;style&gt;
<span style="color: red;">#box </span>{
<span style="color: blue;">&nbsp; &nbsp;margin</span>: 120px auto 0;
<span style="color: blue;">&nbsp; &nbsp;width</span>: 100px;
<span style="color: blue;">&nbsp; &nbsp;height</span>: 40px;
<span style="color: blue;">&nbsp; &nbsp;background</span>: olive;
<span style="color: blue;">&nbsp; &nbsp;transform</span>: rotate(60deg);
<span style="color: blue;">&nbsp; &nbsp;animation</span>: roll 4s linear infinite;
}
<span style="color: red;">@keyframes roll </span>{
<span style="color: blue;">&nbsp; &nbsp;to { transform</span>: rotate(360deg); }
}
&lt;/style&gt;

&lt;<span style="color:darkred">div</span> <span style="color: red">id</span><span style="color: blue">=</span><span style="color: magenta">"box"</span>&gt;Hi&lt;<span style="color: darkred">/div</span>&gt;
                </pre>
        </div>
        <p>看好,上面的 div 盒子再简单不过,非常基本的样式外加一个角度旋转和一个animation动画。为了深入了解rotate运动的玄机,我们预设一个目标,即,驱动一个已有旋转角度的HTML元素无尽地、平滑地旋转下去,这将需要确定旋转一周,本来CSS可以这样写@keyframes:</p>
        <p><span style="color: blue;">to { transform</span>: rotate(360deg); } 或 <font color="#0000ff">to { transform:</font> rotate(1turn); }</p>
        <p>然后按照盒子的animation引用方式,我们的目的应该能够达到。但是——</p>
        <p>很遗憾,我们要处理的元素首先存在一个预设的旋转角度,于是它“运行一周”的实际情形是它从自己的角度点(假设是Kdeg)出发,旋转一定弧度后突然就会出现顺向或逆向“跳帧”现象(顺向还是逆向取决于定位弧度的正负值),并不能匀速旋转一整周。为什么呢?</p>
        <p>原来,rotate方法将圆周视为一个坐标系,圆周的起始坐标角度0deg指向3点钟方向,闭合坐标角度360deg也指向3点钟方向与0deg重合。故而,rotate(360deg)的动作在3点钟方向被视为是终结角度,与出发点K之间存在一定的距离,这个距离就是跳帧的原因所在。跳帧的具体表现为,元素从K弧度开始旋转,旋转到出发点0弧度也就是一周的终结点360弧度时被视为一个周期的 rotate(360) 动作结束,元素此时被快速定位到它的出发点K,这就是跳帧,可能顺跳,也可能逆跳。</p>
        <p>至此,解决“跳帧”问题的思路应该可以确定了:元素 rotate 的弧度不是360deg,而是 rotate (360 + K)个deg,上述例子的动画就应改为:</p>
        <p><span style="color: blue;">to { transform</span>: rotate(420deg); }</p>
        <p>如果元素原始旋转了 -60deg,则动画设计成:<span style="color: blue;">to { transform</span>: rotate(300deg); }</p>
        <p>这可以理解为,元素的出发点 K 是 Kdeg,即它从 K 处开始旋转,它要回到出发点 K,必须转 rotate 360deg + Kdeg 才算真正完成一周的旋转运动。等于说,圆周上的0deg~360deg的弧度标志或可以称为刻度的东东是个固定不变的坐标系,运行于其上的元素从非0弧度即3点钟方向的地方出发时,要真正走完360个deg的话,在圆周坐标系上的算式是360deg加上出发点的deg。</p>
</div>

红影 发表于 2022-3-28 10:01

这个还从来不知道呢,原来做圆周运动不能有出视角,若有,也要在360度里扣除。
这命令对圆周的定义很死板呢{:4_173:}

红影 发表于 2022-3-28 10:03

黑黑的这个帖子真好,以后遇到这个命令就不会那么容易掉坑了{:4_199:}

加林森 发表于 2022-3-28 10:33

继续来学习

马黑黑 发表于 2022-3-28 12:14

加林森 发表于 2022-3-28 10:33
继续来学习

{:4_190:}

马黑黑 发表于 2022-3-28 12:27

红影 发表于 2022-3-28 10:01
这个还从来不知道呢,原来做圆周运动不能有出视角,若有,也要在360度里扣除。
这命令对圆周的定义很死板 ...

它的设计自有道理,我们只有适应它

加林森 发表于 2022-3-28 12:53

马黑黑 发表于 2022-3-28 12:14


谢谢老黑。{:5_108:}

红影 发表于 2022-3-28 16:36

马黑黑 发表于 2022-3-28 12:27
它的设计自有道理,我们只有适应它

嗯嗯,记住有个初始角,后来转动过的角度要和初始角对应上。

马黑黑 发表于 2022-3-28 18:00

红影 发表于 2022-3-28 16:36
嗯嗯,记住有个初始角,后来转动过的角度要和初始角对应上。

没有设置初始值,也就是它是自然的样子的,都能平滑转一周

红影 发表于 2022-3-28 19:21

马黑黑 发表于 2022-3-28 18:00
没有设置初始值,也就是它是自然的样子的,都能平滑转一周

这些细节黑黑不说都不知道呢{:4_204:}

马黑黑 发表于 2022-3-28 20:37

红影 发表于 2022-3-28 19:21
这些细节黑黑不说都不知道呢

文档上都提到过,关键是看不看、看了会不会跳帧{:5_117:}

红影 发表于 2022-3-28 21:40

马黑黑 发表于 2022-3-28 20:37
文档上都提到过,关键是看不看、看了会不会跳帧

那估计看的时候跳帧了,不过没关系,后知道也是知道{:4_173:}

马黑黑 发表于 2022-3-28 21:57

红影 发表于 2022-3-28 21:40
那估计看的时候跳帧了,不过没关系,后知道也是知道

嗯,可以回头看

红影 发表于 2022-3-28 22:51

马黑黑 发表于 2022-3-28 21:57
嗯,可以回头看

温故而知新{:5_109:}

马黑黑 发表于 2022-3-28 22:52

红影 发表于 2022-3-28 22:51
温故而知新

说错了,知旧

红影 发表于 2022-3-29 19:24

马黑黑 发表于 2022-3-28 22:52
说错了,知旧

知啥都行,只要是知{:4_173:}

马黑黑 发表于 2022-3-29 20:56

红影 发表于 2022-3-29 19:24
知啥都行,只要是知

知了知了

红影 发表于 2022-3-29 23:14

马黑黑 发表于 2022-3-29 20:56
知了知了

哈哈,成了蝉了{:4_173:}

马黑黑 发表于 2022-3-29 23:22

红影 发表于 2022-3-29 23:14
哈哈,成了蝉了

挺好的吧

红影 发表于 2022-3-30 09:43

马黑黑 发表于 2022-3-29 23:22
挺好的吧

餐风饮露,挺高洁的,很不错{:4_173:}
页: [1] 2 3
查看完整版本: 了解一下transform rotate运动一周的奥秘