d3 svg拖拽跳动
今天是情人节! 因此,让我们进入事物的精神,在此过程中变粉红色和模糊不清,并使用SVG为自己编写一个简单的动画跳动的心脏。
这是我们要创建的:
这是使您熟悉SVG语法和真实动画的绝佳练习。 我们将以预制的SVG心脏为基础,提醒自己viewBox
工作原理,然后添加animateTransform
元素来控制跳动。 在最初的“简单”方法之后,我们将讨论它的问题并进行一些改进。 让我们开始!
1.创建一个心形图标
在选择的矢量工具中,绘制一个简单的心脏图标。 它并不一定是完美的,但是为了简便起见,使其成为一条连续的道路。 我在100x100px的画布上创建了我的游戏,几乎填满了整个内容。
如果要使用我的Illustrator版本和SVG版本,请下载它们。
复制并粘贴到文本编辑器中
如今,在大多数矢量应用程序中,您可以复制对象并将生成的SVG代码粘贴到文本编辑器中。 对心脏对象也是如此。 稍后我们将回到此SVG代码段。
2.开始编写SVG
在Codepen(或blanco HTML文件)中,首先编写SVG元素的基本内容:
在这里,我们为SVG提供了与原始画布相同的高度和宽度。 我们还将viewBox设置为0 0 100 100
。 这意味着我们正在查看SVG的窗口从坐标0 0(左上角)开始,尺寸为100x100px,因此它与SVG完美匹配。
为了清楚地了解您要处理的内容,请添加CSS规则为SVG背景上色:
svg {
background: blue;
}
我们还使用flexbox集中我们正在查看的内容:
body {
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
}
3.添加心脏路径
现在我们需要在SVG中嵌套路径元素。 从空路径开始,以fill
颜色和空d
:
d
定义了绘制的路径,因此让我们向其添加路径坐标。 在您粘贴到文本编辑器的SVG代码段中,将d
属性中的所有内容粘贴到我们的空属性中。 您应该以一个混乱的字符串结尾,如下所示:
所有这些都会创建以下内容:
4.让你的心成长
我想要更大的心。
通过将SVG的width和height属性加倍到width="200" height="200"
我们将使整个对象的大小加倍。 或者我们可以按150% width="150" height="150"
缩放所有内容。 或者是其他东西。 我们不必触摸viewBox值,因为它们将相对于我们刚刚更改的Viewport保持相对。
5.添加动画效果
为了对心脏进行动画处理,我们将使用嵌套在SVG中的animateTransform
元素。
首先在SVG内部添加元素,作为路径的同级元素:
我们使用的属性是不言而喻的。 我们正在创建一个持续时间为1s的缩放变换,该变换将无限期地重复。
将值添加到变换
现在我们需要添加一个值列表,这样它就知道要进行多少动画处理:
因此,这里的心脏从正常大小( 1
)开始,然后缩放到1.5
正常大小,然后再减小到1.25
,然后又回到1.5
,依此类推。 这些值给我们带来了跳动的效果。
注意 :每个值占用我们设置的1秒计时的相等部分。 就像您想象的那样,运动似乎会加速和减速,具体取决于每个步骤需要进行多少缩放。
在薰衣草色的背景下,我们拥有一颗跳动的心!
6.更好的解决方案
改变我们处理方式的原因有两个,第一个(重要的)原因是:在许多移动浏览器中都无法使用。 iOS Safari和Chrome只会显示一动不动的心,因为它们不喜欢将animateTransform应用于元素。
“仍然是我跳动的心脏” – 斯特恩
另外,我们正在对整个SVG进行动画处理; 在将的内容设置为动画时,将其保持在相同的比例会更有用。 这是可能的-我们需要稍微处理一下坐标系-但这是可能的。
添加包装元素并缩小
首先将我们的
和
元素包装在一组
元素中。 现在,该
将被动画化:
我还想通过增加viewBox
的大小来“缩小”。 这将防止我们的心脏超出 ,从而掩盖它。
此时,最好再次给背景颜色,这样我们就可以看到发生了什么:
好吧,它有效,但是坐标使我们感到混乱。 group元素从0,0开始缩放,而我们需要我们的心从中心开始缩放。 为此,我们可以对
进行转换,将其向上移动一半高度,向左移动一半宽度:
这是发生了什么:
为了补偿
在视口边界之外移动,现在让我们在另一个方向上偏移
。 我们的viewBox是200x200,因此我们需要将组移动到一半:
这是我们的目标(如果您仍在注意,那就做得好!):
另外,移动viewBox
的坐标将具有相同的效果:
如果SVG坐标使您的头部旋转,请看一下Sara Soueidan在该主题上写的内容 。
另一个属性
为了
能够转换
,我们需要向
添加另一个属性:
additive="sum"
这样可以有效地将动画中的变换值添加到
本身声明的变换值上,从而阻止一个覆盖另一个。 理解起来可能是一个令人困惑的属性,并且可能引发一些意外的结果,但是在我们的情况下,它可以完美地工作!
“ [[additive =“ sum”]指定动画将添加到属性和其他优先级较低的动画的基础值。” – MDN
我们完成了!
结论
我必须说实话,我喜欢这个最终结果! 这是一个简单但有效的动画,为我们提供了练习SVG技能的绝好机会。 这就是我们创建的内容(转到CodePen,花点心思! )
翻译自: https://webdesign.tutsplus.com/tutorials/how-to-make-an-animated-beating-heart-with-svg--cms-32759
d3 svg拖拽跳动