搜索
热搜: 活动 交友 discuz
查看: 13|回复: 0

马黑黑《textPath startOffset动画 》

[复制链接]
  • TA的每日心情
    开心
    6 小时前
  • 签到天数: 471 天

    连续签到: 6 天

    [LV.9]以坛为家II

    549

    主题

    1436

    回帖

    1万

    积分

    社区管理员

    积分
    14176

    最佳新人活跃会员热心会员推广达人宣传达人灌水之王突出贡献优秀版主荣誉管理

    发表于 前天 21:41 | 显示全部楼层 |阅读模式

    属性 startOffset 用于定义 <textPath> 中的文本在指定路径上的起始位置,可以利用此属性令文本在路径上移动。但此属性不支持 CSS 设置,所以 @keyframe 动画不能使用,只能在 XML 代码中插入 <animate> 标签。看代码和效果:

    <style>
        #msvg { border: 1px solid gray; }
        #msvg text { font: bold 30px Sans-serif; text-anchor: middle; fill: darkred; }
    </style>
    
    <svg id="msvg" widt="600" height="300" viewBox="-200 -100 400 200" xmlns="http://www.w3.org/2000/svg">
        <path id="tp" d="M -180 100 Q 0 -160,180 100" fill="none" stroke="none" />
        <text>
            <textPath href="#tp" >
                于无声处听惊雷
                <animate id="ani" attributeName="startOffset" from="120%" to="50%" dur="8s" repeatCount="1" fill="freeze" />
            </textPath>
        </text>
    </svg>

    核心在 animate 代码行。里面的主要属性:

    1. attributeName :指明上层父元素参与动画的属性名称;
    2. from :动画开始值。这里设为 120%,令文字基本隐藏在路径右侧;
    3. to :动画终止值。这里设为 50%,令文本居中(需要配合 text-anchor,可以在 CSS 中设置);
    4. dur :动画运行周期时长(带单位);
    5. repeatCount :动画重复次数(indefinite 为永远重复);
    6. fill :动画结束后的保持状态(freeze、remove)

    animate 动画还有其它相关属性,这里未用上就不赘述了。

    示例中可以重置动画,一并给出核心 JS 代码:

    function resetAnimate() {
        const ani = document.getElementById('ani');
        setTimeout(() => ani.beginElement(), 0);
    }

    其中的 animateElement.beginElement() 方法是重新开始动画指令,终止动画可使用 endElement() 方法。

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

    本版积分规则

    QQ|Archiver|小黑屋|纳兰音画网 ( 蜀ICP备2021011087号-1 )

    GMT+8, 2026-7-21 13:39 , Processed in 0.235355 second(s), 22 queries .

    Powered by Discuz! X3.5

    © 2001-2020 Comsenz Inc.

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