cssのanimationとBgSwitcherとのずれについて

okwaveにて質問してみた。

 

Animationの表示タイミングが合わないので教えてください。

今回初めてcssのanimationを使ってみました。
同時に、jQuery.BgSwitcher を使って背景画像5枚を5秒間づつ表示させてループさせています。(合計25秒間)そして、cssのanimation でテキストA,B,Cの3枚を25秒間表示させています。
表示タイミングは
【背景画像1を表示 テキストAを表示 テキストBを非表示 テキストCを非表示】
【背景画像2を表示 テキストAを非表示 テキストBを非表示 テキストCを非表示】
【背景画像3を表示 テキストAを非表示 テキストBを表示 テキストCを非表示】
【背景画像4を表示 テキストAを非表示 テキストBを非表示 テキストCを非表示】
【背景画像5を表示 テキストAを非表示 テキストBを非表示 テキストCを表示】

背景画像で使用しているjQuery.BgSwitcherの表示時間は1枚5秒です。5枚ですので25秒でループです。animationが適応されているテキストA,B,Cの animation-duration: 25s; にしています。
テキスト画像A,B,Cは表示されるタイミングではopacity:1 にしてそれ以外はopacity:0で非表示にして背景画像1,2,3とテキストA,B,Cとの表示タイミングが合わせたいです。
初めはタイミングよく背景画像とテキスト画像が表示されているのですが徐々に表示タイミングずれてしまい5分ぐらいするとanimationのテキストA,B,Cの表示タイミングが背景画像と大きくずれ、例えばテキストAが背景画像5で表示されるようになってしまいます。
jQuery.BgSwitcherでの背景画像5枚の1ループの時間は25秒。animationのテキストA,B,Cのanimation-duration: 25s; なのですが、徐々にずれてしまいます。
animation側の設定に問題があるかもしれませんので教えていただけないでしょうか?
現在のテストサイトは下記です。
http://cm-creation.net/yoshida/text-anime-test/index13.html

どうぞよろしくお願いいたします。Cssとhtml設定は下記です。

■cssの設定
.bg-slider {
width: 99.1vw;
height: 100vh;
background-position:center center;
background-size: cover;
display: flex;
justify-content: center;
position: relative;
}

.textA {
position: absolute;
  top: 5%;
   left:20%;
animation-name:animation1;
animation-duration:25s;
animation-timing-function: ease-in-out;
animation-delay: 0s;
   opacity: 0;
   animation-iteration-count: infinite;
animation-direction: normal;
animation-fill-mode: forwards;
}

.textB {
position: absolute;
top: 5%;
   right:20%;
animation-name:animation2;
animation-duration:25s;
animation-timing-function: ease-in-out;
animation-delay: 0s;
  opacity: 0;
  animation-iteration-count: infinite;
animation-direction: normal;
animation-fill-mode: forwards;
}

.textC {
position: absolute;
top: 5%;
animation-name:animation3;
animation-duration: 25s;
animation-timing-function: ease-in-out;
animation-delay: 0s;
    opacity: 0;
   animation-iteration-count: infinite;
animation-direction: normal;
animation-fill-mode: forwards;
}

@keyframes animation1 {
0% {
opacity: 0;
transform: translate3d(0, 30px, 0);
  }
5% {
opacity: 1;
transform: translate3d(0, 0, 0);
   }
26% {
opacity: 0;
transform: translate3d(0, 0, 0);
}
100% {
opacity: 0;
transform: translate3d(0, 0, 0);
}
}

@keyframes animation2 {
0% {
opacity: 0;
transform: translate3d(0, 0px, 0);
}
41% {
opacity: 0;
transform: translate3d(0, 30px, 0);
}
 45% {
opacity: 1;
transform: translate3d(0, 0, 0);
}
66% {
opacity: 0;
transform: translate3d(0, 0px, 0);
}
100% {
opacity: 0;
transform: translate3d(0, 0, 0);
}
}

@keyframes animation3 {
0% {
opacity: 0;
transform: translate3d(0, 0px, 0);
}
  81% {
opacity: 0;
transform: translate3d(0, 30px, 0);
}
85% {
opacity: 1;
transform: translate3d(0, 0, 0);
}
  101% {
opacity: 0;
transform: translate3d(0, 0px, 0);
}
 102% {
opacity: 0;
transform: translate3d(0, 0, 0);
}
}

■html
<script>
jQuery(function($) {
$(‘.bg-slider’).bgSwitcher({
images: image/main10.jpg’,’image/main11.jpg’,’image/main12.jpg’,’image/main13.jpg’,’image/main14.jpg’], // 切り替える背景画像を指定
interval: 5000, // 背景画像を切り替える間隔を指定 5000=5秒
loop: true, //
shuffle: false, //
effect: “fade”, // エフェクトの種類をfade,blind,clip,slide,drop,hideから指定
duration: 500, // エフェクトの時間を指定します。
easing: “swing” // エフェクトのイージングをlinear,swingから指定
});
});
</script>

<div class=”container-fluid px-0 bg-slider ” >
<div class=”textA”><img src=”image/item8.png” class=”img-fluid” alt=””/></div>
<div class=”textB”><img src=”image/item9.png” class=”img-fluid” alt=””/></div>
<div class=”textC”><img src=”image/item10.png” class=”img-fluid” alt=””/></div>
</div>

 
 

解答

 
 
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分以上放置して変になる程度でしたら、特に気にせずにこのままでも良いかと思います。或いは画像やテキストの中身を再検討し工夫して、例え時差やズレが生じたとしても違和感なく見える様な演出に変更するとかですかね。

 

 

茶谷さんにアニメーションについて質問したときに帰ってきた答えにjavascriptがわからないと出来ないですよって言っていたのはこの事なんだね。

 

茶谷様

お世話になります。> チャンスメーカーの吉田です。 ウェブの作成に関してヒントを頂ければと願い、ご連絡いたしました。 お忙しいところ誠に恐縮なのですが少しアドバイスを頂けたらたすかります。 現在下記テストサイトでページ上部でスライドショーを使っているのですが、http://cm-creation.net/yoshida/new-chance/

フクロウのスライド画像とテキスト部分の(未来への創造 未来への好奇心 未来への探求)をそれぞれ一枚の画像として作りそれをスライドショーで

表示させています。

フクロウの画像はスライドショーで回すとして、本来はテキスト部分とスライド用のフクロウの背景画像を一枚の画像化してで作るのではなく、 スライドの表示タイミングに合わせて任意の位置にテキスト部分を表示させたいと思っています。

例えば 背景画像Aが表示されているタイミングで テキストAを左側に表示

 背景画像Bが表示されているタイミングで テキストAは消えてテキストBを右側に表示

 背景画像はループしますので、テキストも同タイミングでループ表示

そしてこれらのテキストの位置はスマホなどにした場合見切れることなく表示させるためにレスポンシブにしたい

イメージとしてはブラウニー様が作られました 富山ビューティーカレッジの上部に実装している感じです。

https://toyama-bc.ac.jp/

JQueryなどで同等の事ができたらと思うのですが、私はJavascriptが全然わからないために上記のようなことが可能な基本を紹介している

サイトの心当たりありますでしょうか?できればコピペしたらそのような動きを理解できたり実装可能な初心者にもわかるサイトが望ましいのですが

 ご存知でしょうか?

 

茶谷さんからの解答

ご連絡いただきました件ですが、CSSとJavascriptで実装しておりますので、

ある程度の知識がないと難しいかと思われます。

オリジナルで作っておりますので、参考になるサイトもちょっと分からないですね。。

 

お力になれずすみませんが、よろしくお願いいたします。

bgSwitherにcssアニメーション

テキストアニメーション/text-anime-test/index11.html   
css/common3.css

 

※自社のトップページでも動いているが
keyframesの名前とanimation-nameの名前はトップページ用として別の名前をつけた。

 

CSS

.bg-slider {
width: 99.1vw;

height: 100vh;
background-position:center center;

background-size: cover;
display: flex;
/*align-items:flex-end;*/ 
justify-content: center;
position: relative;
}

 

アニメーションの位置
背景要素をrelativeにして アニメーションの位置はabsoluteにしてtopやleftの%で位置を設定

/****************************************
アニメーション スクロール
/***************************************/

.text01 {
position: absolute;
top: 5%;
left:20%;

animation-name:animation1;
animation-duration:25s;
animation-timing-function: ease-in-out;
animation-delay: 0s;
opacity: 0;
animation-iteration-count: infinite;
animation-direction: normal;
animation-fill-mode: forwards;

}

.text02 {
position: absolute;
top: 5%;
right:20%;

animation-name:animation2;
animation-duration:25s;
animation-timing-function: ease-in-out;
animation-delay: 0s;
opacity: 0;
animation-iteration-count: infinite;
animation-direction: normal;
animation-fill-mode: forwards;

}

.text03 {
position: absolute;
top: 5%;

animation-name:animation3;
animation-duration: 25s;
animation-timing-function: ease-in-out;
animation-delay: 0s;
opacity: 0;
animation-iteration-count: infinite;
animation-direction: normal;
animation-fill-mode: forwards;

}

1枚5秒の背景画像を5枚= 5 x 5 = 25秒
25秒が100%として 5枚で割ると 100÷5=20% が1枚の長さのMAXパーセンテージ
1枚目、3枚目、5枚目にアニメーションをつけるために 20%づつ加算。
opacityで非表示から表示部分をプラスでパーセント別途追加。
各アニメーションは25秒の中で何パーセントで表示され、非表示させるかで調整。
ループさせる。

でも%は実際にタイミングがちょっと違うので見ながら微調整した。

 

@keyframes animation1 {
0% {
opacity: 0;
transform: translate3d(0, 30px, 0);
}

5% {
opacity: 1;
transform: translate3d(0, 0, 0);
}

26% {
opacity: 0;
transform: translate3d(0, 0, 0);
}

100% {
opacity: 0;
transform: translate3d(0, 0, 0);
}
}

@keyframes animation2 {
0% {
opacity: 0;
transform: translate3d(0, 0px, 0);
}

41% {
opacity: 0;
transform: translate3d(0, 30px, 0);
}

45% {
opacity: 1;
transform: translate3d(0, 0, 0);
}

66% {
opacity: 0;
transform: translate3d(0, 0px, 0);
}

100% {
opacity: 0;
transform: translate3d(0, 0, 0);
}
}

@keyframes animation3 {
0% {
opacity: 0;
transform: translate3d(0, 0px, 0);
}

81% {
opacity: 0;
transform: translate3d(0, 30px, 0);
}

85% {
opacity: 1;
transform: translate3d(0, 0, 0);
}

101% {
opacity: 0;
transform: translate3d(0, 0px, 0);
}

102% {
opacity: 0;
transform: translate3d(0, 0, 0);
}
}

 

スマホなどの調整として

/*****TOP スマホ縦****/

@media (max-width: 479px){

.bg-slider {
width: 100%;
height: 60vh;
background-position:center center;
background-size: cover;
display: flex;
/*align-items: flex-end; */
justify-content: space-evenly;
}

 

.text01 img{
height: 150px;
width: auto;
}

.text02 img{
height: 150px;
width: auto;
}

.text03 img{
height: 150px;
width: auto;
}

}

 

 

html

 

<script src=”js/jquery-1.11.3.min.js”></script>

<script src=”js/jquery.bgswitcher.js”></script>

<script>
jQuery(function($) {
$(‘.bg-slider’).bgSwitcher({
images: [‘image/top/main1.jpg’,’image/top/main2.jpg’,’image/top/main4.jpg’,’image/top/main5.jpg’,’image/top/main6.jpg’], // 切り替える背景画像を指定
interval: 5000, // 背景画像を切り替える間隔を指定 3000=3秒
loop: true, // 切り替えを繰り返すか指定 true=繰り返す false=繰り返さない
shuffle: false, // 背景画像の順番をシャッフルするか指定 true=する false=しない
effect: “fade”, // エフェクトの種類をfade,blind,clip,slide,drop,hideから指定
duration: 500, // エフェクトの時間を指定します。
easing: “swing” // エフェクトのイージングをlinear,swingから指定
});
});
</script>

 

<div class=”container-fluid px-0 bg-slider ” >

<div class=”text01“><img src=”image/item5.png” class=”img-fluid” alt=””/></div>

<div class=”text02“><img src=”image/item6.png” class=”img-fluid” alt=””/></div>

<div class=”text03“><img src=”image/item7.png” class=”img-fluid” alt=””/></div>

 

</div>

bgSwitcher の中に縦横中央でテキストアニメーションを複数行入れる方法

work/riaruta/index.html

 

https://www.granfairs.com/blog/staff/centering-by-css

html

<!–テキストアニメーション–>
<script type=”text/javascript” src=”js/jquery-1.11.3.min.js”></script>
<script type=”text/javascript” src=”js/jquery.transit.js”></script>
<script type=”text/javascript” src=”js/jquery.textFx.js”></script>
<script type=”text/javascript” src=”js/animeText.js”></script>

↑のJSはheader内だと何かとコンフリクトおこすので、bodyの該当要素の直前に入れた。

<!–キービジュアル–>
<div class=”container-fluid px-0 bg-slider” >
<div class=”outer”>
<div class=”inner-text1″>介護分野に自信があります。</div>
<div class=”inner-text2″>私たちは、慢性的な人材不足を解決するため複数カ国から人材受入を行う</div>
<div class=”inner-text2″>介護分野に特化した支援機関です。</div>
</div>
</div>

 

CSS

.bg-slider {
width: 99.1vw;
height: 95vh;
background-position:center center;
background-size: cover;
/*display: flex;*/ コメントアウト
align-items:center;
justify-content: center;

position: relative;
}

 

.outer {
/*display: flex;*/
/* position: relative;*/
width:100%;
position: absolute;
top: 50%;
left: 50%;
-webkit-transform: translateY(-50%) translateX(-50%);
transform: translateY(-50%) translateX(-50%);
align-items: center;
justify-content: center;
}

.inner-text1 {
width:100%;
text-align: center;
font-size:400%;
font-family: “Sawarabi Mincho”;
margin-bottom: 20px;
text-shadow: 1px 2px 8px #ffffff;
}

.inner-text2 {
text-align: center;
font-size:180%;
font-family: “Sawarabi Mincho”;
margin-bottom: 20px;
text-shadow: 1px 2px 8px #ffffff;
}

 

 

アニメーション用外部のJS

$(function() {
$(‘.test1’).textFx({
type: ‘fadeIn’,
iChar: 40,
iAnim: ‘3500’
});
});

$(function() {
$(‘.inner-text2’).textFx({
type: ‘slideIn’,
iChar: 20,
iAnim: ‘1000’,
direction: ‘top’
});
});

$(function() {
$(‘.inner-text1’).textFx({
type: ‘rotate’,
iChar: 80,
iAnim: ‘4000’
});
});

 

キワ化学工業

グランドナビをアニメーション付きのドロップダウンと、スマホは階層付きのハンバーガーメニューにしなたいと要望。

 

ナビについて

スマホからPCの階層付きナビとして 

http://cm-creation.net/yoshida/localwork/?p=3728

を使えると思ってためしたのだが、padの横やPCなどで、liの項目数がたくさんあると多分css側でなってしまっているとおもうがナビ項目の文字がおりかえされてしまう。どうやっても解決できない。しかたないので上記の方法はバーガーメニューを表示させたいスマホからpad縦までとして実装する。

pcからpad縦については別のドロップダウンだけのナビとして実装。
http://cm-creation.net/yoshida/localwork/?p=3725

liの幅はクラスを別途つけてpxで調節。

 

全画面背景画像 スライド

メイン背景画像にjQuery.BgSwitcher を使って表示させようとしたら、ローカルでは全部の画像が表示されるがサーバーでは画像が何枚か表示されない?コンフリクト?って思ったが、画像名の拡張子と画像名が間違っていただけだった。(

※スライドが何枚か表示されないようなことが起こったら、画像の名前や拡張子がコピペでちがっていたり、画像名が違っていることを疑うこと

背景画像をスライドショーやフェードで切り替える jQuery.BgSwitcher

https://fit-jp.com/bgswitcher/

desktop/webコンテンツツール/jquery/jquery.bgswitcher.js

 

ダウンロード

jQuery.BgSwitcherのサイトからjquery.bgswitcher.jsをダウンロードすることができます。

使い方(デフォルト設定)

html
  1. <div class=“bg-slider”>
  2. <h1 class=“bg-slider__title”>BGSWITCHER DEMO PAGE</h1>
  3. </div>
css
  1. .bgslider {
  2. width: 100vw;
  3. height: 100vh;
  4. backgroundposition:center center;
  5. backgroundsize: cover;
  6. display: flex;
  7. alignitems: center;
  8. justifycontent: center;
  9. }
  10. .bgslider__title{
  11. color: #fff;
  12. fontsize: 48px;
  13. lineheight: 1.5;
  14. fontweight: bold;
  15. textalign:center;
  16. textshadow: 1px 1px 1px #000;
  17. }
js
  1. <script src=“//ajax.googleapis.com/ajax/libs/jquery/3.0.0/jquery.min.js”></script>
  2. <script src=“js/jquery.bgswitcher.js”></script>
  3. <script>
  4. jQuery(function($) {
  5. $(‘.bg-slider’).bgSwitcher({
  6. images: [‘img/bg1.jpg’,‘img/bg2.jpg’,‘img/bg3.jpg’], // 切り替える背景画像を指定
  7. });
  8. });
  9. </script>

上記のようにjQuery本体(上記の例ではGoogleのCDNを利用しています)とjQuery.BgSwitcherのサイトでダウンロードしたjquery.bgswitcher.jsを必ず読み込んでください。

DEMO(デフォルト) 

使い方(カスタマイズ)

html/css
  1. htmlcssは上記と同じです。
js
  1. <script src=“//ajax.googleapis.com/ajax/libs/jquery/3.0.0/jquery.min.js”></script>
  2. <script src=“js/jquery.bgswitcher.js”></script>
  3. <script>
  4. jQuery(function($) {
  5. $(‘.bg-slider’).bgSwitcher({
  6. images: [‘img/bg1.jpg’,‘img/bg2.jpg’,‘img/bg3.jpg’], // 切替背景画像を指定
  7. interval: 3000, // 背景画像を切り替える間隔を指定 3000=3秒
  8. loop: true, // 切り替えを繰り返すか指定 true=繰り返す false=繰り返さない
  9. shuffle: true, // 背景画像の順番をシャッフルするか指定 true=する false=しない
  10. effect: “blind”, // エフェクトの種類をfade,blind,clip,slide,drop,hideから指定
  11. duration: 500, // エフェクトの時間を指定します。
  12. easing: “swing” // エフェクトのイージングをlinear,swingから指定
  13. });
  14. });
  15. </script>

上記は背景画像の切り替え時間をデフォルトよりも2秒短くして、画像の切り替え順をシャッフルにしています。またエフェクトの種類を「blind」に変更し、エフェクトの効果時間を0.5秒短くしています。その他のカスタマイズ方法に関しては下記の表をご確認ください。

DEMO(カスタマイズ) 

設定

キー 初期値 説明
images [] 切り替える背景画像を配列で指定
interval 5000 切り替えの間隔
start true $.fn.bgswitcher(config)をコールした時に切り替えを開始する
loop true 切り替えをループする
shuffle false 背景画像の順番をシャッフルする
effect fade エフェクトの種類
duration 1000 エフェクトの時間
easing swing エフェクトのイージング

今回は画面領域最大で背景画像を切り替える例を紹介しましたが、width: 980px; height: 400px;などと設定して動かすこともできます。
表にある要素は固定で、裏で背景画像をスライドさせいたときなどには、この「jQuery.BgSwitcher」を使用することをお勧めいたします。

 

※スライドが何枚か表示されないようなことが起こったら、画像の名前や拡張子がコピペでちがっていたり、画像名が違っていることを疑うこと