花潮论坛

搜索
热搜: 活动 交友 discuz
查看: 66|回复: 24

让svg内部元素运行CSS动画

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

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

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

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

    发表于 2024-9-19 18:35 | 显示全部楼层 |阅读模式

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

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

    x
    本帖最后由 马黑黑 于 2024-9-19 18:38 编辑

    svg有自己一整套动画系统,诸如 set、animate、animateMotion 和 animateTransform 等,都可以在svg中以标签的形式为svg子元素制作动画。遗憾的是svg动画实现过程有点麻烦,不仅动画属性繁多,而且每一个动画标签只能负责一个基于子元素的属性变更(如改变圆心坐标)动画,做一个可能不算复杂的动画也需要多个动画标签来配套完成。CSS动画则简便得多,一切基于元素不同属性的动画都可以放在 @keyframes 选择器中进行表述,然后元素通过 animate 属性引用 @keyframes 选择器的动画名称即可,animation 还可以引用多个 @keyframes 动画并以不同的方式和运行周期运动动画。

    先看纯svg的动画例子。下面的示例,矩形元素rect自上而下垂直落下的同时旋转360度:

    代码:

    查看代码,rect标签内两次使用了 animateTransform 动画标签,一次设置rect的旋转 rotate,另一次设置rect的位移 translate。animateTransform动画多个属性联合使用时需要配置 additive 属性,值为 sum 表示动画叠加 repalce 表示动画替换——即后一个动画替换前一个动画。需要特别注意,旋转动画的 fromto 值要设置从{200 20}到{200 220}的rect自己的中心点坐标,不设置或设置不当rect的运动将不是垂直下落;当然,可以给rect加入style属性设置 transform-box 和 transform-origin,像这样,style="transform-box: fill-box; transform-origin: center",如此from和to属性赋值使用单值即旋转角度就可以了。

    前述CSS动画的灵活性其实也可以用于svg,换言之,如果需要,我们完全可以避开svg原生动画标签,转而通过CSS来定制svg内部元素基于@keyframes+animation的动画。现在,我们使用CSS动画实现上例的效果:

    代码:

    查看代码会发现,CSS写在<svg> ... </svg>标签内,这和做HTML帖子将CSS放在<body> ... </body>标签之内是同一个道理。CSS代码中,.down 选择器 ① 强制转换原点基于自己的中心。这是非常有必要的,因为即使是使用CSS @keyframes动画,svg内的元素依然不会自己改变坐标系;② 设定填充样式 fill、描边样式 stroke 和动画 animation 属性。动画选择器 @keyframes 则设置了一个动画:自上而下移动+旋转360度,二者放在同一个 transform 属性里进行表述,非常简洁。

    有意思的是,svg内CSS设定的@keyframes动画,transform的translate平移数值支持百分比,且百分比基于父元素,这和HTML的CSS相同属性动画值不同,后者的百分比基于子元素即引用动画的元素。原因很简单:针对 transform 形变,HTML元素以自我中心点为运动原点,所以translate平移百分比数值基于自身;svg里的元素则以svg画布左上角为形变原点,所以百分比平移数值基于父元素即svg画布。此外,非常重要的,svg标签加上版本号和命名空间属性存为.svg文档之后是合法的,可以当图片使用,像如下代码:

    <svg width="400" height="200" viewBox="0 0 400 200" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    	<style>
    		.down { fill: olive; stroke: none; transform-box: fill-box; transform-origin: center; animation: down 5s linear infinite; }
    		@keyframes down { to { transform: translateY(200px) rotate(360deg); } }
    	</style>
    	<rect x="180" y="0" width="40" height="40" class="down"></rect>
    </svg>
    

    svg使用CSS动画除了本文介绍的方法,还可以使用XML的语言规范为svg设置CSS动画,甚至可以和HTML一样使用外部CSS文档。

    评分

    参与人数 4威望 +140 金钱 +280 经验 +140 收起 理由
    梦江南 + 30 + 60 + 30 很给力!
    花飞飞 + 30 + 60 + 30 很给力!
    红影 + 50 + 100 + 50 赞一个!
    起个网名好难 + 30 + 60 + 30 学习

    查看全部评分

  • TA的每日心情
    无聊
    2025-5-5 04:26
  • 签到天数: 597 天

    [LV.9]以坛为家II

    185

    主题

    5874

    回帖

    2万

    积分

    贵宾

    Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

    花潮帅哥飞龙在天王者至尊大将风范音画大师天籁妙音花潮贵宾

    发表于 2024-9-19 20:07 | 显示全部楼层
    评分把帖子破坏了

    <style>…………</style> 放在svg外也一样。
    我就来看看
    回复 支持 反对

    使用道具 举报

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

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

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

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

    发表于 2024-9-19 22:13 | 显示全部楼层
    使用svg自己的动画系统不如使用CSS的简便且熟悉呢
     
    回复 支持 反对

    使用道具 举报

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

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

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

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

    发表于 2024-9-19 22:17 | 显示全部楼层
    svg的自己的动画太麻烦了,比如那个transform是从0到200,结果rotate的纵向居中就要跟着是20到220,这样一个不小心就会弄错啊。
    还是css好,一个center就不用管了
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-8-5 16:33
  • 签到天数: 44 天

    [LV.5]常住居民I

    62

    主题

    1万

    回帖

    2万

    积分

    贵宾

    Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

    花潮美女流光溢彩优雅神秘花潮贵宾

    发表于 2024-9-19 22:23 | 显示全部楼层
    能动起来的都厉害,何况还有多种实现方法。。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-16 08:52
  • 签到天数: 1671 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

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

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

     楼主| 发表于 2024-9-19 22:50 | 显示全部楼层
    花飞飞 发表于 2024-9-19 22:23
    能动起来的都厉害,何况还有多种实现方法。。

    svg的动画略难一些
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-16 08:52
  • 签到天数: 1671 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

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

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

     楼主| 发表于 2024-9-19 22:51 | 显示全部楼层
    红影 发表于 2024-9-19 22:17
    svg的自己的动画太麻烦了,比如那个transform是从0到200,结果rotate的纵向居中就要跟着是20到220,这样一 ...

    是的。我个人觉得 animateTransform  是多余的,应该让 animate 属性里的 transform 能发挥动画功能。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-16 08:52
  • 签到天数: 1671 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

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

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

     楼主| 发表于 2024-9-19 22:52 | 显示全部楼层
    红影 发表于 2024-9-19 22:13
    使用svg自己的动画系统不如使用CSS的简便且熟悉呢

    不过也是因为先入为主吧,接触CSS动画要早一些
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-16 08:52
  • 签到天数: 1671 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

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

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

     楼主| 发表于 2024-9-19 22:53 | 显示全部楼层
    起个网名好难 发表于 2024-9-19 20:07
    评分把帖子破坏了

    ………… 放在svg外也一样。

    你存为 .svg 文档时会报错,除非严格按 XML 语法写style 标签
    回复 支持 反对

    使用道具 举报

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

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

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

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

    发表于 2024-9-19 23:40 | 显示全部楼层
    马黑黑 发表于 2024-9-19 22:51
    是的。我个人觉得 animateTransform  是多余的,应该让 animate 属性里的 transform 能发挥动画功能。

    反正我是觉得简单的更容易让人接受。
     
    回复 支持 反对

    使用道具 举报

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

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

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

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

    发表于 2024-9-19 23:40 | 显示全部楼层
    马黑黑 发表于 2024-9-19 22:52
    不过也是因为先入为主吧,接触CSS动画要早一些

    是的,所以更习惯些。
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-16 08:52
  • 签到天数: 1671 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

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

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

     楼主| 发表于 2024-9-20 07:44 | 显示全部楼层
    红影 发表于 2024-9-19 23:40
    是的,所以更习惯些。

    CSS动画也是要简洁得多
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-16 08:52
  • 签到天数: 1671 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

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

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

     楼主| 发表于 2024-9-20 07:44 | 显示全部楼层
    红影 发表于 2024-9-19 23:40
    反正我是觉得简单的更容易让人接受。

    这是自然。不过复杂的机制能做出更为精巧的东东,比如光刻机的制作。
    回复 支持 反对

    使用道具 举报

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

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

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

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

    发表于 2024-9-20 14:08 | 显示全部楼层
    马黑黑 发表于 2024-9-20 07:44
    CSS动画也是要简洁得多

    两者能通用,非常好呢。
     
    回复 支持 反对

    使用道具 举报

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

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

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

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

    发表于 2024-9-20 14:08 | 显示全部楼层
    马黑黑 发表于 2024-9-20 07:44
    这是自然。不过复杂的机制能做出更为精巧的东东,比如光刻机的制作。

    也需要学得更多些才行。
     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-8-5 16:33
  • 签到天数: 44 天

    [LV.5]常住居民I

    62

    主题

    1万

    回帖

    2万

    积分

    贵宾

    Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

    花潮美女流光溢彩优雅神秘花潮贵宾

    发表于 2024-9-20 21:30 | 显示全部楼层
    马黑黑 发表于 2024-9-19 22:50
    svg的动画略难一些

    面熟和面生的区别,其实应该都不容易
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2025-12-14 08:25
  • 签到天数: 600 天

    [LV.9]以坛为家II

    379

    主题

    1万

    回帖

    3万

    积分

    贵宾

    Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

    花潮美女鼠牛虎兔龙蛇马羊猴鸡狗猪缤纷心情心曲飞扬花好月圆飞龙在天音画大师花潮贵宾

    发表于 2024-9-21 08:37 | 显示全部楼层
    老师发的都是最尖端的代码编程,佩服了!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-16 08:52
  • 签到天数: 1671 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

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

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

     楼主| 发表于 2024-9-21 11:39 | 显示全部楼层
    梦江南 发表于 2024-9-21 08:37
    老师发的都是最尖端的代码编程,佩服了!

    果酱了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-12-16 08:52
  • 签到天数: 1671 天

    [LV.Master]伴坛终老

    3050

    主题

    13万

    回帖

    28万

    积分

    管理员

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

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

     楼主| 发表于 2024-9-21 11:47 | 显示全部楼层
    花飞飞 发表于 2024-9-20 21:30
    面熟和面生的区别,其实应该都不容易

    CSS容易得多
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2025-8-5 16:33
  • 签到天数: 44 天

    [LV.5]常住居民I

    62

    主题

    1万

    回帖

    2万

    积分

    贵宾

    Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7Rank: 7

    花潮美女流光溢彩优雅神秘花潮贵宾

    发表于 2024-9-21 20:26 | 显示全部楼层

    难怪看着比较亲切纯svg一个单词快一米长,太吓人了。
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2025-12-16 10:25 , Processed in 0.088169 second(s), 28 queries .

    Powered by Discuz! X3.4

    © 2001-2013 Comsenz Inc.

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