- ベストアンサー
cssのanimationの設定の仕方
- CSSのanimationを使って背景画像とテキストを表示する際に、表示タイミングがずれる問題が発生しています。
- jQuery.BgSwitcherを使用し、背景画像をループさせていますが、animationの表示タイミングとずれてしまいます。
- animationの設定に問題がある可能性がありますので、解決方法を教えていただきたいです。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
10秒程度で1回流し切りの簡単なアニメーションならばCSS機能のみで問題なく再現可能ですが。5分以上の長時間や或いは今回の質問事例の様に、短い周期を何百回も繰り返す様な長周期ループアニメになると、CSSのみでは完全に制御する事は困難です。従ってそのアニメーションを表示させるwebページの該当箇所部分を、最初からCSSでは無く Javascript/jQuery によるスクリプト制御によって描画して連続的周期的に書き換える様な仕様にしなければ、無限ループさせた場合の複数表示タイミングの完全動機処理は不可能だと思われます。 簡単に解説しますと。CSSでアニメーションを行った場合、CSSファイル等に記述して指定したアニメ処理が記述された順番に上から解釈され、それが次々と連鎖的に処理されて行く事で人間の目にはあたかも連続的なアニメーションに見えます。しかしながら .textA{....} の様に括弧でくくられた中身はそれぞれ別途に解釈され処理されて行くため、どんなにそれが高速に処理されたとしてもAからBへ処理へ移行する瞬間に非常に僅かな「待ち時間」が発生します(1/1000秒の極僅かな時間です)。これは非常に短い "時差" なので数分程度ではズレは目立ちませんが、数百回数十分と続けば塵も積もれば何とやらで秒単位のズレとなって視認できるくらいの時差が発生して来ます。 これを回避し半永久的に時差やズレを生じさせないアニメーションを稼働させ続けるためには「タイミングチャート」を実装させ、それに合わせてそれぞれのアニメ処理を定期的にリセットさせ同期を取る必要があります。例文でCSS内に指定されたアニメーション処理の時間指定である animation-duration:25s; 等はプログラム内部ではそれに従って実行されますが、現実世界では必ず処理速度との僅かなズレが生じます。それは速過ぎる場合もあれば遅れる場合もあります。このズレは現代のPCや全てのプログラム、アプリケーションの基本的な仕組みなので回避する事は出来ません。 本当は全然違いますが、イメージして貰えれば分かり易いのは、この様な場合に .textA{....} の様に括弧でくくられた中身はそれぞれ単独で動くため、各自が各々に時間合わせてした腕時計を持っていると思ってください。そして .textA{} は1分が60秒の時計を見て動くのに、.textB{} は1分が59.98秒の別の時計に行動を合わせているみたいな感じです。こうして各処理が各自の時計に合わせて動くため、同じ「25s」と指示を出していても必ず時差が発生してズレて来るのです。そしてコレはプログラム上の仕様なので変える事は不可能です。 ですのでこれら複数処理を完全にタイミングを合わせるためには、各自の処理が1回終わった時点ですぐに2回目の処理に行かずに待機させ、遅れている他の処理が完全に終わるまで何もさせずに待たせます。そうして最後のランナーが完全にゴールへ到着した事を確認した後、改めてまた全員に同時にスタートする様に命令を出します。こうする事によって1秒以下のミクロン秒の世界ではバラバラになっていますが、実際の画面上では人間には感知出来ない極小時間なので見た目上は完全に同期している様に見せる事が可能になります。 P.S. 一口に「スクリプトで処理せよ」とは言いましたが…実際にはかなり大変なので、過去に似た様な処理を自作した経験が無いとすぐに実装させるのは難しいと思います。それでそのための初心者にも簡単にアニメ実装が可能なCSSなんですが、前述の通りそこまで完璧なアニメ処理は元から考慮されていないので、あくまでもちょっとした画面変化のお手伝いをするのが目的のCSSだとご理解ください。 まあ身も蓋もないですが、よほど作り込まれたストーリー性も有る様な凝ったアニメ変化をするwebページでも無い限り、普通はTOPページでもUserは1分も眺め続ける事はありませんので。5分以上放置して変になる程度でしたら、特に気にせずにこのままでも良いかと思います。或いは画像やテキストの中身を再検討し工夫して、例え時差やズレが生じたとしても違和感なく見える様な演出に変更するとかですかね。
お礼
本当に分かり易くご説明頂きました。仕様上のもんだいで、cssのみでは完全な同期を計れないのでjavascriptが必要なのですね。トップに軽く表現する程度なので言われてみればユーザーが長期間見ることもないと思いますのでcssのみで行こうと思います。ありがとうございました!