数値が急速に変化するときにアニメーション効果を取得したいと思います。例: http://jsbin.com/kevalutupe/1/
私はこのCSSを単独で実行したい(私はJSでそれをコーディングする方法を知っています)、DOMをハンマーで打つことは最良の解決策ではないと感じるので、JSを使用したくありません。これはCSSでまったく可能ですか?
私は実際に数字が正しく増加することに悩まされていません、私は効果の直後です。
CSS3アニメーションを使用すると、数字の回転効果が最も確実に可能になります。さらに、ほんの少しのJSを使用してエンドポイントを設定し、実際に機能全体を取得することもできます。
メソッドの説明:
div
は、高さと幅を1emに設定して常に1つの数値のみを表示するように作成されます。 div
のオーバーフローは非表示に設定され、1行だけが表示されます。div
内に、1から0までのすべての数値を含むspan
が作成され、親に対して相対的に配置されます。span
の初期位置は0pxまたは0emですが、animation
の間は、span
が上に移動したように見えるように上部位置が変更されます。 div
は一度に1つの数値しか表示できないため、回転効果(または他の数値が消える効果)が得られます。span
要素のそれぞれに固定上部位置を設定することによって達成されます。 0emは1行目が表示される(番号1)、-2emは3行目が表示される(番号3)という意味です。注:この方法を使用すると、スピンは毎回円全体を移動するように見え、問題の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
クラスをこのアニメーション効果の一部であるすべてのspan
要素に追加します。これは、ボタンをクリックしたときにのみアニメーションが発生するようにするためです。top
のspan
プロパティに乱数が設定されます。つまり、スパンごとに異なる数値が表示されます。animate
クラスを削除し、ボタンをもう一度クリックすると、アニメーションを最初からやり直すことができるようにします。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
は、9.9%まで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>