最近学到了一个css的小动画,在这里分享给你们。css
时下最火的网络游戏当属英雄联盟了,此次分享的就是游戏中技能CD倒计时的动画。 效果以下图所示html
看起来只有两种颜色,但HTML中可不止两个部分。下面是该动画的结构图。css3
看懂了这个结构图,大体的动画流程也就清晰了。git
为了完成这个结构,咱们须要四个部分。 因此在HTML中这样定义github
<div class="inner"><!--底部-->
<div id="cdTime"></div>
<div class="spiner"></div><!--旋转体-->
<div class="masker"></div><!--蒙版1-->
<div class="filler"></div><!--蒙版2-->
</div>
复制代码
1.inner
主要为背景颜色(技能图标),和技能框样式(能够方形,也能够圆形)。
2.spiner
用来实现浅色部分旋转(换句话说:减小深色部分)。
3.masker
左半圆形,固定在左边,动画后半段层级降低。
4.filler
右半圆形,固定在右边,动画后半段隐藏。bash
旋转动画以下:网络
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
复制代码
动画前半段层级最高,后半段降低:ide
@keyframes second-half-show {
0% { z-index: 3; }/*数值根据状况而定便可*/
50%,
100% { z-index: 0; }
}
复制代码
动画全半段显示,后半段隐藏:svg
@keyframes second-half-hide {
0% { opacity: 1; }
50%,
100% { opacity: 0; }
}
复制代码
inner
样式:wordpress
.inner {
position: relative;
width: 100px;
height: 100px;
margin: 200px auto 0 auto;
background-color: rgb(201, 202, 202);
border:solid 1px;
overflow: hidden;
border-radius: 5px;
}
复制代码
spiner
样式:
.spiner {
position: absolute;
z-index: 1;
top: -50px;
left: -50px;
width: 100px;
height: 200px;
transform-origin: right ;
animation: spin 10s infinite linear;
border-radius: 100px 0 0 100px;
background-color: rgb(201, 202, 202);
}
复制代码
masker
样式:
.masker {
position: absolute;
left: -50px;
top: -50px;
width: 100px;
height: 200px;
border-radius: 100px 0px 0 100px;
background-color: rgb(121, 121, 121);
animation: second-half-show 10s steps(1, end) infinite;
}
复制代码
filler
的样式与masker
之对称便可
由于动画中的两个蒙版的变化都是瞬间完成的,不能够有渐变过程。因此
animation
中设置steps(1,end)
表示1帧完成。不懂steps
的话能够参考animation中的steps()逐帧动画
(数字的样式很简单,我就省略了)
JS显示数字时间:
<script>
let CD = 10;
var cdTime = document.getElementById('cdTime');
cdTime.innerHTML = CD--;
setInterval(function () {
if (1 == CD) {
cdTime.innerHTML = CD;
let cdFloat = CD - 0.1;
const timeFloat = setInterval(function () {
cdTime.innerHTML = cdFloat.toFixed(1);
cdFloat -= 0.1;
if (cdFloat <= 0) {
clearInterval(timeFloat);
CD = 10;
}
}, 90)
} else {
cdTime.innerHTML = CD--;
}
}, 1000)
</script>
复制代码
最后的1秒中,为了防止两个
setInterval
冲突,我将时间调整为90ms一跳,错开了0.1s
嗯,就分享到这里吧~~~~
项目地址:CSS3-技能冷却样式
参考于张鑫旭:CSS3实现鸡蛋饼饼状图loading等待转转转