花潮论坛

搜索
热搜: 活动 交友 discuz
查看: 472|回复: 179

CSS关键帧动画:元素绕椭圆圆周运动的实现(二)

[复制链接]
  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

    发表于 2024-5-22 07:45 | 显示全部楼层 |阅读模式

    请马上登录,朋友们都在花潮里等着你哦:)

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x
    本帖最后由 马黑黑 于 2024-5-22 07:49 编辑

    上一讲,《CSS关键帧动画:元素绕椭圆圆周运动的实现(一)》,我们用两个CSS属性 ① offset-path 设计路径、② offset-distance 控制元素在路径上的偏移位置,实现了绝对定位的子元素在相对定位的父元素场景下做椭圆运动。椭圆运动往往能模拟出一定效果的3d运动,为了让效果显得更生动逼真,我们还需要让运动中的元素在运动周期中能变小变大,规则是,元素离观测点最近时最大、反正最小。椭圆路径始于左中(M0 120),按顺时针方向运动,移动到 25% 即椭圆的最顶端时离我们的眼睛(观测点)最远,到 50% 即右中时和出发点同在一个水平位置,到 75% 即最底端时离我们最近。按这个规律,我们设计一组CSS关键帧动画,就叫它 size 吧,用来控制元素在移动时的尺寸变化:

    @keyframes size {     0%, 50%, 100% { transform: scale(1); }     25% { transform: scale(0.5); }     75% { transform: scale(1.5); } }

    这里,我们设计了三种变化状态,最小 0.5,最大 1.5,正常 1,分别对应于运动路径上的 ① 0%、50%、100%,② 25%,③ 75%,然后将这个动画追加给 li-zi 的 animation 属性——我们早已知道,animation 属性支持多个关键帧动画。下面是效果和代码:
     


    <style> .eBox { margin: 20px auto; width: 400px; height: 240px; border: 1px solid gray; border-radius: 50%; position: relative; } li-zi { position: absolute; width: 30px; height: 30px; background: plum; offset-path: path('M0 120 A200 120 0 1 1 400 120 A200 120 0 1 1 0 120'); animation: move 10s linear infinite, size 10s linear infinite; } @keyframes move { from { offset-distance: 0; } to { offset-distance: 100%; } } @keyframes size {     0%, 50%, 100% { transform: scale(1); }     25% { transform: scale(0.5); }     75% { transform: scale(1.5); } } </style> <div class="eBox"> <li-zi></li-zi> </div>

    留意观察第 16 行代码,animation属性调用了两个关键帧动画,彼此间用小角逗号隔开,两组动画的运行参数保持一致以确保动作协调。

    以上只是一个 li-zi 元素实例的运动展示,如果是多个元素前后拉开距离在同一个跑道上运动,那又如何实现呢?思路其实也简单:利用 animation-delay 实现,该属性表示动画延时执行的时间,使用负值表示提前执行。下面的实例,我们利用 JS 批量生成 12 个 li-zi 元素,每一个 li-zi 元素背景色随机产生,animation-delay 属性值取负数值,按照动画总时长除以 li-zi 总数乘以序列 id (具体看第36行代码)以便让小矩形在路径上均匀分布。

    效果:

    完整代码:

    <style> .eBox { margin: 20px auto; width: 400px; height: 240px; border: 1px solid gray; border-radius: 50%; position: relative; } li-zi { position: absolute; width: 30px; height: 30px; background: plum; offset-path: path('M0 120 A200 120 0 1 1 400 120 A200 120 0 1 1 0 120'); animation: move 10s linear infinite, size 10s linear infinite; } @keyframes move { from { offset-distance: 0; } to { offset-distance: 100%; } } @keyframes size { 0%, 50%, 100% { transform: scale(1); } 25% { transform: scale(0.5); } 75% { transform: scale(1.5); } } </style> <div class="eBox" id="lzpa"></div>   <script>     var total = 12;     for(var i = 0; i < total; i ++) {         let lz = document.createElement('li-zi');         lz.style.cssText += `             animation-delay: -${10 / total * i}s;             background-color: #${Math.random().toString(16).substring(2, 8)};         `;         lzpa.appendChild(lz);     } </script>

    注意,第 36 行代码,10 来源于 animation 属性中设置的 animation-duration 即第 16 行代码中的 10s,这个数值若发生变化这里也要跟着改。

    这里只是演示,实际应用时应当根据需要做必要的修改,反正万变不离其宗,懂得做的都会懂。

    评分

    参与人数 2威望 +80 金钱 +160 经验 +80 收起 理由
    南无月 + 30 + 60 + 30 很给力!
    红影 + 50 + 100 + 50 赞一个!

    查看全部评分

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2024-5-22 10:06 | 显示全部楼层
    这个一步步讲解下来特别好,先理解单个的,再理解多个元素的,循序渐进,真棒
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2024-5-22 10:08 | 显示全部楼层
    “animation属性调用了两个关键帧动画”
    这个设计好,两个动作能同时实现了
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2024-5-22 10:12 | 显示全部楼层
    第 36 行代码,若animation-delay 属性值不取负数值,元素是一个个出来再全体旋转,取了负值是直接就全体旋转了,这个很奇妙。
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-1 20:32
  • 签到天数: 1052 天

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮美女虎龙狗猪多彩人生星月交辉海样胸怀火热情怀优雅迷人神秘浪漫缤纷心情草莓情怀蝴蝶情怀心曲飞扬星星情怀七彩绚丽活泼开朗女儿情怀相遇之美一往情深花好月圆心香一瓣紫色情节飞龙在天金剪刀天籁妙音妙笔生花风雨同行我心永远天长地久幸福快乐绚丽缤纷喜乐安康中秋征文周年庆指尖上的流年舞会之星分析(喊冤)章总结章杀人王小强章最佳杀刺临屏写诗七夕诗钟活动第五届风云第六届风云情人节花潮管理

    发表于 2024-5-22 10:18 | 显示全部楼层
    单个变化的在等分的位置上,感觉多个的最大最小不在25%和75%的位置上呢,可能是视觉错觉。
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2024-5-22 11:35 | 显示全部楼层
    本帖最后由 马黑黑 于 2024-5-22 11:42 编辑
    红影 发表于 2024-5-22 10:18
    单个变化的在等分的位置上,感觉多个的最大最小不在25%和75%的位置上呢,可能是视觉错觉。

    就在那里的,这是可想而知的:你试一下去掉关键帧动画,给 li-zi 元素的CSS样式加上:

    offset-distance: 25%;

    然后依次改一下百分比,看看元素在百分之几里观测点最近。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2024-5-22 11:35 | 显示全部楼层
    红影 发表于 2024-5-22 10:12
    第 36 行代码,若animation-delay 属性值不取负数值,元素是一个个出来再全体旋转,取了负值是直接就全体旋 ...

    这个知识点也是之前讲过的,而且大量应用于HTML粒子
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2024-5-22 11:36 | 显示全部楼层
    红影 发表于 2024-5-22 10:08
    “animation属性调用了两个关键帧动画”
    这个设计好,两个动作能同时实现了

    如果有足够的耐心,就设计一个 @keyframes 也是可以的
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2024-5-22 11:37 | 显示全部楼层
    红影 发表于 2024-5-22 10:06
    这个一步步讲解下来特别好,先理解单个的,再理解多个元素的,循序渐进,真棒

    记住一个人相对容易,记住很多人相对困难
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-4 09:02
  • 签到天数: 33 天

    [LV.5]常住居民I

    94

    主题

    9699

    回帖

    2万

    积分

    论坛元老

    Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80

    花潮美女鼠牛虎兔龙蛇马羊猴鸡狗猪蝴蝶情怀音画大师天籁妙音风雨同行我心永远绚丽缤纷

    发表于 2024-5-22 12:51 | 显示全部楼层
    多个粒子用一条线串着特别好看,如果把粒子变成别图案的话。。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-4 09:02
  • 签到天数: 33 天

    [LV.5]常住居民I

    94

    主题

    9699

    回帖

    2万

    积分

    论坛元老

    Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80

    花潮美女鼠牛虎兔龙蛇马羊猴鸡狗猪蝴蝶情怀音画大师天籁妙音风雨同行我心永远绚丽缤纷

    发表于 2024-5-22 12:52 | 显示全部楼层
    近大远小的变化得十分丝滑流畅~~舒适度极佳 。。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2024-5-22 17:34 | 显示全部楼层
    南无月 发表于 2024-5-22 12:52
    近大远小的变化得十分丝滑流畅~~舒适度极佳 。。

    CSS动画用得好还是非常理想的
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2024-5-22 17:35 | 显示全部楼层
    南无月 发表于 2024-5-22 12:51
    多个粒子用一条线串着特别好看,如果把粒子变成别图案的话。。

    有无(线)限可能
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-4 09:02
  • 签到天数: 33 天

    [LV.5]常住居民I

    94

    主题

    9699

    回帖

    2万

    积分

    论坛元老

    Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80

    花潮美女鼠牛虎兔龙蛇马羊猴鸡狗猪蝴蝶情怀音画大师天籁妙音风雨同行我心永远绚丽缤纷

    发表于 2024-5-22 17:46 | 显示全部楼层
    马黑黑 发表于 2024-5-22 17:34
    CSS动画用得好还是非常理想的

    这个用得是真好。。主要是老师算得比较精准。。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-4 09:02
  • 签到天数: 33 天

    [LV.5]常住居民I

    94

    主题

    9699

    回帖

    2万

    积分

    论坛元老

    Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80

    花潮美女鼠牛虎兔龙蛇马羊猴鸡狗猪蝴蝶情怀音画大师天籁妙音风雨同行我心永远绚丽缤纷

    发表于 2024-5-22 17:47 | 显示全部楼层
    马黑黑 发表于 2024-5-22 17:35
    有无(线)限可能

    还是有线好,我把上面的粒子变成立体小珠子,跟项链一样漂亮极了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2024-5-22 18:02 | 显示全部楼层
    南无月 发表于 2024-5-22 17:47
    还是有线好,我把上面的粒子变成立体小珠子,跟项链一样漂亮极了

    漂亮那是自然
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2024-5-22 18:03 | 显示全部楼层
    南无月 发表于 2024-5-22 17:46
    这个用得是真好。。主要是老师算得比较精准。。

    有金算盘的
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-4 09:02
  • 签到天数: 33 天

    [LV.5]常住居民I

    94

    主题

    9699

    回帖

    2万

    积分

    论坛元老

    Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80

    花潮美女鼠牛虎兔龙蛇马羊猴鸡狗猪蝴蝶情怀音画大师天籁妙音风雨同行我心永远绚丽缤纷

    发表于 2024-5-22 20:29 | 显示全部楼层

    出来就惊艳到了,各种变化和效果都可以。。
    就是老师代码灵活又漂亮
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-4 09:02
  • 签到天数: 33 天

    [LV.5]常住居民I

    94

    主题

    9699

    回帖

    2万

    积分

    论坛元老

    Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80Rank: 80

    花潮美女鼠牛虎兔龙蛇马羊猴鸡狗猪蝴蝶情怀音画大师天籁妙音风雨同行我心永远绚丽缤纷

    发表于 2024-5-22 20:30 | 显示全部楼层

    金算盘打得精。。自动加漂亮滤镜
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-15 08:01
  • 签到天数: 1670 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9Rank: 9

    花潮帅哥鼠牛虎兔龙蛇马羊猴鸡狗猪多彩人生星月交辉奔放热烈海样胸怀春风拂面火热情怀优雅迷人神秘浪漫相遇之美鹰傲苍穹花好月圆紫色情节飞龙在天王者至尊大将风范音画大师天籁妙音共看流星风雨同行我心永远幸福快乐喜乐安康侠骨柔肠心想事成开朗大方花潮管理

     楼主| 发表于 2024-5-22 20:52 | 显示全部楼层
    南无月 发表于 2024-5-22 20:30
    金算盘打得精。。自动加漂亮滤镜

    是滴
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    小黑屋|手机版|Archiver|服务支持:DZ动力|huachaowang.com Inc. ( 蜀ICP备17032287号-1 )

    GMT+8, 2025-12-16 06:02 , Processed in 0.082564 second(s), 26 queries .

    Powered by Discuz! X3.4

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表