我正在参加中秋创意投稿大赛,详情请看:中秋创意投稿大赛
以前一直没有在意单标签实现一些动画的原理,这次刚好蹭活动,同时补习一下。
做出来的自嗨兔效果:
附上源码库:gitee.com/larntin/htm…
使用到的知识点
- transform transiton
- animation @keyframes
- box-shadow
Transform transiton
Transform 属性应用于元素的2D或3D转换。这个属性允许你将元素旋转,缩放,移动,倾斜等。
主流浏览器对2D、3D属性的支持:
| Transform | Chrome | IE | FireFox |
|---|---|---|---|
| 2D | 36.0 4.0-webkit | 10.0 9.0-ms- | 16.0 3.5-moz- |
| 3D | 36.0 12.0-webkit | 12 | 10 |
就不贴具参数的具体意义了,文档地址如下,需要的时候去看看即可:
使用效果就是 Transform 配合 transiton(transition-property) 检查那个动画属性变量去触发动画,通过 transiton的其他相对应的属性时间(transition-duration),延迟(transition-delay),和执行效果( transition-timing-function线性的,easy-in,easy-out)来控制动画的效果。
box-shadow
box-shadow 属性可以设置一个或多个下拉阴影的框。
文档地址:box-shadow
| 属性值 | 说明 |
|---|---|
| h-shadow | 必需的。水平阴影的位置。允许负值 |
| v-shadow | 必需的。垂直阴影的位置。允许负值 |
| blur | 可选。模糊距离 |
| spread | 可选。阴影的大小 |
| color | 可选。阴影的颜色。在CSS颜色值寻找颜色值的完整列表 |
| inset | 可选。从外层的阴影(开始时)改变阴影内侧阴影 |
当我们把 blur 的值设为 0,同时设置做个值,每一个值不同的,这样就可以把同一个对象在不同的屏幕区域复制多份。
#app::before {
content: "";
position: absolute;
top: 34%;
left: 42%;
width: 10px; /* 这四个属性绘制一个耳朵 */
height: 16px; /* 这四个属性绘制一个耳朵 */
transform: translate(-5px, -8px);
background-color: #fff; /* 这四个属性绘制一个耳朵 */
border-radius: 5px; /* 这四个属性绘制一个耳朵 */
box-shadow: 18px 0 0 #fff; /* 便宜18px,不模糊,复制另一个耳朵 */
animation: dancingEar 1s linear infinite;
}
#app::after {
content: "";
position: absolute;
top: 51%;
left: 45%;
width: 13px; /* 同理,绘制一个眼 */
height: 4px;
transform: translate(-7px, -2px);
background-color: #7d9fdc;
border-radius: 9px;
box-shadow: 17px 0px 0 #7d9fdc, 6px 1px 0 15px #fff; /* 第一个参数复制一个眼睛,第二个参数放大15倍作为脸,改成白色*/
animation: dancingFace 1s linear infinite;
}
- 两个耳朵:在::before中,画一个圆角矩形,然后加上横向偏移复制一个
- 眼睛,脸:在::after中,绘制一个眼睛(淡蓝),然后 box-shodow 加上横向便宜复制一个,然后再复制一个脸但是需要放大改变颜色(变成白色),这里发现将原来的眼睛放大之后,纵向的比例失真了,不在是扁长的眼睛,变成现在有点园的脸了
animation
然后就是我们的动画了,让他左右摇摆。
animation: name duration timing-function delay iteration-count direction fill-mode play-state;
文档地址:
@keyframes dancingFace {
0% {
transform: translate(-7px, -2px);
}
20% {
transform: translate(-10px, 2px);
}
40% {
transform: translate(-7px, -2px);
}
60% {
transform: translate(-4px, 2px);
}
100% {
transform: translate(-7px, -2px);
}
}
通过对于耳朵和脸的动画的精确控制,达到统一运动的,按照“人”字形摇摆。
Hey! we go! 嗨起来。