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

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

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

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

Q&A

解決済

2回答

2032閲覧

JavaScript(not jQuery)でドロップダウンメニュー作りたい

tuepon

総合スコア13

JavaScript

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

0グッド

0クリップ

投稿2016/11/14 15:21

###前提・実現したいこと
JavaScriptでjQueryを使用せずに、ドロップダウンメニュー(マウスをかざすとメニューが下方向にピロっと出てくる)を作りたいです。
ヘッダー部分のグローバルナビ3つがそのメニューになっている状態です。

・既存のHTMLがあり、scriptタグの中にJavaScriptを書いて達成したい。
・当初はメニューが開いた形になっており、ページをロードするとJavaScriptが動作してメニューが閉じた状態になる。
・マウスをナビ部分にかざすとメニューがドロップダウンする。

###発生している問題・エラーメッセージ
いちおうメニューを閉じた状態にまでもっていくことが出来ましたが、その先がどうしてもわからずご教示願いたいのです。よろしくお願いいたします。

###該当のソースコード

HTML

1<header> 2<div class="inner clearfix"> 3<h1 id="logo"><a href="#"><img src="image/logo.jpg" alt=""/></a></h1> 4<nav> 5<ul id="navi" class="clearfix"> 6<li><a href="#">会社概要</a> 7<div class="sub"> 8<ul> 9<li><a href="#">記事1</a></li> 10<li><a href="#">記事2</a></li> 11<li><a href="#">記事3</a></li> 12</ul> 13</div> 14</li> 15<li><a href="#">製品</a> 16<div class="sub"> 17<ul> 18<li><a href="#">記事1</a></li> 19<li><a href="#">記事2</a></li> 20<li><a href="#">記事3</a></li> 21</ul> 22</div> 23</li> 24<li><a href="#">新着情報</a> 25<div class="sub"> 26<ul> 27<li><a href="#">記事1</a></li> 28<li><a href="#">記事2</a></li> 29<li><a href="#">記事3</a></li> 30</ul> 31</div> 32</li> 33</ul> 34</nav> 35</div><!-- widthfix --> 36</header>

JavaScript

1<script> 2var items = document.querySelectorAll('a'); //複数のa要素の取得 3 for(var i=0; i<items.length; i++){ 4 window.addEventListener("load",function(){ //画面が呼び出されたときjsを動作 5 var nodeList = document.querySelectorAll('div.sub'); 6 for(var i=0; i<nodeList.length; i++){ 7 nodeList[i].style.display = 'none'; //ここでメニューが閉じた状態 8 //この先をどうして良いのかわからず。。 9 } 10 },false); 11 } 12</script> 13

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

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

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

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

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

guest

回答2

0

jQueryを嫌うくらいならメニューはcssで十分では?

CSS

1#navi li ul{ 2 visibility: hidden; 3 height: 0px; 4 opacity:0; 5} 6#navi li:hover ul { 7 visibility: visible; 8 height: inherit; 9 opacity:1; 10 transition: 0.5s; 11} 12

投稿2016/11/15 02:56

yambejp

総合スコア114779

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

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

tuepon

2016/11/15 09:22

ご回答ありがとうございます。 この方法がスマートかもしれませんね。 実装してみます。
guest

0

ベストアンサー

みなさんjQueryを嫌いますね・・・。便利で良いやつなんですが、もう時代ではなくなったんでしょうか。
直接の回答ではありませんが、とりあえず気になる箇所にコメントを入れています。

JavaScript

1// ↓ querySelectorAll('a') では意図しないa要素を取得してしまうので、メニュー以下のa要素に絞ったほうが良いです 2var items = document.querySelectorAll('a'); 3for(var i=0; i<items.length; i++){ 4 // ↓ for の中に入れているので、loadイベントがa要素の数だけ登録されます。バグ的な挙動の原因にもなるので書き方を変えたほうが良いです。 5 window.addEventListener("load",function(){ 6 // 変わった基準でインデントされてますね・・・。 7 // ↓ メニュー以下に絞ったほうが 8 var nodeList = document.querySelectorAll('div.sub'); 9 for(var i=0; i<nodeList.length; i++){ 10 // #navi に close クラスとか作って、CSSで挙動を制御するほうがお勧めです。 11 nodeList[i].style.display = 'none'; 12 } 13 },false); 14}

CSSで状態を組んでしまい、クラスの付け外しをJavaScriptで行うのがお勧めです。

投稿2016/11/14 15:39

kei344

総合スコア69400

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

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

tuepon

2016/11/15 09:20

ご回答ありがとうございます。 jQueryは嫌ってはおらず、チャレンジとして今回取り組んでおります。 CSSである程度作り込む方法、ご指摘いただいた点をまず直して実装してみたいと思います。
tuepon

2016/11/26 10:03

放置してしまっていました。 おかげさまで問題個所を直して動くようになりました。 要素をうまく取得するのにはDeveloper ToolのConsoleで直打ちするのが分かりやすいですね。 自分の悪い点をご指摘いただいたということで、kei344さんの回答をベストアンサーとさせていただきます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問