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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

メニュー

メニューは、UIにおける仕組みであり、ユーザに機能の表示と実行する手段を与えます。

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

2回答

743閲覧

同じ名前のクラスが複数ある時に、マウスオーバーしている要素だけstyleを変更したい

kkang

総合スコア14

Webサイト

一つのドメイン上に存在するWebページの集合体をWebサイトと呼びます。

メニュー

メニューは、UIにおける仕組みであり、ユーザに機能の表示と実行する手段を与えます。

JavaScript

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2021/02/09 12:44

前提・実現したいこと

初心者で下記サイトの模写をしております。
https://www.vermicular.jp/

グローバルナビでマウスオーバーした際、トグルメニューが表示されて、
マウスが離れるとふわっと消えるアニメーションを実装したいと思っております。

考え方としては
1.メニューが表示されたらサブメニューのulにdisplay:noneをつける
2.マウスオーバーしたらサブメニューのulをblockに
3.マウスアウトでうっすらと消えたあと、display:noneを再度つける

jsについて、自分なりに情報を集めて組んだのですが、勉強が追いついておらず思うように工夫できません。

マウスオーバーしている要素のみdisplay:を変更したいと思っています。

発生している問題・エラーメッセージ

setTimeout()の部分が最初のメニュー要素にしか効いていない
ホバーされた要素を指定するjsの書き方がわからない

該当のソースコード

HTML

1<ul class="g-nav"> 2 <li class="menu">メニュー1 3 <ul class="sub-menu-list"> 4 <li class="sub-menu">サブメニュー1 5 </li> 6 <li class="sub-menu">サブメニュー2 7 </li> 8 <li class="sub-menu">サブメニュー3 9 </li> 10 </ul> 11 </li> 12 <li class="menu">メニュー2 13 <ul class="sub-menu-list"> 14 <li class="sub-menu">サブメニューA 15 </li> 16 <li class="sub-menu">サブメニューB 17 </li> 18 <li class="sub-menu">サブメニューC 19 </li> 20 </ul> 21 </li> 22 <li class="menu">メニュー3 23 <ul class="sub-menu-list"> 24 <li class="sub-menu">サブメニュー10 25 </li> 26 <li class="sub-menu">サブメニュー20 27 </li> 28 <li class="sub-menu">サブメニュー30 29 </li> 30 </ul> 31 </li> 32 33</ul>

scss

1@mixin keyframes($animation-name) { 2 @-webkit-keyframes #{$animation-name} { 3 @content; 4 } 5 @-moz-keyframes #{$animation-name} { 6 @content; 7 } 8 @keyframes #{$animation-name} { 9 @content; 10 } 11} 12@mixin animation($animation-name) { 13 -webkit-animation: $animation-name; 14 -moz-animation: $animation-name; 15 animation: $animation-name; 16 -webkit-animation-fill-mode: both; 17 -moz-animation-fill-mode: both; 18 animation-fill-mode: both; 19} 20 21@include keyframes(toggle-menu-slidein){ 22 0% { 23 opacity:0; 24 left: -30px; 25 } 26 100% { 27 opacity:1; 28 left: 0; 29 } 30} 31 32@include keyframes(tml-fadeout){ 33 0% { 34 opacity: 1; 35 } 36 100% { 37 opacity: 0; 38 } 39} 40 41li { 42 list-style: none; 43 } 44 45.g-nav { 46 height: 50px; 47 display: flex; 48 flex-wrap: nowrap; 49 .menu{ 50 width: 200px; 51 height: inherit; 52 position: relative; 53 background-color: aqua; 54 .sub-menu-list { 55 position: absolute; 56 top: 50px; 57 left: 0; 58 background-color: pink; 59 .sub-menu { 60 position: relative; 61 &:first-child { 62 @include animation(toggle-menu-slidein 1.2s ease-out 0s); 63 } 64 &:nth-child(2) { 65 @include animation(toggle-menu-slidein 1.2s ease-out 0.2s); 66 } 67 &:nth-child(3) { 68 @include animation(toggle-menu-slidein 1.2s ease-out 0.3s); 69 } 70 } 71 } 72 } 73 74 } 75 76 .hide { 77 @include animation(tml-fadeout 0.2s ease 0s); 78 }

js

1document.addEventListener("DOMContentLoaded", function() { 2 var elements = document.getElementsByClassName('sub-menu-list'); 3 for(i=0;i<elements.length;i++){ 4 elements[i].style.display = "none"; 5 } 6}); 7 8 9$(function() { 10 11 $('.menu').mouseover(function(e) { 12 13 setTimeout(() => document.querySelector(".sub-menu-list").style.display = "block", 0); 14 $('.sub-menu-list').removeClass("hide"); 15 }) 16 17 $('.menu').mouseout(function(e) { 18 $('.sub-menu-list').addClass("hide"); 19 setTimeout(() => document.querySelector(".sub-menu-list").style.display = "none", 200); 20 // opacityが0になるタイミングでdisplay:noneを付与する 21 }) 22});

##試したこと

css

1.menu ::hover { 2 .sub-menu-list { 3 display: block; 4 } 5 } 6 7.sub-menu-list { 8 display: none; 9} 10

を追加し、

js

1document.addEventListener("DOMContentLoaded", function() { 2 var elements = document.getElementsByClassName('toggle-menu-list'); 3 for(i=0;i<elements.length;i++){ 4 elements[i].style.display = "none"; 5 } 6}); 7 8setTimeout(() => document.querySelector(".sub-menu-list").style.display = "block", 0); 9setTimeout(() => document.querySelector(".sub-menu-list").style.display = "none", 200); 10

を削除すればいい感じになるのですが、マウスアウトした際に
cssに書かれたsub-menu-listのdisplay: none;に切り替わるのでふわっとした効果が出せません。

いい方法がありましたら、ご教示の程、何卒よろしくお願い申し上げます。

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

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

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

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

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

guest

回答2

0

教えていただいた事項をヒントに書き直し、$function(){}の中を下記のように記述したら理想通りに動きました。

$('.menu').hover(function(e) { setTimeout(() => $(this).children('.sub-menu-list').css("display","block"), 0); $(this).children('.sub-menu-list').removeClass("hide"); }, function(e) { $('.sub-menu-list').addClass("hide"); setTimeout(() => $(this).children('.sub-menu-list').css("display","none"), 200); })

投稿2021/02/09 14:14

kkang

総合スコア14

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

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

0

ベストアンサー

マウスオーバーしている要素は $(this) で取得できます。また、.sub-menu-list.menu の子要素ですので、children() で取得できます。
ということで、下記でどうでしょう。

js

1 $('.menu').mouseover(function(e) { 2 setTimeout(() => $(this).children().css("display","block"), 0); 3 $(this).children().removeClass("hide"); 4 }) 5 6 $('.menu').mouseout(function(e) { 7 $('.sub-menu-list').addClass("hide"); 8 setTimeout(() => $(this).children().css("display","none"), 200); 9 // opacityが0になるタイミングでdisplay:noneを付与する 10 })

投稿2021/02/09 13:04

編集2021/02/09 13:13
hatena19

総合スコア34075

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

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

kkang

2021/02/09 14:09

ありがとうございます! いただいたスクリプトをヒントに再考したらきれいに動きました。 .mouseoverではなく、.hoverだったようです。
hatena19

2021/02/09 14:16

.mouseover と .mouseout を一つにまとめたのが .hover です。 動作はどちらも同じです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問