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

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

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

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

Q&A

解決済

3回答

450閲覧

jsだけでタブメニューをつくるコードに関する質問

takane

総合スコア63

JavaScript

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

0グッド

1クリップ

投稿2017/10/05 04:19

どうやら投稿に失敗したようなので、
再度投稿いたします。
※二重投稿になっていたらすみません。

こんにちは。
私は今jsだけでタブメニューを作る勉強をしています。
動画サイトで習ったやりかたはdata-id(dataset)を使うやり方
なのですが、これではhtml5以外では使えなくなってしまうらしいと
聞きました。

そこで下記のURLを見て成り立ちを勉強しているのですが、
知識不足と経験不足で読み解くことができていません。

わからないところを列挙しますので、
どなたか親切な方、解説していただけないでしょうか・・・。
一応自分でわかるところまでは解析しています。

参考URL
http://gihyo.jp/dev/serial/01/crossbrowser-javascript/0021

質問1
var id = link.hash.slice(1);の部分
hashというのはlink(aタグ)の#がついている部分を抜き出せということですか?
また、sliceは取り出したidの配列の0番目から1番目までを取り出すという意味で
あっていますか?

質問2
function tab_init() の中の page.style.display = 'none';のぶぶん
このタイミングでpageクリアランスをかけてしまったら
なにもボタンをおさなくても最初からすべてのdivが表示されなく
なってしまいませんか?

html

1<div class="js-tabs"> 2 <ul id="tab_menu1" class="tab_menu"> 3 <li><a href="#page1-1">Page 1</a></li> 4 <li><a href="#page1-2">Page 2</a></li> 5 <li><a href="#page1-3">Page 3</a></li> 6 </ul> 7 <div id="tab_content1" class="tab_content"> 8 <div id="page1-1" class="page"> 9 Page 1 10 </div> 11 <div id="page1-2" class="page"> 12 Page 2 13 </div> 14 <div id="page1-3" class="page"> 15 Page 3 16 </div> 17 </div> 18</div>

css

1.js-tabs ul.tab_menu{ 2 list-style-type:none; 3 margin:0px; 4 padding:0px; 5} 6.js-tabs ul.tab_menu li{ 7 display:inline; 8 background:#666; 9 margin:0px; 10 padding:2px; 11} 12.js-tabs .tab_menu li a{ 13 padding:3px; 14} 15.js-tabs .tab_menu li a:link, 16.js-tabs .tab_menu li a:visited{ 17 background-color:#666; 18 color:#fff; 19} 20.js-tabs .tab_menu li a.active:link, 21.js-tabs .tab_menu li a.active:visited{ 22 background-color:#444; 23 color:#fff; 24} 25.js-tabs .tab_menu li a:hover{ 26 background-color:#333; 27 color:#f0f; 28} 29.tab_content{ 30 position:relative; 31 height:200px; 32} 33.tab_content div.page{ 34 width:450px; 35 height:200px; 36 position:absolute; 37 color:#222; 38} 39#page1-1{ 40 background-color:#ffa; 41} 42#page1-2{ 43 background-color:#faf; 44} 45#page1-3{ 46 background-color:#aff; 47}

js

1(function(){ 2var menu = document.getElementById('tab_menu1'); 3var content = document.getElementById('tab_content1'); 4var menus = menu.getElementsByTagName('a'); 5var current; // 現在の状態を保持する変数 6for (var i = 0, l = menus.length;i < l; i++){ 7 tab_init(menus[i], i); 8} 9function tab_init(link, index){ 10 var id = link.hash.slice(1); 11 var page = document.getElementById(id); 12 if (!current){ // 状態の初期化 13 current = {page:page, menu:link}; 14 page.style.display = 'block'; 15 link.className = 'active'; 16 } else { 17 page.style.display = 'none'; 18 } 19 link.onclick = function(){ 20 current.page.style.display = 'none'; 21 current.menu.className = ''; 22 page.style.display = 'block'; 23 link.className = 'active'; 24 current.page = page; 25 current.menu = link; 26 return false; 27 }; 28} 29})();

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

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

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

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

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

guest

回答3

0

CSS

1.page.up{z-index:2;} 2.page{z-index:1;}

を指定しておいて、upクラスを付け替えるのはどうでしょうか?

javascript

1document.addEventListener('click',function(e){ 2 var t=e.target; 3 if(t.nodeName==='A'){ 4 Array.prototype.map.call(document.querySelectorAll('#tab_content1 .page'),function(i){ 5 i.classList.remove('up'); 6 if('#'+i.id===t.getAttribute("href")){ 7 i.classList.add('up'); 8 } 9 }); 10 } 11}); 12

HTML

1<div class="js-tabs"> 2 <ul id="tab_menu1" class="tab_menu"> 3 <li><a href="#page1-1">Page 1</a></li> 4 <li><a href="#page1-2">Page 2</a></li> 5 <li><a href="#page1-3">Page 3</a></li> 6 </ul> 7 <div id="tab_content1" class="tab_content"> 8 <div id="page1-1" class="page up"> 9 Page 1 10 </div> 11 <div id="page1-2" class="page"> 12 Page 2 13 </div> 14 <div id="page1-3" class="page"> 15 Page 3 16 </div> 17 </div> 18</div>

投稿2017/10/05 05:36

yambejp

総合スコア114779

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

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

0

ベストアンサー

質問1:

hashというのはlink(aタグ)の#がついている部分を抜き出せということですか?

おおよそその通りです。正確にはURL文字列の#を含めて#以降の文字列を取得します。

javascript

1console.log(link.hash); 2// #page1-1

sliceは取り出したidの配列の0番目から1番目までを取り出すという意味で

あっていますか?

いいえ、第1引数にstart位置、第2引数にend位置を指定しますが、
第2引数が省略された場合は、start位置からそれ以降の文字列を切りだします。

javascript

1console.log(link.hash.slice(0)); 2// #page1-1 3 4console.log(link.hash.slice(1)); 5// page1-1 6 7console.log(link.hash.slice(2)); 8// age1-1 9 10console.log(link.hash.slice(0,1)); 11// #

質問2:

なにもボタンをおさなくても最初からすべてのdivが表示されなくなってしまいませんか?

いいえ。
以下のようにしてみるとcurrentの初期値が分かります。

javascript

1var current; 2console.log(current); 3//undefined

undefinedなので

javascript

1if (!current){ // 状態の初期化

が成立するため、上記if文のelseには入らず、page.style.display = 'none'は実行されない、ということになります。

投稿2017/10/05 05:15

編集2017/10/05 05:20
m.ts10806

総合スコア80850

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

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

takane

2017/10/05 05:20

そ、そうか、省略されているのはあくまで第二関数だったんですね。 わかりやすい説明どうもありがとうございました。
m.ts10806

2017/10/05 05:22

質問2の回答書く前に投稿してしまったので質問2に対する回答も追記しています。 第2関数ではなく第2「引」数です。関数では意味が違ってきます。 あと、試してみれば分かると思いますが、第1引数も省略できます。 その場合は0を指定したときと同じ結果となります。
takane

2017/10/05 05:39

すみません。あと1ミリ理解が及ばないところがあるので教えていただけませんでしょうか・・・。 いつも日本語に変換しながらプログラムを理解しているのですが、 いわば下記のようなことでしょうか? var current; console.log(current); //undefined ↓ currentという箱を作ります。 currentの中身を教えてください。 //定義されていない状態です。 if (!current){ ↓ もし、currentの中身がfalse以外のものがはいっていたら 今まではif以降を「currentの中身が定義されていない状態ではなかったら」と 理解していたために微妙なズレがありました。
takane

2017/10/05 05:58

わ・・・わかった!!! たぶん大丈夫だと思います!! またわからないところがあったらよろしくお願いします! ありがとうございました!
m.ts10806

2017/10/05 06:01

日本語に変換しながら理解するのは良いことではありますが、正しく変換しないと意味不明になってしまうので注意です。 プログラム言語は英単語と同じで1つの表現で様々な意味合いを持つことがよくあるからです。 文脈から意味を読み取る力も必要ですね。 というので、 > if (!current){ この部分は、false・undefined・nullなども同じように判定可能で、いずれも!current ===trueと判断されます。 厳密なチェックをするのであれば、 if ( typeof(current) === "undefined") となりますね。
guest

0

hashというのはlink(aタグ)の#がついている部分を抜き出せということですか?

はい。

また、sliceは取り出したidの配列の0番目から1番目までを取り出すという意味で

あっていますか?

いいえ。
↓以下のとおり、

取り出しを開始する、0 から始まるインデックス。

String.prototype.slice() - JavaScript | MDN

1番目以降を取り出します。 

なにもボタンをおさなくても最初からすべてのdivが表示されなくなってしまいませんか?

その前に

javascript

1if (!current){ // 状態の初期化 2 //... 3 } else {

とあります。初期状態では、undefinedでしょうから条件が成立し、page.style.display = 'none';は実行されないと思います。

投稿2017/10/05 05:15

Lhankor_Mhy

総合スコア36074

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

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

takane

2017/10/05 05:40

すみません。あと1ミリ理解が及ばないところがあるので教えていただけませんでしょうか・・・。 いつも日本語に変換しながらプログラムを理解しているのですが、 いわば下記のようなことでしょうか? var current; console.log(current); //undefined ↓ currentという箱を作ります。 currentの中身を教えてください。 //定義されていない状態です。 if (!current){ ↓ もし、currentの中身がfalse以外のものがはいっていたら 今まではif以降を「currentの中身が定義されていない状態ではなかったら」と 理解していたために微妙なズレがありました。
Lhankor_Mhy

2017/10/05 05:53

ん? > 今まではif以降を「currentの中身が定義されていない状態ではなかったら」と理解していた これは合ってますよ。undefined とは、大雑把に言うと定義されていない時の値です。
takane

2017/10/05 05:57

わ・・・わかった!!! たぶん大丈夫だと思います!! またわからないところがあったらよろしくお願いします! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問