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

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

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

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

CSS

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

Q&A

解決済

1回答

697閲覧

表示時間をズラして画像を切り替える方法について

kogi

総合スコア2

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

CSS

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

0グッド

0クリップ

投稿2021/08/24 08:39

JavaScript初心者です。簡単なアニメーションを作りたいのですが実装方法がわからず困っています。

やりたいこと

4枚の画像が0.1秒毎にズームしながら切り替わり、0.5秒毎に(または5回目の処理で)ズームしながら画像を3秒間表示する。

説明が分かりにくくすみません。つまり、
1.png→2.png→3.png→4.png→1.png→2.png…の順で0.1秒ごとにパッパッパっと画像が切り替わって、一周して1.pngに戻ってきた時に3秒表示。またパッパっと切り替わって2.pngに来た時に3秒表示…みたいなものが作りたいです。

試したこと

ズームしながら0.1秒毎に切り替えまでは調べて分かりましたが、「0.5秒毎に3秒表示」の部分がつまっています。
なんとなくsetTimeoutを使うんだろうということは分かるのですが書き方が分からず、ご教授頂けないでしょうか。
動きの部分はcssで行っています。また、フェードインと記載してますが実際はフェードではなく切り替わる感じにしています。

ソースコード

html

1 <ul id="slide_wrapp"> 2 <li class="slide_item"><img src="img/1.png" alt=""></li> 3 <li class="slide_item"><img src="img/2.png" alt=""></li> 4 <li class="slide_item"><img src="img/3.png" alt=""></li> 5 <li class="slide_item"><img src="img/4.png" alt=""></li> 6 </ul>

css

1 #slide_wrapp{ 2 position: relative; 3 overflow: hidden; 4 padding: 0; 5 width: 500px; 6} 7 .slide_item{ 8 opacity: 0; 9 transform: scale(1); 10 transition: opacity 0.01s linear, transform 1s linear; //秒数に注意 11 position: relative; 12 z-index: 1; 13} 14 .slide_item:not(:first-child){ 15 position: absolute; 16 top: 0; 17 left : 0; 18} 19 .slide_item.show_{ 20 opacity: 1; 21} 22 .slide_item.zoom_{ 23 transform: scale(1.02); 24} 25 .slide_item img{ 26 display: block; //下に余白ができないように 27}

js

1 function sliderStart() { 2 3 const slide = document.getElementById('slide_wrapp'); //スライダー親 4 const slideItem = slide.querySelectorAll('.slide_item'); //スライド要素 5 const totalNum = slideItem.length - 1; //スライドの枚数を取得 6 const FadeTime = 1000; //フェードインの時間 7 const IntarvalTime = 1000; //クロスフェードさせるまでの間隔 8 let actNum = 0; //現在アクティブな番号 9 let nowSlide; //現在表示中のスライド 10 let NextSlide; //次に表示するスライド 11 12 // スライドの1枚目をフェードイン 13 slideItem[0].classList.add('show_', 'zoom_'); 14 15 // 処理を繰り返す 16 setInterval(() => { 17 if (actNum < totalNum) { 18 19 let nowSlide = slideItem[actNum]; 20 let NextSlide = slideItem[++actNum]; 21 22 //.show_削除でフェードアウト 23 nowSlide.classList.remove('show_'); 24 // と同時に、次のスライドがズームしながらフェードインする 25 NextSlide.classList.add('show_', 'zoom_'); 26 //フェードアウト完了後、.zoom_削除 27 setTimeout(() => { 28 nowSlide.classList.remove('zoom_'); 29 }, FadeTime); 30 31 } else { 32 33 let nowSlide = slideItem[actNum]; 34 let NextSlide = slideItem[actNum = 0]; 35 36 //.show_削除でフェードアウト 37 nowSlide.classList.remove('show_'); 38 // と同時に、次のスライドがズームしながらフェードインする 39 NextSlide.classList.add('show_', 'zoom_'); 40 //フェードアウト完了後、.zoom_削除 41 setTimeout(() => { 42 nowSlide.classList.remove('zoom_'); 43 }, FadeTime); 44 45 }; 46 }, IntarvalTime); 47 48}

何卒よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

javascript

1<script> 2let count=4; 3setInterval((function loop(){ 4 for(let i=0;i<5;i++){ 5 setTimeout(()=>{ 6 document.querySelector(`#slide_wrapp li:nth-child(${count})`).classList.remove('ani'); 7 document.querySelector(`#slide_wrapp li.prev`)?.classList.remove('prev'); 8 document.querySelector(`#slide_wrapp li:nth-child(${count})`).classList.add('prev'); 9 count++; 10 if(count>4) count=1; 11 document.querySelector(`#slide_wrapp li:nth-child(${count})`).classList.add('ani'); 12 },100*i); 13 } 14 return loop; 15})(),3500); 16</script> 17 18<style> 19#slide_wrapp{ 20list-style:none; 21position:relative; 22} 23#slide_wrapp li{ 24position:absolute; 25top:0; 26} 27#slide_wrapp li.ani{ 28z-index:2; 29} 30#slide_wrapp li.prev{ 31z-index:1; 32} 33#slide_wrapp li:not(.ani):not(.prev){ 34z-index:0; 35} 36#slide_wrapp li.ani img{ 37animation: ani 0.1s; 38} 39@keyframes ani{ 40 0%{ width:0%;} 41 100%{ width:100%;} 42} 43</style> 44<ul id="slide_wrapp"> 45<li><img src="https://placehold.jp/ff0000/00ffff/150x150.png?text=1"></li> 46<li><img src="https://placehold.jp/00ff00/ff00ff/150x150.png?text=2"></li> 47<li><img src="https://placehold.jp/0000ff/ffff00/150x150.png?text=3"></li> 48<li><img src="https://placehold.jp/000000/ffffff/150x150.png?text=4"></li> 49</ul>

※一部バグ修正

追加

以下、最初1を3秒間(くらい)とめる

javascript

1let count=1; 2window.addEventListener('DOMContentLoaded', ()=>{ 3 document.querySelector('#slide_wrapp li:first-child').classList.add('prev'); 4}); 5setInterval(()=>{ 6 for(let i=0;i<5;i++){ 7 setTimeout(()=>{ 8 document.querySelector(`#slide_wrapp li:nth-child(${count})`).classList.remove('ani'); 9 document.querySelector(`#slide_wrapp li.prev`)?.classList.remove('prev'); 10 document.querySelector(`#slide_wrapp li:nth-child(${count})`).classList.add('prev'); 11 count++; 12 if(count>4) count=1; 13 document.querySelector(`#slide_wrapp li:nth-child(${count})`).classList.add('ani'); 14 },100*i); 15 } 16},3500);

投稿2021/08/24 10:45

編集2021/08/25 05:08
yambejp

総合スコア114839

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

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

kogi

2021/08/25 01:22

ありがとうございます!本当に助かりました!!
yambejp

2021/08/25 01:29 編集

ごめんなさい、一部バグがあったので修正してあります (表示の切り替えがはやすぎてバグにきがつかなかった)
kogi

2021/08/25 04:33

修正までありがとうございます…! それと、厚かましく大変恐縮なのですが、1枚目のスライドを3秒間表示させてから始まるようにするにはどのようにすればいいか教えていただけるととても助かります。。
yambejp

2021/08/25 04:58

>1枚目のスライドを3秒間表示させてから始まる 1を3秒まって2>3>4>1>2 から始める感じでしょうか?
kogi

2021/08/25 05:01

そうです!1枚目のズームインからスタートしたあと0.1秒で切り替えたいです!
yambejp

2021/08/25 05:07

仕様上最初の止める長さがめくりの分だけ長くなりますがそれでよければ追加分でできるはずです
kogi

2021/08/25 05:48

大丈夫でした! お忙しいところ本当にありがとうございました!!とても助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問