前提・実現したいこと
初心者で下記サイトの模写をしております。
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;に切り替わるのでふわっとした効果が出せません。
いい方法がありましたら、ご教示の程、何卒よろしくお願い申し上げます。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。