我想要实现数字快速变化时的动画效果,例如:http://jsbin.com/kevalutupe/1/
我希望只使用CSS来实现(虽然我知道如何在JS中编写它),因为我认为不断操作DOM并不是最好的解决方案。在CSS中是否可能实现这一点?
我并不关心数字是否正确递增,我只关心产生的效果。
我想要实现数字快速变化时的动画效果,例如:http://jsbin.com/kevalutupe/1/
我希望只使用CSS来实现(虽然我知道如何在JS中编写它),因为我认为不断操作DOM并不是最好的解决方案。在CSS中是否可能实现这一点?
我并不关心数字是否正确递增,我只关心产生的效果。
div {
width: 1em;
height: 1em;
overflow: hidden;
line-height: 1em;
display: inline-block;
}
span {
position: relative;
}
.animate {
-webkit-animation: spinit 0.2s 5;
-moz-animation: spinit 0.2s 5;
animation: spinit 0.2s 5;
}
@-webkit-keyframes spinit {
0% {
top: 0em;
}
50% {
top: -5em;
}
100% {
top: -9em;
}
}
@-moz-keyframes spinit {
0% {
top: 0em;
}
50% {
top: -5em;
}
100% {
top: -9em;
}
}
@keyframes spinit {
0% {
top: 0em;
}
50% {
top: -5em;
}
100% {
top: -9em;
}
}
/* Setting the required value to top will make the spinner end at that number */
#digit1 {
top: -4em;
/* -4em means 5 will be the number */
}
#digit2 {
top: -2em;
}
#digit3 {
top: 0em;
}
<div>
<span class="animate" id='digit1'>1 2 3 4 5 6 7 8 9 0</span>
</div>
<div>
<span class="animate" id='digit2'>1 2 3 4 5 6 7 8 9 0</span>
</div>
<div>
<span class="animate" id='digit3'>1 2 3 4 5 6 7 8 9 0</span>
</div>
window.onload = function() {
var spinner = document.getElementById('spinner');
spinner.onclick = spinit;
var el = document.querySelectorAll("span[id*=digit]");
for (i = 0; i < el.length; i++) {
el[i].addEventListener("animationend", randomize, false);
el[i].addEventListener("webkitAnimationEnd", randomize, false);
el[i].addEventListener("oanimationend", randomize, false);
el[i].addEventListener("MSAnimationEnd", randomize, false);
}
}
function randomize() {
var rand = Math.floor(Math.random() * 9);
this.style.top = -1 * rand + "em";
this.classList.toggle('animate');
}
function spinit() {
var el = document.querySelectorAll("span[id*=digit]");
for (i = 0; i < el.length; i++) {
el[i].classList.toggle('animate');
}
}
div {
width: 1em;
height: 1em;
overflow: hidden;
line-height: 1em;
display: inline-block;
}
span {
position: relative;
}
.animate {
-webkit-animation: spinit 0.2s 5;
-moz-animation: spinit 0.2s 5;
animation: spinit 0.2s 5;
}
@-webkit-keyframes spinit {
0% {
top: 0em;
}
50% {
top: -5em;
}
100% {
top: -9em;
}
}
@-moz-keyframes spinit {
0% {
top: 0em;
}
50% {
top: -5em;
}
100% {
top: -9em;
}
}
@keyframes spinit {
0% {
top: 0em;
}
50% {
top: -5em;
}
100% {
top: -9em;
}
}
/* Set the value according to the on-load position of the spinner */
#digit1 {
top: -4em;
/* -4em means 5 will be the number */
}
#digit2 {
top: -2em;
}
#digit3 {
top: 0em;
}
<div>
<span id='digit1'>1 2 3 4 5 6 7 8 9 0</span>
</div>
<div>
<span id='digit2'>1 2 3 4 5 6 7 8 9 0</span>
</div>
<div>
<span id='digit3'>1 2 3 4 5 6 7 8 9 0</span>
</div>
<button id='spinner'>Spin It</button>
第二版: (只有数字增加效果,没有旋转效果)
这个版本的代码基本上与之前的代码相同,但不同的是,之前的animation
让数字从一个数值渐变到另一个数值(从而产生旋转效果),而这里的动画使数字更像是突然跳跃到另一个数字,因此只产生了一个增量效果。
跳跃的效果是通过保持top
位置不变直到到了下一个数字的时间(也就是说,在动画的前9.9%,top
被设置为0em
,但在10%时突然改变为-1em
)来实现的。
window.onload = function() {
var spinner = document.getElementById('spinner');
spinner.onclick = spinit;
var el = document.querySelectorAll("span[id*=digit]");
for (i = 0; i < el.length; i++) {
el[i].addEventListener("animationend", randomize, false);
el[i].addEventListener("webkitAnimationEnd", randomize, false);
el[i].addEventListener("oanimationend", randomize, false);
el[i].addEventListener("MSAnimationEnd", randomize, false);
}
}
function randomize() {
var rand = Math.floor(Math.random() * 9);
this.style.top = -1 * rand + "em";
this.classList.toggle('animate');
}
function spinit() {
var el = document.querySelectorAll("span[id*=digit]");
for (i = 0; i < el.length; i++) {
el[i].classList.toggle('animate');
}
}
div {
width: 1em;
height: 1em;
overflow: hidden;
line-height: 1em;
display: inline-block;
}
span {
position: relative;
}
.animate {
-webkit-animation: spinit 0.2s 5;
-moz-animation: spinit 0.2s 5;
animation: spinit 0.2s 5;
}
@-webkit-keyframes spinit {
0% { top: 0em; }
9.9% { top: 0em; }
10%{ top: -1em; }
19.9%{ top: -1em; }
20%{ top: -2em; }
29.9%{ top: -2em; }
30%{ top: -3em; }
39.9%{ top: -3em; }
40%{ top: -4em; }
49.9%{ top: -4em; }
50% { top: -5em; }
59.9%{ top: -5em; }
60%{ top: -6em; }
69.9%{ top: -6em; }
70%{ top: -7em; }
79.9%{ top: -7em; }
80%{ top: -8em; }
89.9%{ top: -8em; }
90%{ top: -9em; }
99.9%{ top: -9em; }
100% { top: -9em; }
}
@-moz-keyframes spinit {
0% { top: 0em; }
9.9% { top: 0em; }
10%{ top: -1em; }
19.9%{ top: -1em; }
20%{ top: -2em; }
29.9%{ top: -2em; }
30%{ top: -3em; }
39.9%{ top: -3em; }
40%{ top: -4em; }
49.9%{ top: -4em; }
50% { top: -5em; }
59.9%{ top: -5em; }
60%{ top: -6em; }
69.9%{ top: -6em; }
70%{ top: -7em; }
79.9%{ top: -7em; }
80%{ top: -8em; }
89.9%{ top: -8em; }
90%{ top: -9em; }
99.9%{ top: -9em; }
100% { top: -9em; }
}
@keyframes spinit {
0% { top: 0em; }
9.9% { top: 0em; }
10%{ top: -1em; }
19.9%{ top: -1em; }
20%{ top: -2em; }
29.9%{ top: -2em; }
30%{ top: -3em; }
39.9%{ top: -3em; }
40%{ top: -4em; }
49.9%{ top: -4em; }
50% { top: -5em; }
59.9%{ top: -5em; }
60%{ top: -6em; }
69.9%{ top: -6em; }
70%{ top: -7em; }
79.9%{ top: -7em; }
80%{ top: -8em; }
89.9%{ top: -8em; }
90%{ top: -9em; }
99.9%{ top: -9em; }
100% { top: -9em; }
}
/* Set the value according to the on-load position of the spinner */
#digit1 {
top: -4em;
/* -4em means 5 will be the number */
}
#digit2 {
top: -2em;
}
#digit3 {
top: 0em;
}
<div>
<span id='digit1'>1 2 3 4 5 6 7 8 9 0</span>
</div>
<div>
<span id='digit2'>1 2 3 4 5 6 7 8 9 0</span>
</div>
<div>
<span id='digit3'>1 2 3 4 5 6 7 8 9 0</span>
</div>
<button id='spinner'>Spin It</button>