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

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

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

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

Q&A

2回答

946閲覧

setTimeout 最後の処理のdelay(時間)が遅い。

8888

総合スコア12

JavaScript

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

0グッド

0クリップ

投稿2020/05/05 12:01

スライドを作ろうとしていたのですが、最後のdiv.boxから最初のdiv.boxに戻る動作が遅いです。(2000より掛っている。)

これはなぜでしょうか?

html

<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>zengamen</title> <link rel="stylesheet" href="reset.css"> <link rel="stylesheet" href="style.css"> <script src="base.js" defer></script> </head> <body> <div id="slide"> <div class="box active"> </div> <div class="box"> </div> <div class="box"> </div> </div> </body> </html>

css

@charset 'utf-8'; .box{ width: 100vw; height: 100vh; position: absolute; left: 50%; top: 50%; transform: translate(-50%,-50%); } .box:nth-child(1){ background-color: blueviolet; } .box:nth-child(2){ background-color:red; } .box:nth-child(3){ background-color:violet; } div.active{ z-index: 2; }

js

document.addEventListener('DOMContentLoaded', function () { let b = document.querySelector('.active'); let child = document.querySelectorAll('.box'); let i = 0; let leg = child.length-1; console.log(leg); let nextact = function () { if(i <= leg){ child[i].classList.remove('active'); i++ if(i < leg){ child[i].classList.add('active'); } } else{ i = 0; child[i].classList.add('active'); } }; let pretact = function () { child[i].classList.remove('active'); i-- child[i].classList.add('active') }; let timerId = setTimeout(function tick() { nextact(); timerId = setTimeout(tick, 2000); }, 2000); });

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

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

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

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

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

guest

回答2

0

分岐(if)する所を間違えていました。

投稿当初のjs

let nextact = function () { if(i <= leg){ child[i].classList.remove('active'); //i = 1 i++ //i = 2 加算 if(i < leg){ //i = 2 なので false child[i].classList.add('active'); } falseなのでifの頭に戻る。 この時にactiveクラスがついてなく2000待たされる為に遅れる。 } else{ i = 0; child[i].classList.add('active'); } };

修正版

let nextact = function () { if(i <= leg){ child[i].classList.remove('active'); i++ if(i <= leg){ child[i].classList.add('active'); } else{ i = 0; child[i].classList.add('active'); } } };

投稿2020/05/06 02:20

8888

総合スコア12

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

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

0

繰り返しなら、
setIntervalを使いましょう。

javascript

1let timerId = setInterval(nextact, 2000);

無理にsetTimeoutを使おうとして、最後の処理遅延が、二重で行われてしまったりなどの弊害が起きているのかと。

投稿2020/05/05 14:38

miyabi_takatsuk

総合スコア9528

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

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

8888

2020/05/06 00:33 編集

ご返答ありがとうございます。 setIntervalを最初使っていたのですが全く同じでした。 色々調べたところ下記の記事をみつけて、再帰的なsetTimeoutを使用することにしました。 https://ja.javascript.info/settimeout-setinterval
8888

2020/05/06 02:06

すみません。 自己解決しました。 ありがとうございました。
miyabi_takatsuk

2020/05/06 23:43

> setIntervalを最初使っていたのですが全く同じでした。 そういう、質問文に書かれない背景情報は重要になることがあるので、 次質問される時は、事前情報として書きましょう。 第三者は知り得ないので。 (でないと回答無駄打ちが発生しやすくなる)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問