马黑黑 发表于 2022-10-22 09:26

CSS:offset-path动画制作解析

本帖最后由 马黑黑 于 2023-4-16 08:32 编辑 <br /><br /><style>
#papa { width: 100%; }
#papa > p { padding: 8px 0; }
.mtBox { margin: auto; width: 740px; height: 460px; position: relative; }
.fish22 { position: absolute; offset-path: path('M196 223.5a192.5 136.5 0 1 0 385 0a192.5 136.5 0 1 0 -385 0z'); offset-distance: 100%; animation: swim 20s infinite; }
@keyframes swim { to { offset-distance: 0%; } }
</style>
<div id="papa">

<p>CSS可以使用 offset-path 制作 animation 动画,offset-path 属性用于定义动画的svg路线,语句如下:</p>
<p>offset-path: path('M196 223.5a192.5 136.5 0 1 0 385 0a192.5 136.5 0 1 0 -385 0z');</p>
<p>path 引导路径,路径当是标准的 svg 路径,用小角引号包裹起来并放在小角小括弧里。上例是一个椭圆闭合路径。路径可以是任意的合法的 svg 路径,可以是闭合路径,也可以是不闭合的路径。路径可以利用在线工具生成,能自己编写路径更好。有了路径,还需设定 offset-distance 初始偏移位置,一般用百分比表示:</p>
<p>offset-distance: 100%;</p>
<p>这表明,运动对象偏移到路径的100%处。然后,制定关键帧动画,回到 100% 的对立位置 0%:</p>
<p>to { offset-distance: 0%; } </p>
<p>当然也可以从 0%&nbsp;偏移到 100%,这根据需要来设定。下面我们来看看一个实例的完整的代码:</p>
<pre>&lt;style&gt;
<span style="color: red;">.mtBox </span>{
&nbsp; &nbsp;<span style="color: blue;">margin</span>: auto;
&nbsp; &nbsp;<span style="color: blue;">width</span>: 740px;
&nbsp; &nbsp;<span style="color: blue;">height</span>: 460px;
&nbsp; &nbsp;<span style="color: blue;">position</span>: relative;
}
<span style="color: red;">.fish </span>{
&nbsp; &nbsp;<span style="color: blue;">position</span>: absolute;
&nbsp; &nbsp;<span style="color: blue;">offset-path</span>: path(<span style="color: magenta">'M196 223.5a192.5 136.5 0 1 0 385 0a192.5 136.5 0 1 0 -385 0z'</span>);
&nbsp; &nbsp;<span style="color: blue;">offset-distance</span>: 100%;
&nbsp; &nbsp;<span style="color: blue;">animation</span>: swim 20s infinite;
}
<span style="color: red;">@keyframes swim </span>{
&nbsp; &nbsp;to { <span style="color: blue;">offset-distance</span>: 0%; }
}
&lt;/style&gt;
</pre>
<p>运动对象就是 .fish&nbsp;盒子所指向的图片标签,它做了绝对定位,这个强烈建议,这样就可以通过 left、top&nbsp;等设定物理定位后改变运动对象的运动区域。这源于:svg路径是固定的,但有时我们需要调整运动对象的运动区域,absolute + left + top 就能派上用场,大家可以根据实例自己做尝试、体会。</p>
<p>CSS使用 offset-path 无需显示svg路径,也就是,不必要写出 svg 及其路径标签,但本例,为了让大家对比运动与&nbsp;svg 路径的关系,HTML代码附带了svg标签,其内的&nbsp;path&nbsp;标签&nbsp;的&nbsp;d&nbsp;路径与CSS的&nbsp;offset-path&nbsp;完全一样:</p>
<pre>&lt;<span style="color:darkred">div</span> <span style="color: red">class</span><span style="color: blue">=</span><span style="color: magenta">"mtBox"</span>&gt;
&nbsp; &nbsp;&lt;<span style="color:darkred">img</span> <span style="color: red">class</span><span style="color: blue">=</span><span style="color: magenta">"fish"</span> <span style="color: red">src</span><span style="color: blue">=</span><span style="color: magenta">"https://wj1.zp68.com:812/lxx/yunhua/2022/10/02/gnyu.jpg"</span> alt="" /&gt;
&nbsp; &nbsp;&lt;<span style="color:darkred">svg</span> <span style="color: red">width</span><span style="color: blue">=</span><span style="color: magenta">"100%"</span> <span style="color: red">height</span><span style="color: blue">=</span><span style="color: magenta">"100%"</span> <span style="color: red">style</span><span style="color: blue">=</span><span style="color: magenta">"position: absolute; left: 0; top: 0; border:1px solid #111;"</span>&gt;
&nbsp; &nbsp;&nbsp; &nbsp;&lt;<span style="color:darkred">path</span> <span style="color: red">d</span><span style="color: blue">=</span><span style="color: magenta">"M196 223.5a192.5 136.5 0 1 0 385 0a192.5 136.5 0 1 0 -385 0z"</span> <span style="color: red">fill</span><span style="color: blue">=</span><span style="color: magenta">"none"</span> <span style="color: red">stroke</span><span style="color: blue">=</span><span style="color: magenta">"red"</span> /&gt;
&nbsp; &nbsp;&lt;<span style="color: darkred">/svg</span>&gt;
&lt;<span style="color: darkred">/div</span>&gt;
</pre>
<p>svg使用了 style 属性将其设定为与帖子父框重合,这样它的路径才能与 CSS 设定的 offset-path 路径贴合。演示效果:</p>
<p></p>

<div class="mtBox">
        <img class="fish22" src="https://wj1.zp68.com:812/lxx/yunhua/2022/10/02/gnyu.jpg" alt="">
        <svg width="100%" height="100%" style="position: absolute; left: 0; top: 0; border:1px solid #111;">
                <path d="M196 223.5a192.5 136.5 0 1 0 385 0a192.5 136.5 0 1 0 -385 0z" fill="none" stroke="red"></path>
        </svg>
</div>

</div>

马黑黑 发表于 2022-10-22 09:35

offset-path 还有一些细节设定,比如 offset-anchor,用于确定运动对象的锚点位置,就是运动对象在线上、线内、线外游动的位置,不过貌似没啥必要,因为我们根本就不想要路径显示出来。

小辣椒 发表于 2022-10-22 09:52

这个又要用到路径,感觉是我的弱项,但动画又是很想学习的

马黑黑 发表于 2022-10-22 10:45

小辣椒 发表于 2022-10-22 09:52
这个又要用到路径,感觉是我的弱项,但动画又是很想学习的

这里讲的很浅易的,好好消化一下

红影 发表于 2022-10-23 20:55

学习{:4_187:}

马黑黑 发表于 2022-10-23 21:04

红影 发表于 2022-10-23 20:55
学习

这是复习吧

红影 发表于 2022-10-24 16:58

马黑黑 发表于 2022-10-23 21:04
这是复习吧

嗯嗯,你讲过的{:4_173:}

马黑黑 发表于 2022-10-24 17:45

红影 发表于 2022-10-24 16:58
嗯嗯,你讲过的

{:4_181:}
页: [1]
查看完整版本: CSS:offset-path动画制作解析