CSS动画:数字递增效果
CSS Animation: Number increment effect
我想在数字快速变化时获得那种动画效果,例如:http://jsbin.com/kevalutupe/1/
我想单独做这个 CSS(我知道如何用 JS 编写代码),我不想使用 JS,因为我觉得锤击 DOM 不是最好的解决方案。 CSS 这完全有可能吗?
我不在乎数字是否正确递增,我只是在追求效果。
使用 CSS3 动画绝对可以实现数字旋转效果,更好的是,您还可以使用少量 JS 设置终点并实际获得全部功能。
方法说明:
- 创建一个
div
,通过将其高度和宽度设置为 1em,它始终只显示一个数字。 div
的溢出设置为隐藏,以便只显示一行。
- 在此
div
中创建了一个包含从 1 到 0 的所有数字的 span
并相对于父级定位。
span
的初始位置是 0px 或 0em,但在 animation
期间顶部位置发生变化,因此 span
给人的印象是向上移动。因为div
一次只能显示一个数字,所以会产生旋转效果(或者其他数字消失的效果)。
- 最终位置是通过为每个
span
元素设置固定的顶部位置来实现的。 0em 表示第一行可见(编号 1),-2em 表示第三行可见(编号 3)等等。
- 增加或减少动画持续时间将使旋转效果发生得快或慢。动画迭代计数设置为 5 以产生微调器旋转多次的错觉。
注意:使用这种方法,旋转看起来每次都会绕一整圈,而不像有问题的 JSBin 示例,其中第一个数字为 3 到 4将只是一步而不是一个完整的圆圈。
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>
下面是一个JavaScript的示例,其中动画效果是通过CSS实现的,但是动画的触发和端点的设置是使用JavaScript实现的。
JS 代码几乎是不言自明的。我们正在做的是:
- 为按钮的点击事件创建一个侦听器,在其中我们将
animate
class 添加到属于此动画效果的所有 span
元素。这是因为我们希望动画仅在单击按钮时发生。
- 当动画结束(或旋转完成)时,我们将每个
span
的 top
属性 设置为某个随机数。这意味着每个跨度将显示不同的数字。
- 在动画结束时,我们还调用了另一个函数来删除
animate
class,这样当我们再次单击按钮时,动画可以重新开始。
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>
版本 2:(只有数字增量效果而不是旋转效果)
这是使用与前一个基本相同的代码创建的,但与前一个不同的是,animation
使从一个数字到另一个数字的移动是渐进的(从而产生旋转效果),这里动画使移动更像是从一个数字突然跳到另一个数字,从而只产生增量效果。
跳跃是通过保持top
位置相同直到它正好移动到下一个(也就是说,top
设置为0em
直到9.9% 的动画,但在 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>
我想在数字快速变化时获得那种动画效果,例如:http://jsbin.com/kevalutupe/1/
我想单独做这个 CSS(我知道如何用 JS 编写代码),我不想使用 JS,因为我觉得锤击 DOM 不是最好的解决方案。 CSS 这完全有可能吗?
我不在乎数字是否正确递增,我只是在追求效果。
使用 CSS3 动画绝对可以实现数字旋转效果,更好的是,您还可以使用少量 JS 设置终点并实际获得全部功能。
方法说明:
- 创建一个
div
,通过将其高度和宽度设置为 1em,它始终只显示一个数字。div
的溢出设置为隐藏,以便只显示一行。 - 在此
div
中创建了一个包含从 1 到 0 的所有数字的span
并相对于父级定位。 span
的初始位置是 0px 或 0em,但在animation
期间顶部位置发生变化,因此span
给人的印象是向上移动。因为div
一次只能显示一个数字,所以会产生旋转效果(或者其他数字消失的效果)。- 最终位置是通过为每个
span
元素设置固定的顶部位置来实现的。 0em 表示第一行可见(编号 1),-2em 表示第三行可见(编号 3)等等。 - 增加或减少动画持续时间将使旋转效果发生得快或慢。动画迭代计数设置为 5 以产生微调器旋转多次的错觉。
注意:使用这种方法,旋转看起来每次都会绕一整圈,而不像有问题的 JSBin 示例,其中第一个数字为 3 到 4将只是一步而不是一个完整的圆圈。
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>
下面是一个JavaScript的示例,其中动画效果是通过CSS实现的,但是动画的触发和端点的设置是使用JavaScript实现的。
JS 代码几乎是不言自明的。我们正在做的是:
- 为按钮的点击事件创建一个侦听器,在其中我们将
animate
class 添加到属于此动画效果的所有span
元素。这是因为我们希望动画仅在单击按钮时发生。 - 当动画结束(或旋转完成)时,我们将每个
span
的top
属性 设置为某个随机数。这意味着每个跨度将显示不同的数字。 - 在动画结束时,我们还调用了另一个函数来删除
animate
class,这样当我们再次单击按钮时,动画可以重新开始。
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>
版本 2:(只有数字增量效果而不是旋转效果)
这是使用与前一个基本相同的代码创建的,但与前一个不同的是,animation
使从一个数字到另一个数字的移动是渐进的(从而产生旋转效果),这里动画使移动更像是从一个数字突然跳到另一个数字,从而只产生增量效果。
跳跃是通过保持top
位置相同直到它正好移动到下一个(也就是说,top
设置为0em
直到9.9% 的动画,但在 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>