回答編集履歴

1

一番最初の画像だけスライドショーの表示時間を長くする方法を追加

2023/04/17 09:32

投稿

shinoharat
shinoharat

スコア1676

test CHANGED
@@ -23,6 +23,77 @@
23
23
 
24
24
  > 一番最初の画像だけスライドショーの表示時間を長くする
25
25
 
26
- 質問文の javascript を見る限り、次のスライドに移るコードが見当たらないので、このままだと永遠に1枚目の画像が出続ける気がします。
26
+ ~~質問文の javascript を見る限り、次のスライドに移るコードが見当たらないので、このままだと永遠に1枚目の画像が出続ける気がします。~~
27
+ ~~どのようなスクリプトでスライドショーを行っているのか質問文に追加していただければ、何か答えられるかもしれません。~~
27
28
 
29
+ コメントありがとうございます。
30
+ 現在は以下の処理でスライドショーを行っているのですね。
31
+
32
+ ```js
33
+ $(function(){
34
+ var imgs = $("#slideshow > li");
35
+ var imgLen = imgs.length;
36
+ var count = 0;
37
+ function changeImg(){
38
+ count = (count + 1) % imgLen;
39
+ imgs.removeClass("showSlide").eq(count).addClass("showSlide");
40
+ }
41
+ setInterval(changeImg, 5000);
42
+ })
43
+ ```
44
+
45
+ `setInterval` だと、5秒置きにしか処理が実行できないので、特定のスライドだけ時間を延ばすことができません。
28
- ようなスクリプトでスライドショーっているか質問文に追加していただければ、何か答えられかもしれせん
46
+ ため、 `await` 使って、任意時間だけ処理を停止させ sleep 関数を自作する必要があり
47
+
48
+ ```js
49
+ // 引数に指定した値(ミリ秒)だけ、処理を停止させる。
50
+ function sleep(ms) {
51
+ return new Promise(function(resolve){ setTimeout(resolve, ms) })
52
+ }
53
+ ```
54
+
55
+ 上記の sleep を使えば、スライドごとに表示時間を変えることができます。
56
+
57
+ ```js
58
+ async function startSlideshow() {
59
+ while(true) {
60
+ if(count == 0) {
61
+ await sleep(8000); // 最初のスライドだけ8秒停止
62
+ } else {
63
+ await sleep(5000); // 他のスライドは5秒停止
64
+ }
65
+ changeImg(); // スライドの切り替え
66
+ }
67
+ }
68
+ ```
69
+
70
+ 最後に、 `setInterval` を `startSlideshow` に差し替えます。
71
+
72
+
73
+ ```diff
74
+ $(function(){
75
+ var imgs = $("#slideshow > li");
76
+ var imgLen = imgs.length;
77
+ var count = 0;
78
+ function changeImg(){
79
+ count = (count + 1) % imgLen;
80
+ imgs.removeClass("showSlide").eq(count).addClass("showSlide");
81
+ }
82
+
83
+ + // 引数に指定した値(ミリ秒)だけ、処理を停止させる関数。
84
+ + function sleep(ms) {
85
+ + ...
86
+ + }
87
+
88
+ + // スライドショーを開始する関数。
89
+ + async function startSlideshow() {
90
+ + ...
91
+ + }
92
+
93
+ - setInterval(changeImg, 5000);
94
+ + startSlideshow();
95
+ })
96
+ ```
97
+
98
+ これで、最初のスライドだけ表示時間を延ばすことができると思います。
99
+ お試しください。