質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.33%
jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

1回答

320閲覧

CSSアニメーション無限ループ表示のズレを直す方法について

osarusam

総合スコア19

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

1グッド

0クリップ

投稿2025/02/06 02:25

編集2025/02/06 09:40

実現したいこと

お世話になります。
背景動画の上に画像(h1)を載せて動画の最初と最後だけに画像が表示できるようにしたいです。

発生している問題・分からないこと

無限ループで表示回数を重ねるごとに画像の表示タイミングがズレていきます。

このズレを解消するにはどのような調整をすれば良いでしょうか?
よろしくお願いいたします。

該当のソースコード

HTML

1<div class="mvvideo"> 2 <video src="<?php echo get_template_directory_uri() ?>/assets/img/top/slideshow.mp4" loop autoplay muted></video> 3</div> 4<h1><a href="<?php echo home_url(); ?>"><img src="<?php echo get_template_directory_uri() ?>/assets/img/top/logo.png" alt="画像"></a></h1>

CSS

1/* h1画像アニメーション表示 */ 2h1 { 3 opacity: 0; 4 animation: fadeIn 22s infinite;/* 22秒で1サイクル */ 5} 6@keyframes fadeIn { 7 10%, 90% { opacity: 0; }/* 画像の非表示タイミング */ 8 0%, 100% { opacity: 1; }/* 画像の表示タイミング */ 9}

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

ネットで「CSSアニメーション 無限ループ ズレる」「CSSアニメーション カスタマイズ」など検索して試してみましたが、今回の実現したい内容は分かりませんでした。

補足

特になし

jQuery

1<script src="https://code.jquery.com/jquery-3.7.1.min.js"></script> 2<script> 3$(function(){ 4 // h1要素をループ処理 5 $('h1').each(function() { 6 $('h1').fadeIn(3000); 7 $('h1').fadeOut(3000); 8$( '#video' ).on( 'timeupdate', function ( event ) { 9 if ( $(this)[0].currentTime >= 20 ) { 10 // 20秒以上経過した際の処理 11 // 動画の長さは$(this)[0].duration 12 $('h1').fadeIn(3000); 13 } 14 }); 15}); 16}); 17</script>
hatena19👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

juner

2025/02/06 02:39 編集

css は 動画の再生位置 については把握していないので アニメーションが終了してから再度動かすみたいなことをしないといけないのではないでしょうか?(要js
yambejp

2025/02/06 02:54

動画とCSSアニメは完全な同期は厳しいと思います
osarusam

2025/02/06 09:37

コメントありがとうございます。 JSが不得意で良く分からないので、CSSアニメーションだけで作れないかと思ったのですが、やはり難しいのですね。参考になりました。
guest

回答1

0

ベストアンサー

動画の進捗とCSSアニメーションを完全に同期させる手段はありません。

CSSアニメーションは諦めて、timeupdateイベントを使って動画の経過時間に従ってJavaScriptでスタイルを変更するのがよいでしょう。


追記: timeupdate を使った具体的なコードです。

js

1const h1 = document.querySelector('h1'); 2document.querySelector('.mvvideo video').addEventListener('timeupdate', e => { 3 const percent = 100 * e.target.currentTime / e.target.duration; 4 if (percent <= 10) { 5 h1.style.opacity = 1 - percent / 10; 6 } else if (percent >= 90) { 7 h1.style.opacity = (percent - 90) / 10; 8 } else { 9 h1.style.opacity = 0; 10 } 11});

実際に動かしてみるとイベントがあまり頻繁に発生しないみたいで、アニメーション用途には向かない感じでした。requestAnimationFrame() の方がよさそうです。

js

1function handleFrame() { 2 requestAnimationFrame(handleFrame); 3 const h1 = document.querySelector('h1'); 4 const video = document.querySelector('.mvvideo video'); 5 const percent = 100 * video.currentTime / video.duration; 6 if (percent <= 10) { 7 h1.style.opacity = 1 - percent / 10; 8 } else if (percent >= 90) { 9 h1.style.opacity = (percent - 90) / 10; 10 } else { 11 h1.style.opacity = 0; 12 } 13} 14requestAnimationFrame(handleFrame);

投稿2025/02/06 02:56

編集2025/02/07 03:40
int32_t

総合スコア21871

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

osarusam

2025/02/06 09:41

ご返信ありがとうございます。 あちこちネット情報を拾ってjQueryを記述してみましたが、動画の1再生のみフェードイン、アウトされるのみで2再生目以降の画像が表示されません。 間違っている箇所がもし分かればご教示いただけますと助かります。
int32_t

2025/02/07 03:35

拝見しました。fadeOut()もtimeupdateイベントの中で行う必要がありますし、fadeIn()は20秒経過後に何度も呼ばれそうですね。 回答に動作確認したコードを追記します。
osarusam

2025/02/07 09:37

ご丁寧にたくさんコードと検証までしていただき、ありがとうございます! こちらのコードでバッチリ、画像とのズレもなく再生回数を重ねても動画と同期しています。 おかげさまで大変助かりました。深く感謝いたします。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.33%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問