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

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

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

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

スライダー

GUIのグラフィカルウィジェットのひとつです。インジケーターを動かすことで値を調節可能とします。

JavaScript

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Q&A

解決済

1回答

2199閲覧

javascript スライダーのif 文について聞きたいです。

blue1412

総合スコア3

CSS3

CSS(Cascading Style Sheet)の第3版です。CSS3と略されることが多いです。色やデザインを柔軟に変更することが可能になります。

HTML5

HTML5 (Hyper Text Markup Language、バージョン 5)は、マークアップ言語であるHTMLの第5版です。

スライダー

GUIのグラフィカルウィジェットのひとつです。インジケーターを動かすことで値を調節可能とします。

JavaScript

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

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

0グッド

0クリップ

投稿2020/05/03 07:23

編集2020/05/03 09:12

以下のコードをを見てアドバイス願います。

javascriptのことなのですが、

具体的に言うと
var isChanging = false;
このコードで定義された変数を直後の
if (isChanging === true)
という文ですが、
isChangingはfalseです!!って言った後に、
もしtrueなら、、、となるのが、理解できません。

例えるなら、ミステリー小説で犯人はAさんでない!!家族で夕食を食べていたというアリバイがあって家族もそれを証言し不審な点もないからだ。と言った後に、もしそのアリバイがなく、犯人になりえるとしたら、、、
みたいに一度確定したことを、もし~~~ならとなっているのが理解できません。

質問の意図はわかっていただけましたでしょうか?
足りない点がありましたら、指摘お願いします。

javascript

1// スライダーに表示する画像のパス 2var imgList = [ 3 "images/img01.jpg", 4 "images/img02.jpg", 5 "images/img03.jpg", 6 "images/img04.jpg" 7]; 8 9// 画像とナビの要素を自動で追加 10for(var i = 0; i < imgList.length; i++) { 11 // li要素を取得 12 var slide = document.createElement("li"); 13 // li要素の中に画像タグを埋め込む 14 slide.innerHTML = "<img src='" + imgList[i] + "'>"; 15 // li要素をクラス名「slider-inner」の子要素として追加 16 document.getElementsByClassName("slider-inner")[0].appendChild(slide); 17 18 // li要素を取得 19 var nav = document.createElement("li"); 20 // プロパティ「data-nav-index」に数値を割り振る 21 nav.setAttribute("data-nav-index", i); 22 // li要素をクラス名「nav」の子要素として追加 23 document.getElementsByClassName("nav")[0].appendChild(nav); 24} 25 26// スライドの数を取得(処理のために-1する) 27var length = imgList.length - 1; 28// クラス名「imageSlide」に画像の1枚の要素を格納 29var imageSlide = document.getElementsByClassName("slider-inner")[0].getElementsByTagName("li"); 30// クラス名「dotNavigation」にドットナビの1つの要素を格納 31var dotNavigation = document.getElementsByClassName("nav")[0].getElementsByTagName("li"); 32// 「現在○○枚目のスライドを表示している」というインデックス番号を格納する変数 33var nowIndex = 0; 34// 現在表示されている画像とドットナビにクラス名を付ける 35imageSlide[nowIndex].classList.add("show"); 36dotNavigation[nowIndex].classList.add("current"); 37 38 39 40//見ていただきたいところです 41 42 43 44// スライドがアニメーション中か判断するフラグ 45var isChanging = false; 46// スライドのsetTimeoutを管理するタイマー 47var slideTimer; 48// スライド切り替え時に呼び出す関数 49function sliderSlide(val) { 50 if (isChanging === true) { 51 return false; 52 } 53 isChanging = true; 54 // 現在表示している画像とナビからクラス名を削除 55 imageSlide[nowIndex].classList.remove("show"); 56 dotNavigation[nowIndex].classList.remove("current"); 57 nowIndex = val; 58 // 次に表示するスライドとナビにカレントクラスを設定 59 imageSlide[nowIndex].classList.add("show"); 60 dotNavigation[nowIndex].classList.add("current"); 61 // アニメーションが終わるタイミングでisChangingのステータスをfalseに 62 slideTimer = setTimeout(function(){ 63 isChanging = false; 64 }, 600); 65} 66 67// 左矢印のナビをクリックした時のイベント 68document.getElementById("arrow-prev").addEventListener("click", function(){ 69 var index = nowIndex - 1; 70 if(index < 0){ 71 index = length; 72 } 73 sliderSlide(index); 74}, false); 75// 右矢印のナビをクリックした時のイベント 76document.getElementById("arrow-next").addEventListener("click", function(){ 77 var index = nowIndex + 1; 78 if(index > length){ 79 index = 0; 80 } 81 sliderSlide(index); 82}, false); 83// ドットナビをクリックした時のイベントを作成 84for(var i = 0; i < dotNavigation.length; i++) { 85 // データ属性のインデックス番号を元にスライドを行う 86 dotNavigation[i].addEventListener("click", function(){ 87 var index = Number(this.getAttribute("data-nav-index")); 88 sliderSlide(index); 89 }, false); 90}

html

1// スライダーに表示する画像のパス 2var imgList = [ 3 "images/img01.jpg", 4 "images/img02.jpg", 5 "images/img03.jpg", 6 "images/img04.jpg" 7]; 8 9// 画像とナビの要素を自動で追加 10for(var i = 0; i < imgList.length; i++) { 11 // li要素を取得 12 var slide = document.createElement("li"); 13 // li要素の中に画像タグを埋め込む 14 slide.innerHTML = "<img src='" + imgList[i] + "'>"; 15 // li要素をクラス名「slider-inner」の子要素として追加 16 document.getElementsByClassName("slider-inner")[0].appendChild(slide); 17 18 // li要素を取得 19 var nav = document.createElement("li"); 20 // プロパティ「data-nav-index」に数値を割り振る 21 nav.setAttribute("data-nav-index", i); 22 // li要素をクラス名「nav」の子要素として追加 23 document.getElementsByClassName("nav")[0].appendChild(nav); 24} 25 26// スライドの数を取得(処理のために-1する) 27var length = imgList.length - 1; 28// クラス名「imageSlide」に画像の1枚の要素を格納 29var imageSlide = document.getElementsByClassName("slider-inner")[0].getElementsByTagName("li"); 30// クラス名「dotNavigation」にドットナビの1つの要素を格納 31var dotNavigation = document.getElementsByClassName("nav")[0].getElementsByTagName("li"); 32// 「現在○○枚目のスライドを表示している」というインデックス番号を格納する変数 33var nowIndex = 0; 34// 現在表示されている画像とドットナビにクラス名を付ける 35imageSlide[nowIndex].classList.add("show"); 36dotNavigation[nowIndex].classList.add("current"); 37// スライドがアニメーション中か判断するフラグ 38var isChanging = false; 39// スライドのsetTimeoutを管理するタイマー 40var slideTimer; 41// スライド切り替え時に呼び出す関数 42function sliderSlide(val) { 43 if (isChanging === true) { 44 return false; 45 } 46 isChanging = true; 47 // 現在表示している画像とナビからクラス名を削除 48 imageSlide[nowIndex].classList.remove("show"); 49 dotNavigation[nowIndex].classList.remove("current"); 50 nowIndex = val; 51 // 次に表示するスライドとナビにカレントクラスを設定 52 imageSlide[nowIndex].classList.add("show"); 53 dotNavigation[nowIndex].classList.add("current"); 54 // アニメーションが終わるタイミングでisChangingのステータスをfalseに 55 slideTimer = setTimeout(function(){ 56 isChanging = false; 57 }, 600); 58} 59 60// 左矢印のナビをクリックした時のイベント 61document.getElementById("arrow-prev").addEventListener("click", function(){ 62 var index = nowIndex - 1; 63 if(index < 0){ 64 index = length; 65 } 66 sliderSlide(index); 67}, false); 68// 右矢印のナビをクリックした時のイベント 69document.getElementById("arrow-next").addEventListener("click", function(){ 70 var index = nowIndex + 1; 71 if(index > length){ 72 index = 0; 73 } 74 sliderSlide(index); 75}, false); 76// ドットナビをクリックした時のイベントを作成 77for(var i = 0; i < dotNavigation.length; i++) { 78 // データ属性のインデックス番号を元にスライドを行う 79 dotNavigation[i].addEventListener("click", function(){ 80 var index = Number(this.getAttribute("data-nav-index")); 81 sliderSlide(index); 82 }, false); 83}

css

1.slider { 2 position: relative; 3 width: 640px; 4 height: 480px; 5 margin: 0 auto 6} 7 8.slider .slider-inner { 9 position: relative; 10 top: 0; 11 left: 0; 12 width: 100%; 13 height: 100% 14} 15 16.slider .slider-inner li { 17 position: absolute; 18 top: 0; 19 left: 0; 20 width: 100%; 21 height: 100%; 22 opacity: 0; 23 -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=0)"; 24 -webkit-transition: all 600ms; 25 transition: all 600ms; 26 pointer-events: none 27} 28 29.slider .slider-inner li.show { 30 opacity: 1; 31 -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"; 32 z-index: 1; 33 pointer-events: auto 34} 35 36.slider .nav { 37 width: 100%; 38 margin-top: 20px; 39 text-align: center; 40 font-size: 0 41} 42 43.slider .nav li { 44 display: inline-block; 45 width: 15px; 46 height: 15px; 47 margin: 0 5px; 48 border-radius: 15px; 49 background: #ddd; 50 cursor: pointer; 51 -webkit-transition: background 400ms; 52 transition: background 400ms 53} 54 55.slider .nav li:hover { 56 background: #aaa 57} 58 59.slider .nav li.current { 60 background: #aaa 61} 62 63.slider .arrow { 64 position: absolute; 65 top: 50%; 66 font-size: 20px; 67 cursor: pointer; 68 width: 20px; 69 height: 40px; 70 background: #000; 71 color: #fff; 72 line-height: 40px; 73 padding: 5px; 74 -webkit-transition: opacity 400ms; 75 transition: opacity 400ms 76} 77 78.slider .arrow:hover { 79 opacity: .7; 80 -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=70)" 81} 82 83.slider .arrow#arrow-prev { 84 left: 0; 85 -webkit-transform: translate(-100%,-50%); 86 transform: translate(-100%,-50%) 87} 88 89.slider .arrow#arrow-next { 90 right: 0; 91 -webkit-transform: translate(100%,-50%); 92 transform: translate(100%,-50%) 93}

css

1@charset "utf-8"; 2/* 3html5doctor.com Reset Stylesheet 4v1.6.1 5Last Updated: 2010-09-17 6Author: Richard Clark - http://richclarkdesign.com 7Twitter: @rich_clark 8*/ 9html, body, div, span, object, iframe, 10h1, h2, h3, h4, h5, h6, p, blockquote, pre, 11abbr, address, cite, code, 12del, dfn, em, img, ins, kbd, q, samp, 13small, strong, sub, sup, var, 14b, i, 15dl, dt, dd, ol, ul, li, 16fieldset, form, label, legend, 17table, caption, tbody, tfoot, thead, tr, th, td, 18article, aside, canvas, details, figcaption, figure, 19footer, header, hgroup, menu, nav, section, summary, 20time, mark, audio, video { 21 margin: 0; 22 padding: 0; 23 border: 0; 24 outline: 0; 25 font-size: 100%; 26 vertical-align: baseline; 27 background: transparent; 28} 29 30body { 31 line-height: 1; 32} 33 34article, aside, details, figcaption, figure, 35footer, header, hgroup, menu, nav, section { 36 display: block; 37} 38 39nav ul { 40 list-style: none; 41} 42 43ul li { 44 list-style-type: none; 45} 46 47blockquote, q { 48 quotes: none; 49} 50 51blockquote:before, blockquote:after, 52q:before, q:after { 53 content: ''; 54 content: none; 55} 56 57a { 58 margin: 0; 59 padding: 0; 60 font-size: 100%; 61 vertical-align: baseline; 62 background: transparent; 63} 64 65/* change colours to suit your needs */ 66ins { 67 background-color: #ff9; 68 color: #000; 69 text-decoration: none; 70} 71 72/* change colours to suit your needs */ 73mark { 74 background-color: #ff9; 75 color: #000; 76 font-style: italic; 77 font-weight: bold; 78} 79 80del { 81 text-decoration: line-through; 82} 83 84abbr[title], dfn[title] { 85 border-bottom: 1px dotted; 86 cursor: help; 87} 88 89table { 90 border-collapse: collapse; 91 border-spacing: 0; 92} 93 94/* change border colour to suit your needs */ 95hr { 96 display: block; 97 height: 1px; 98 border: 0; 99 border-top: 1px solid #cccccc; 100 margin: 1em 0; 101 padding: 0; 102} 103 104input, select { 105 vertical-align: middle; 106} 107

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

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

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

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

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

kei344

2020/05/03 07:26

(質問文は編集できます)質問文のコードはそれぞれコードブロックで囲んでいただけませんか? ```(バッククオート3つ)で囲み、前後に改行をいれるか、コードを選択して「<code>」ボタンを押すとコードブロックになります。 また、質問タイトルは問題について具体的に書きましょう。
m.ts10806

2020/05/03 07:46

ご自身はこのコードをどの程度把握しているのでしょうか。 「全部分からないからとりあえず投げとけ」というスタンスだとアドバイス得られにくいかと思います。
Yasumichi

2020/05/03 08:22

kei344 さんのご指摘について補足ですが、今のままだとコードと質問の部分の区別が付きにくくて、回答する方が、ぱっと質問部分を見つけにくいのです。(コードが読みづらいというのもありますが。) 今は、質問するのでやっとかもしれませんが、一旦、回答者の目線になって、自分が回答者だったら、読もうと思うかを検討するといいと思いました。
guest

回答1

0

ベストアンサー

javascript

1// スライドがアニメーション中か判断するフラグ 2var isChanging = false; 3// スライドのsetTimeoutを管理するタイマー 4var slideTimer; 5// スライド切り替え時に呼び出す関数 6function sliderSlide(val) { 7 if (isChanging === true) { 8 return false; 9 }

ここの if 文の話をされているのでしょうか?

だとすると function sliderSlide(val) が呼ばれた時点で評価されるので var isChanging = false; を指定した後にすぐに評価される訳ではないですよ。

【追記】
1 スライドのアニメーションが行われてる間も非同期で実行されるため、再度、sliderSlide() が呼ばれる可能性があります。

2 なので上記の if 判定のあと、すぐに isChanging = true; に変更しています。

3 そして、以下のところでアニメーションが終わるタイミングを待って、isChangingfalse に設定しています。

javascript

1 // アニメーションが終わるタイミングでisChangingのステータスをfalseに 2 slideTimer = setTimeout(function(){ 3 isChanging = false; 4 }, 600);

これで2と3の間の処理中に sliderSlide() が呼ばれても何もせずに return という仕組みです。

投稿2020/05/03 08:16

編集2020/05/03 09:41
Yasumichi

総合スコア1773

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

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

blue1412

2020/05/03 08:31

質問の仕方さえ煩雑で。すみません。今すぐに、もう一度編集しますので再びアドバイスいただけるとありがたいです。 お願いします。
Yasumichi

2020/05/03 09:15

上の回答では、納得いかない感じでしょうか?
blue1412

2020/05/03 09:29

はい。 いまわかっているところを書きます。 定義された関数、sliderSlide、は クリックの際のイベントで呼び出されます。例えば、左クリックをした際は、nowIndexの値が―1となり0より小さいので変数indexの値は3(length)となり、sliderSlideの関数が実行されます。 で、この時点でischangingの変数の値の再定義はさえてないのでfalseのままだと思いますが、このまま関数が実行されても関数内のifはあってもなくてもいいのかなーおもい質問投稿に至ります。
blue1412

2020/05/03 09:30

どうでしょうか?
Yasumichi

2020/05/03 09:41

上の回答の【追記】以下にその部分の説明を加えました。分かりますでしょうか?
blue1412

2020/05/03 12:27

何度もすみません。読んでも理解できませんでした。具体的には「スライドのアニメーションが行われてる間も非同期で実行されるため」の非同期とはどういうことか、ということです。後ろの言葉も理解できてませんが、たぶん、私の力不足だと思います。すみません。 ここで図々しいですが、再び質問させてください。
Yasumichi

2020/05/03 12:34 編集

非同期処理とは、前の文(タスク)の終了を待たずに処理を進めていくことです。 同期処理は、逆に前の文(タスク)の終了を待ち処理を進めることです。 この辺のことが分からないと JavaScript は悩まされることが多いので色々、勉強しましょう。 I-26-2. 非同期処理と同期処理の実装パターンと特徴 | 日本OSS推進フォーラム 非同期処理を制御しようとすると Promise とか async とか await とか覚える必要があります。 http://ossforum.jp/node/753 ちなみに非同期を英語にすると Asynchronous で AJAX の最初の A だったりします。
blue1412

2020/05/03 12:36

var isChanging = false; (省略) var isChanging = true; でどうしてスライド中かどうかを定義できるのですか?
Yasumichi

2020/05/03 12:43

推測が入りますが、CSS でアニメーションが、600ms とか 400ms で実行されるように設定されているので【追記】の2で isChanging = true; に変更して、3の setTimeout で 600ms 待った後、isChanging = false; にして、スライドの切り替えが終了したものとしています。 これで理解できるでしょうか?
blue1412

2020/05/03 13:05

すみません。理解できません。私が使っている参考書には //スライドにがアニメーションか判断するフラグ。 var isChanging = false; //スライド中ではない。 と書いてあり、この「フラグ」という機能?が理解できてないからでしょうか?
blue1412

2020/05/03 13:07

スライド中かどうかを決めるのに var = ... を使って判断するのはメジャーなのですか?
blue1412

2020/05/03 13:08

何度もすみません。私の質問は的を射ていますでしょうか? 遠慮なく指摘お願いします。
Yasumichi

2020/05/03 13:11

業務ロジックをどうするかは、判断の分かれるところですが、普通にフラグは使いますね。 参考書の筆者が、スライドにがアニメーションか判断するのにフラグを使おうと決めたから、それを判断基準にしているだけだと思います。
blue1412

2020/05/03 13:25 編集

わかりました。 document.getElementById("arrow-prev").addEventListener("click", function(){ var index = nowIndex - 1; if(index < 0){ index = length; } sliderSlide(index); }, false); この文の最後の ,false はどんな役割をもってますか?なんのfalse ですか?
Yasumichi

2020/05/03 13:42 編集

EventTarget.addEventListener() - Web API | MDN https://developer.mozilla.org/ja/docs/Web/API/EventTarget/addEventListener 【JavaScript入門】addEventListener()によるイベント処理の使い方! | 侍エンジニア塾ブログ(Samurai Blog) - プログラミング入門者向けサイト https://www.sejuku.net/blog/57625 addEventListener() の三番目の引数で useCapture という項目です。(最初のリンクの2番目の構文です。) イベントの伝搬方法を指定します。分からないうちは、false にしておけば問題ないと思います。 簡単に言うと例えば、画像とその親要素にそれぞれ'click'イベントを登録した場合、イベントが伝搬するかどうかを決定します。(私も他人に教えられるほど、実験したことはないです。)
blue1412

2020/05/03 14:10

了解です。多分理解できたので本当にできたか見ていただきたいです。何度も何度もすみません。
blue1412

2020/05/03 14:23 編集

クリックが起きた時の状況を口で説明します。 左クリックをすると、変数indexはnowIndexの値を1引いた値となり、 sliderSlideという関数を実行します。indexを引数とし、まず、if文に当たります。ischangingはfalseなので処理は実行されずすぐにischangingはtrueに再定義されます。そして在表示している画像とナビからクラス名を削除し、クリックイベントで変化したnowIndexをvalで定義しなおし、次に表示するスライドとナビにカレントクラスを設定した。最後に一連の処理が終わった後setTimeoutで変わったisChangingを6秒後にfalse に戻す処理をして終了。 ということでしょうか?
Yasumichi

2020/05/03 14:31 編集

正確には、0.6秒後だと思いますが、だいたい合ってると思います。 # ただし、正確に 0.6 秒で実行されるとは限らないという特性がありますが。 # この辺は、setTimeout を Google などで検索して、色々、調べてみてください。
blue1412

2020/05/04 01:57

わかりました。何度も何度も有益なアドバイスありがとうございます。また、お世話になることがありましたら、またよろしくお願いします
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問