From 20643f6bb70a52f1ffe6627348c60cd882d0eefd Mon Sep 17 00:00:00 2001 From: Masahiro FUJIMOTO Date: Tue, 14 Dec 2021 01:14:25 +0900 Subject: 2021/08/13 時点の英語版に同期 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- files/ja/web/css/css_animations/tips/index.md | 125 +++++++++++++------------- 1 file changed, 65 insertions(+), 60 deletions(-) (limited to 'files/ja') diff --git a/files/ja/web/css/css_animations/tips/index.md b/files/ja/web/css/css_animations/tips/index.md index 4d2fa03e26..a9154a60ee 100644 --- a/files/ja/web/css/css_animations/tips/index.md +++ b/files/ja/web/css/css_animations/tips/index.md @@ -3,37 +3,39 @@ title: CSS アニメーションのヒントとコツ slug: Web/CSS/CSS_Animations/Tips tags: - CSS - - CSS Animations - - Example - - Guide - - Reference + - CSS アニメーション + - 例 + - ガイド + - リファレンス translation_of: Web/CSS/CSS_Animations/Tips --- -
{{cssref}}
+{{CSSRef}} -

CSS アニメーションはドキュメントとアプリを構成する要素を使って驚くべき事を行うことを可能にします。 しかしながら、行いたくても理解しやすくないことがあったり、すぐに思いつかないであろう巧妙な方法があります。 この記事は停止したアニメーションをどのように再び実行するのかを含む、あなたの仕事を楽にするかもしれない私達が見つけた秘訣やトリックを集めたものになります。

+CSS アニメーションを使えば、文書やアプリを構成する要素に、驚くようなことができるようになります。しかし、当たり前のようで当たり前でないことや、すぐには思いつかないような賢い方法があるかもしれません。この記事では、止まってしまったアニメーションを再び動かす方法など、作業を楽にするために見つけたヒントをまとめています。 -

再度アニメーションを実行する

+## 再度アニメーションを実行する -

CSS アニメーションの仕様書では再度アニメーションを実行する方法を提示していません。 要素に魔法の関数 resetAnimation() というものはなく、要素の {{cssxref("animation-play-state")}} を再び "running" に設定することさえもできません。その代わりに、停止したアニメーションをリプレイするための巧妙なトリックを使う必要があります。

+[CSS アニメーション](/ja/docs/Web/CSS/CSS_Animations)の仕様書では再度アニメーションを実行する方法を提示していません。 要素に魔法の関数 `resetAnimation()` というものはなく、要素の {{cssxref("animation-play-state")}} を再び `"running"` に設定することさえもできません。その代わりに、停止したアニメーションをリプレイするための巧妙なトリックを使う必要があります。 -

ここでの私達が考える停止したアニメーションのリプレイを行う方法はあなたに提案することに対して十分に信頼、安定しています。

+ここでは、私たちが安定していて信頼性があると感じている方法をご紹介します。 -

HTML の内容

+### HTML の内容 -

はじめに、HTML にアニメーションしてほしい {{HTMLElement("div")}} と、アニメーションを再生(またはリプレイ)するためのボタンを定義しましょう。

+はじめに、HTML にアニメーションしてほしい {{HTMLElement("div")}} と、アニメーションを再生 (またはリプレイ) するためのボタンを定義しましょう。 -
<div class="box">
-</div>
+```html
+
+
-<div class="runButton">Click me to run the animation</div>
+
Click me to run the animation
+``` -

CSS の内容

+### CSS の内容 -

次に CSS を使ってアニメーションそのものを定義しましょう。 簡潔さのためにいくつかの重要ではない CSS (”Run” ボタンそのもののスタイル) はここではお見せしません。

+次に CSS を使ってアニメーションそのものを定義しましょう。 簡潔さのためにいくつかの重要ではない CSS ("Run" ボタンそのもののスタイル) はここではお見せしません。 - +} +``` -
@keyframes colorchange {
+```css
+@keyframes colorchange {
   0% { background: yellow }
   100% { background: blue }
 }
@@ -61,55 +64,57 @@ translation_of: Web/CSS/CSS_Animations/Tips
 
 .changing {
   animation: colorchange 2s;
-}
+} +``` -

ここに2つのクラスがあります。 ”box” クラスはアニメーション情報を含まない box の外見の基本的な記述です。 アニメーションの詳細は ”changing” クラスに含まれており、その中で ”colorchange” と名付けられた {{cssxref("@keyframes")}} は box をアニメーションするために2秒間を使うべきだと書いてあります。

+ここに 2 つのクラスがあります。 `"box"` ボックスの外観に関する基本的な記述で、アニメーションの情報は含まれていません。アニメーションの詳細は `"changing"` クラスに含まれており、その中で `"colorchange"` と名付けられた {{cssxref("@keyframes")}} という名前の `"colorchange"` が 2 秒間に渡ってボックスをアニメーションさせるために使用されるべきであることを述べています。 -

このため、box は所定の位置でアニメーション効果を開始しないので、アニメーションすることはないでしょう。

+このため、ボックスは所定の位置でアニメーション効果を開始しないので、アニメーションすることはないでしょう。 -

JavaScript の内容

+### JavaScript の内容 -

次にアニメーションを行うための JavaScript を見ていきます。 このテクニックの内容は play() 関数にあり、ユーザーが "Run" ボタンをクリックした時に呼ばれます。

+次にアニメーションを行うための JavaScript を見ていきます。 このテクニックの内容は `play()` 関数にあり、ユーザーが "Run" ボタンをクリックした時に呼ばれます。 -
function play() {
+```js
+function play() {
   document.querySelector(".box").className = "box";
   window.requestAnimationFrame(function(time) {
     window.requestAnimationFrame(function(time) {
       document.querySelector(".box").className = "box changing";
     });
   });
-}
+} +``` -

これは奇妙に見受けられるでしょうか? 再度アニメーションを実行する唯一の方法はアニメーション効果を取り除くことであるため、あなたが行いたいことをドキュメントに知らせてあげて、ドキュメントにスタイルの再計算させてあげましょう。 その時要素に戻るためのアニメーション効果を追加します。 それを実現するためには、私達は創造的でなければなりません。

+これは奇妙だと思いませんか?なぜなら、アニメーションを再び再生する唯一の方法は、アニメーション効果を削除し、それを認識するために文書がスタイルを再計算してから、アニメーション効果を要素に追加することだからです。これを実現するには、工夫が必要です。 -

play() 関数が呼び出された時に起きることは以下のものです。

+`play()` 関数が呼び出された時に起きることは次の通りです。 -
    -
  1. box の CSS クラスのリストを単純な "box" にリセットします。 これは、その box に現在適用されている他のどのクラスを取り除く効果を持ちます。 これにはアニメーションを扱う "changing" クラスが含まれます。 言い換えると、box からアニメーション効果を取り除きます。 しかしながら、クラスのリストを変更することはそのスタイルの再計算が完了するまで効果を持たず、更新はその変更を反映するために発生し続けます。
  2. -
  3. スタイルが確実に再計算されるように、{{domxref("window.requestAnimationFrame()")}} を使用し、コールバックを指定します。 コールバックは次のドキュメントの再描画の前に適切に実行されます。 問題はそのコールバックの呼び出しが再描画の前であるゆえに、スタイルの再計算はまだ実際に起きてはいないのです。
  4. -
  5. コールバックは巧妙でもう一度 requestAnimationFrame() を呼びます! 今回は、スタイルの再計算が行われた後の次の再描画の前に、コールバックが実行されます。 このコールバックは box クラスの後ろに "changing" クラスを追加し、そのためクラスを追加したことによる再描画はもう一度要素のアニメーションを始めることでしょう。
  6. -
+1. box の CSS クラスのリストを単純な `"box"` にリセットします。 これは、その box に現在適用されている他のどのクラスを取り除く効果を持ちます。 これにはアニメーションを扱う `"changing"` クラスが含まれます。 言い換えると、ボックスからアニメーション効果を取り除きます。 しかし、クラスのリストを変更することはそのスタイルの再計算が完了するまで効果を持たず、更新はその変更を反映するために発生し続けます。 +2. スタイルが確実に再計算されるように、{{domxref("window.requestAnimationFrame()")}} を使用し、コールバックを指定します。このコールバックは、文書の次の再描画の直前に実行されます。問題は、再描画の前なので、スタイルの再計算がまだ行われていないということです。 +3. このコールバックは、巧妙に `requestAnimationFrame()` を 2 回目に呼び出しています。今回のコールバックは、スタイルの再計算が行われた後の、次の再描画の前に実行されます。このコールバックは、ボックスに `"changing"` クラスを追加し、再描画で再びアニメーションを開始するようにしています。 -

もちろん、実際に動作するために "Run" ボタンにイベントハンドラーを追加することは必要です。

+もちろん、実際に動作するために "Run" ボタンにイベントハンドラーを追加する必要があります。 -
document.querySelector(".runButton").addEventListener("click", play, false);
+```js +document.querySelector(".runButton").addEventListener("click", play, false); +``` -

結果

+### 結果 -

{{ EmbedLiveSample('Run_an_animation_again', 320, 160) }}

+{{ EmbedLiveSample('Run_an_animation_again', 320, 160) }} -

アニメーションの停止

+## アニメーションの停止 -

単純に、要素に適用した {{cssxref("animation-name")}} を取り除くことはそれの次の状態にジャンプまたは割り込ませます。 代わりに、アニメーションを完了して停止する場合は、別のアプローチを試す必要があります。 主要なトリックは次のものです。

+要素に適用されている {{cssxref("animation-name")}} を削除すると、その要素は次の状態にジャンプまたはカットします。しかし、アニメーションを完了させてから停止させたい場合は、別の方法を取らなければなりません。主なトリックは以下の通りです。 -
    -
  1. 可能なら自身を含めるようアニメーションさせること。 これは animation-direction: alternate を信頼するべきではないことを意味します。 代わりに一回の繰り返しの中で完全なアニメーションを経過するキーフレームアニメーションを明示的に書くべきです。
  2. -
  3. JavaScript を使用し、animationiteration イベントが発生した時に使われるアニメーションをクリアーすること。
  4. -
+1. 可能なら自身を含めるようアニメーションさせること。 これは `animation-direction: alternate` を信頼するべきではないことを意味します。 代わりに一回の繰り返しの中で完全なアニメーションを経過するキーフレームアニメーションを明示的に書くべきです。 +2. JavaScript を使用し、`animationiteration` イベントが発生した時に使われるアニメーションをクリアーすること。 -

次のデモは前述の JavaScript テクニックをどのように利用するかを示します。

+次のデモは前述の JavaScript テクニックをどのように利用するかを示します。 -
.slidein {
+```css
+.slidein {
   animation-duration: 5s;
   animation-name: slidein;
   animation-iteration-count: infinite;
@@ -130,27 +135,27 @@ translation_of: Web/CSS/CSS_Animations/Tips
     margin-left: 0%;
   }
 }
-
+``` -
<h1 id="watchme">Click me to stop</h1>
-
+```html +

Click me to stop

+``` -
let watchme = document.getElementById('watchme')
+```js
+let watchme = document.getElementById('watchme')
 
 watchme.className = 'slidein'
-const listener = (e) => {
+const listener = (e) => {
   watchme.className = 'slidein stopped'
 }
-watchme.addEventListener('click', () =>
+watchme.addEventListener('click', () =>
   watchme.addEventListener('animationiteration', listener, false)
 )
-
+``` -

デモ https://jsfiddle.net/morenoh149/5ty5a4oy/

+デモ -

関連項目

+## 関連情報 - +- [CSS トランジションの使用](/ja/docs/Web/CSS/CSS_Transitions/Using_CSS_transitions) +- {{domxref("Window.requestAnimationFrame()")}} -- cgit v1.2.3-54-g00ecf