花潮论坛

搜索
热搜: 活动 交友 discuz
查看: 244|回复: 93

svgdr : 元素沿路径排列+可控闪烁CSS动画

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

    [LV.Master]伴坛终老

    3049

    主题

    13万

    回帖

    28万

    积分

    管理员

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

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

    发表于 2024-10-29 19:43 | 显示全部楼层 |阅读模式

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

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

    x

    评分

    参与人数 6威望 +220 金钱 +440 经验 +220 收起 理由
    梦江南 + 30 + 60 + 30 赞一个!
    花飞飞 + 30 + 60 + 30 很给力!
    小辣椒 + 50 + 100 + 50 赞一个!
    醉美水芙蓉 + 30 + 60 + 30 神马都是浮云
    红影 + 50 + 100 + 50 赞一个!
    起个网名好难 + 30 + 60 + 30 赞一个!

    查看全部评分

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

    [LV.Master]伴坛终老

    3049

    主题

    13万

    回帖

    28万

    积分

    管理员

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

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

     楼主| 发表于 2024-10-29 19:44 | 显示全部楼层
    代码:

    1. <p style="text-align:center;">
    2.     <svg id="mysvg" width="700" height="400"></svg>
    3. </p>

    4. <script>
    5. var sc = document.createElement('script');
    6. sc.src = 'https://638183.freep.cn/638183/web/js2024/svgdr_trial.js';
    7. document.body.appendChild(sc);

    8. sc.onload = () => {
    9.     var dr = _dr(mysvg)

    10.     var balls = [], playing = true;
    11.     dr.path('M0 400 Q350 -280,700 400', 'none','none').id('path');
    12.     var len = path.getTotalLength();
    13.     for(var i = 1, tt = 20; i < tt; i ++) {
    14.         var point = path.getPointAtLength(len / tt * i);
    15.         var color = '#' + Math.random().toString(16).substring(2,8),
    16.             delay = Math.random() * i * -0.1;
    17.         var cx = point.x, cy = point.y;
    18.         dr.circle(cx,cy,20,color).set('class','ball').style(`--delay: ${delay}s`);
    19.         balls.push(dr.elm);
    20.     }
    21.     dr.css(`
    22.         #mysvg { --state: running; }
    23.         .ball { running; cursor: pointer; animation: flash .1s var(--delay) linear infinite alternate var(--state); }
    24.         @keyframes flash { to { opacity: .2; } }
    25.     `);

    26.     balls.forEach(b => b.onclick = () => {
    27.         playing = !playing;
    28.         dr.svg.style.setProperty('--state', ['paused','running'][+playing]);
    29.     });
    30. };
    31. </script>
    复制代码


    评分

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

    查看全部评分

    回复 支持 反对

    使用道具 举报

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

    [LV.Master]伴坛终老

    3049

    主题

    13万

    回帖

    28万

    积分

    管理员

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

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

     楼主| 发表于 2024-10-29 19:56 | 显示全部楼层
    JS代码解释:

    (一)06-08行:加载插件
    (二)11行:声明画笔;
    (三)13行:声明两个变量,balls 数组变量用于装载小球对象,playing 布尔变量是动画运行标识;
    (四)14行:画一条无痕路径,添加 id 是为了获得路径长度等信息;
    (五)15行:获取路径长度 len;
    (六)16*23行:用一个for循环绘制 19 个小圆,小圆的cx、cy依据路径长度百分比获得(path.getPointAtLength),从而达到在路径上均匀布置小球的目的。小球颜色随机。小球加入class属性。同时将小球记入balls数组;
    (七)24-28行:写一个svg内部CSS样式表,给svg定义 --state 变量,给小球设置一个基本CSS样式(比如手型图标响应、动画),设计一个 flash 动画等;
    (八)30-33行:小球点击交互。

    评分

    参与人数 1威望 +50 金钱 +100 经验 +50 收起 理由
    红影 + 50 + 100 + 50 赞一个!

    查看全部评分

    回复 支持 反对

    使用道具 举报

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

    [LV.Master]伴坛终老

    3049

    主题

    13万

    回帖

    28万

    积分

    管理员

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

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

     楼主| 发表于 2024-10-29 20:03 | 显示全部楼层
    svg有文本路径,可以将文本按路径排列。但是,其他元素按路径布排则需要另辟蹊径,本例的实现思路是,利用路径的两个方法,一是 pathElement.getTotalLength() 获的路径总长度,二是 pathElement.getPointsAt() 方法后的路径上某个长度的点坐标,来确定小圆的中心坐标点,从而达到目的。

    for语句中,变量 i 从 1 开始,步进变化到小于上限 tt,酱紫,tt 为 20 时实际上只画了 19 个园。这是为了节省计算,我们的目标之一是小球左右位置齐整,根据路径的设计这么做就不必去计算第一个球和最后一个球的具体位置。

    评分

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

    查看全部评分

    回复 支持 反对

    使用道具 举报

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

    [LV.9]以坛为家II

    185

    主题

    5874

    回帖

    2万

    积分

    贵宾

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

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

    发表于 2024-10-29 20:30 | 显示全部楼层

    tt = 20 没变化没必要放在循环里吧;
    15行之后, len / tt 也是不变的,在循环外计算好,每次循环就免得计算了。
    我就来看看
    回复 支持 反对

    使用道具 举报

    醉美水芙蓉 该用户已被删除
    发表于 2024-10-29 20: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-10-29 20:57 | 显示全部楼层
    getTotalLength()用于获取SVG路径的总长度,而getPointAtLength(len)则返回路径上特定距离处的点的坐标。

    这个功能真好,不用计算就能得到路径上的点的坐标了。黑黑还做在了封装里,用起来更方便了
     
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]伴坛终老

    3049

    主题

    13万

    回帖

    28万

    积分

    管理员

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

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

     楼主| 发表于 2024-10-29 21:09 | 显示全部楼层
    红影 发表于 2024-10-29 20:57
    getTotalLength()用于获取SVG路径的总长度,而getPointAtLength(len)则返回路径上特定距离处的点的坐标。
    ...

    这两个是JS的方法,在svgdr中可以使用
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]伴坛终老

    3049

    主题

    13万

    回帖

    28万

    积分

    管理员

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

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

     楼主| 发表于 2024-10-29 21:11 | 显示全部楼层
    起个网名好难 发表于 2024-10-29 20:30
    tt = 20 没变化没必要放在循环里吧;
    15行之后, len / tt 也是不变的,在循环外计算好,每次循环就免得 ...

    这 tt 同在for循环中便于修改总数,声明在外部也是一种做法。这个无关紧要,很多人都这么做
    回复 支持 反对

    使用道具 举报

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

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

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

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

    发表于 2024-10-29 21:11 | 显示全部楼层
    我去试了个直线的,也挺好看呢
     
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]伴坛终老

    3049

    主题

    13万

    回帖

    28万

    积分

    管理员

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

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

     楼主| 发表于 2024-10-29 21:11 | 显示全部楼层
    醉美水芙蓉 发表于 2024-10-29 20:50
    欣赏学习老师新教程!

    这是测试
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]伴坛终老

    3049

    主题

    13万

    回帖

    28万

    积分

    管理员

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

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

     楼主| 发表于 2024-10-29 21:12 | 显示全部楼层
    红影 发表于 2024-10-29 21:11
    我去试了个直线的,也挺好看呢

    可以设计各类路径
    回复 支持 反对

    使用道具 举报

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

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

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

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

    发表于 2024-10-29 21:19 | 显示全部楼层
    马黑黑 发表于 2024-10-29 21:09
    这两个是JS的方法,在svgdr中可以使用

    还是头一次知道这方法,这个太好了
     
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]伴坛终老

    3049

    主题

    13万

    回帖

    28万

    积分

    管理员

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

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

     楼主| 发表于 2024-10-29 21:19 | 显示全部楼层
    红影 发表于 2024-10-29 21:19
    还是头一次知道这方法,这个太好了

    方法都有的,而且还不断地有新方法,只是大家不去留意
    回复 支持 反对

    使用道具 举报

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

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

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

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

    发表于 2024-10-29 21:19 | 显示全部楼层
    马黑黑 发表于 2024-10-29 21:12
    可以设计各类路径

    这个用明暗变化来形成闪烁,很漂亮
     
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]伴坛终老

    3049

    主题

    13万

    回帖

    28万

    积分

    管理员

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

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

     楼主| 发表于 2024-10-29 21:21 | 显示全部楼层
    红影 发表于 2024-10-29 21:19
    这个用明暗变化来形成闪烁,很漂亮

    这里用的是透明度,还可以考虑用亮度,或二者相结合
    回复 支持 反对

    使用道具 举报

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

    [LV.10]以坛为家III

    1881

    主题

    32万

    回帖

    37万

    积分

    管理员

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

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

    发表于 2024-10-29 21:21 | 显示全部楼层
    马黑黑 发表于 2024-10-29 21:19
    方法都有的,而且还不断地有新方法,只是大家不去留意

    不需要去计算的,都是好方法
     
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]伴坛终老

    3049

    主题

    13万

    回帖

    28万

    积分

    管理员

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

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

     楼主| 发表于 2024-10-29 21:22 | 显示全部楼层
    红影 发表于 2024-10-29 21:21
    不需要去计算的,都是好方法

    如果自己去计算路径的长度、路径某一点的坐标值,那是相当复杂的
    回复 支持 反对

    使用道具 举报

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

    [LV.9]以坛为家II

    185

    主题

    5874

    回帖

    2万

    积分

    贵宾

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

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

    发表于 2024-10-29 21:27 | 显示全部楼层
    马黑黑 发表于 2024-10-29 21:11
    这 tt 同在for循环中便于修改总数,声明在外部也是一种做法。这个无关紧要,很多人都这么做

    确实无关紧要,但至少在这个例子它是没必要这么做的。
    我就来看看
    回复 支持 反对

    使用道具 举报

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

    [LV.Master]伴坛终老

    3049

    主题

    13万

    回帖

    28万

    积分

    管理员

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

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

     楼主| 发表于 2024-10-29 21:29 | 显示全部楼层
    起个网名好难 发表于 2024-10-29 21:27
    确实无关紧要,但至少在这个例子它是没必要这么做的。

    tt在for循环里参与计算 point 值,这个tt得有,至于放在for之前还是for内,这都没问题的,C语言也有这么写的,JS和c很相似
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2025-12-15 17:07 , Processed in 0.102454 second(s), 29 queries .

    Powered by Discuz! X3.4

    © 2001-2013 Comsenz Inc.

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