🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Haml

Haml(HTML abstraction markup language)は、HTML/XHTMLを効率的に記述するためのマークアップ言語および記法です。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

Q&A

解決済

1回答

837閲覧

Xを押さなくてもメニューバーが閉じるようにしたい

退会済みユーザー

退会済みユーザー

総合スコア0

Haml

Haml(HTML abstraction markup language)は、HTML/XHTMLを効率的に記述するためのマークアップ言語および記法です。

CSS

CSSはXMLやHTMLで表現した色・レイアウト・フォントなどの要素を指示する仕様の1つです。

0グッド

0クリップ

投稿2021/01/21 06:21

ruby:/index.scss

1@media screen and (max-width: 1199px) { 2 .hamburger { 3 display: block; 4 position: fixed; 5 z-index: 3; 6 right: 13px; 7 top: 12px; 8 width: 42px; 9 height: 42px; 10 cursor: pointer; 11 text-align: center; 12 13 span { 14 display: block; 15 position: absolute; 16 width: 30px; 17 height: 2px; 18 left: 6px; 19 background: #fff; 20 -webkit-transition: 0.3s ease-in-out; 21 -moz-transition: 0.3s ease-in-out; 22 transition: 0.3s ease-in-out; 23 24 &:nth-child(1) { //三本線のスペースの設定 25 top: 10px; 26 } 27 28 &:nth-child(2) { 29 top: 20px; 30 } 31 32 &:nth-child(3) { 33 top: 30px; 34 } 35 } 36 37 &.active span { //×に変更 38 &:nth-child(1) { 39 top: 16px; 40 left: 6px; 41 background: #fff; 42 -webkit-transform: rotate(-45deg); 43 -moz-transform: rotate(-45deg); 44 transform: rotate(-45deg); 45 } 46 47 &:nth-child(2), &:nth-child(3) { 48 top: 16px; 49 background: #fff; 50 -webkit-transform: rotate(45deg); 51 -moz-transform: rotate(45deg); 52 transform: rotate(45deg); 53 } 54 } 55 } 56 57 /* ナビ開いてる時のボタン */ 58 59 nav.nav-button { 60 position: fixed; 61 z-index: 1; 62 top: 20px; //メニューバーの高さ調整 63 left: 0px; 64 background: rgba(0, 0, 0, 0.7); 65 text-align: center; 66 width: 100%; 67 opacity: 0; 68 transition: opacity .6s ease, visibility .6s ease; 69 70 ul { 71 margin: 0 auto; 72 padding: 20px; 73 width: 100%; 74 75 li { 76 list-style-type: none; 77 padding: 0; 78 width: 100%; 79 80 &:last-child { 81 padding-bottom: 0; 82 } 83 84 &:hover { //リストにカーソルが乗った時に#dddに変化 85 background: #ddd; 86 } 87 88 a { 89 display: block; 90 color: #fff; 91 padding: 1em 0; 92 text-decoration: none; 93 } 94 } 95 } 96 97 &.active { 98 opacity: 100; 99 } 100 }

このようにscssを書いていますが、ハンバーガーメニューのxを押さないと閉じないようになっています。

しかし、他のところを押しても閉じるようにしたいです。

ruby:/index.html.haml

1 .hamburger 2 %span 3 %span 4 %span 5 %nav.nav-button 6 %ul.menu 7 %li 8 フロントエンド 9 %ul.sub 10 %li 11 = link_to "①HTML", card_category_path(:card_id ,1) 12 %li 13 = link_to "②CSS", card_category_path(:card_id, 2) 14 %li 15 = link_to "③Javascript", card_category_path(:card_id, 3) 16 %li 17 バックエンド 18 %ul.sub 19 %li 20 = link_to "④Java", card_category_path(:card_id, 4) 21 %li 22 = link_to "⑤PHP", card_category_path(:card_id, 5) 23 %li 24 = link_to "⑥Python", card_category_path(:card_id, 6) 25 %li 26 = link_to "⑦Ruby", card_category_path(:card_id, 7) 27 = form_with(url: search_cards_path, local: true, method: :get, class: "search-top") do |f| 28 = f.text_field :keyword, placeholder: "検索", class: "search-top" 29 = f.submit "検索", class: "search-top"

このようにhamlはなっています。
宜しくお願い致します。

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

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

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

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

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

guest

回答1

0

ベストアンサー

こんにちは。

サンプル

CSSを変更して、.nav-buttonをスクリーン全体に広げ、

CSS

1 nav.nav-button { 2 position: fixed; 3 z-index: 1; 4// top: 20px; //メニューバーの高さ調整 5 left: 0px; 6// background: rgba(0, 0, 0, 0.7); 7 text-align: center; 8 width: 100%; 9 height: 100vh; // 変更 10 opacity: 0; 11 transition: opacity .6s ease, visibility .6s ease; 12 13 .menu { // 変更 14 background: rgba(0, 0, 0, 0.7); 15 margin-top: 20px; //メニューバーの高さ調整 16 } 17 18 ul {

.nav-buttonクリック時に閉じるようにイベントをつけるのではどうでしょうか。

js

1document.querySelector('.nav-button').addEventListener('click', e =>{ 2 if ( e.currentTarget === e.target ) { 3 document.querySelector('.hamburger').classList.toggle('active'); 4 document.querySelector('.nav-button').classList.toggle('active'); 5 } 6});

投稿2021/01/22 04:45

Lhankor_Mhy

総合スコア36930

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

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

退会済みユーザー

退会済みユーザー

2021/01/22 06:56

ご丁寧にありがとうございます!! ``` document.querySelector('.hamburger').addEventListener('click', e => { document.querySelector('.hamburger').classList.toggle('active'); document.querySelector('.nav-button').classList.toggle('active'); }); document.querySelector('.nav-button').addEventListener('click', e => { if (e.currentTarget === e.target) { document.querySelector('.hamburger').classList.toggle('active'); document.querySelector('.nav-button').classList.toggle('active'); } }) ``` 同じようにコードを書いたのですが、思うように動きません。。 ``` nav.nav-button { position: fixed; z-index: 1; // top: 20px; //メニューバーの高さ調整 left: 0px; //background: rgba(0, 0, 0, 0.7); text-align: center; width: 100%; height: 100vh; opacity: 0; transition: opacity .6s ease, visibility .6s ease; .menu { background: rgba(0,0,0,0.7); margin-top: 20px; } ul { margin: 0 auto; padding: 20px; width: 100%; ``` scssも同じように書いたのですが、反応しないです。。。。 どこか間違っていますでしょうか?
Lhankor_Mhy

2021/01/22 07:09 編集

・「思うように動きません」とは何が起きていますか? 具体的な現象を教えてください。 ・サンプルは動作していましたか?
退会済みユーザー

退会済みユーザー

2021/01/22 07:27

サンプルありがとうございます。 サンプルは動いています! ``` // $(function() { // $('.hamburger').click(function() { // $(this).toggleClass('active'); // if ($(this).hasClass('active')) { // $('.nav-button').addClass('active'); // } else { // $('.nav-button').removeClass('active'); // } // }); // }); document.querySelector('.hamburger').addEventListener('click', e => { document.querySelector('.hamburger').classList.toggle('active'); document.querySelector('.nav-button').classList.toggle('active'); }); document.querySelector('.nav-button').addEventListener('click', e => { if (e.currentTarget === e.target) { document.querySelector('.hamburger').classList.toggle('active'); document.querySelector('.nav-button').classList.toggle('active'); } }) ``` このようにJavaScriptを書いているのですが、ハンバーガーメニューの三本線をプッシュするとこのようなエラーが起きてしまいます。 Uncaught TypeError: Cannot read property 'addEventListener' of null また、JavaScriptのコメントアウトのところは自身の書いたコードにアンリます。一度コメントアウトしています。
Lhankor_Mhy

2021/01/22 07:34

スクリプトは、body要素の一番最後(</body>)に配置するといいのではないかと思いますが、それが難しいようであれば、$(function() {})の中に書いてしまえばいいでしょう。 また、回答のコードをjQueryに合わせるのであれば、 $('.nav-button').click(function (e) { if (e.currentTarget === e.target) { $(this).toggleClass('active'); if ($(this).hasClass('active')) { $('.nav-button').addClass('active'); } else { $('.nav-button').removeClass('active'); } } }); だと思います。(試してません)
退会済みユーザー

退会済みユーザー

2021/01/22 08:20

$(function() {})の中に書いてしまえばいいでしょう。 こちらは ``` $(function() { $('.hamburger').click(function() { $(this).toggleClass('active'); if ($(this).hasClass('active')) { $('.nav-button').addClass('active'); } else { $('.nav-button').removeClass('active'); } }); document.querySelector('.hamburger').addEventListener('click', e => { document.querySelector('.hamburger').classList.toggle('active'); document.querySelector('.nav-button').classList.toggle('active'); }); document.querySelector('.nav-button').addEventListener('click', e => { if (e.currentTarget === e.target) { document.querySelector('.hamburger').classList.toggle('active'); document.querySelector('.nav-button').classList.toggle('active'); } }); }); ``` こちらで間違い無いでしょうか?何度もすみません。 こちらでだとエラーも起きずに反応しない状況でございます。
Lhankor_Mhy

2021/01/22 08:26

jqueryで書いたコードと、サンプルのコードは片方だけの方がいいと思います。(2回クリックされたことになるので)
退会済みユーザー

退会済みユーザー

2021/01/22 08:32

``` $(function() { $('.hamburger').click(function() { $(this).toggleClass('active'); if ($(this).hasClass('active')) { $('.nav-button').addClass('active'); } else { $('.nav-button').removeClass('active'); } }); $('.nav-button').click(function (e) { if (e.currentTarget === e.target) { $(this).toggleClass('active'); if ($(this).hasClass('active')) { $('.nav-button').addClass('active'); } else { $('.nav-button').removeClass('active'); } } }); }); ``` このようにするとできました!!! 有難うございます!! また二つほど解決したいものがありまして、 三本線がメニューを閉じるとそのままXになったままでクリックすると戻るのですが、領域外をタップすると三本線になるようにしたいです。 また、hamlがこのようになっていて ``` .Main .Main__header .Main__header__nav %h1 エンジニアのための本 .hamburger %span %span %span %nav.nav-button %ul.menu %li フロントエンド %ul.sub %li = link_to "①HTML", card_category_path(:card_id ,1) %li = link_to "②CSS", card_category_path(:card_id, 2) %li = link_to "③Javascript", card_category_path(:card_id, 3) %li バックエンド %ul.sub %li = link_to "④Java", card_category_path(:card_id, 4) %li = link_to "⑤PHP", card_category_path(:card_id, 5) %li = link_to "⑥Python", card_category_path(:card_id, 6) %li = link_to "⑦Ruby", card_category_path(:card_id, 7) = form_with(url: search_cards_path, local: true, method: :get, class: "search-top") do |f| = f.text_field :keyword, placeholder: "検索", class: "search-top" = f.submit "検索", class: "search-top" .Main__body .Main__body__left .Main__body__left__top フロントエンド .Main__body__left__text WebサービスやWebアプリケーションで直接ユーザーの %br 目に触れる部分のことです。 フロントエンドの開発で利用する言語は主に、 HTMLやCSS,JavaScriptです。 .Main__body__left .Main__body__left__top バックエンド .Main__body__left__text サーバーサイドやデータベースのシステムなど、ユーザーの目に見えない部分のことです。 %br バックエンドの開発で利用する言語には、JavaやJavaScript、PHP、Python、Rubyといったプログラミング言語があります。 /フロントエンド、バックエンドの説明まで .Content .Content__like %h2 オススメ一覧 .Content__like__end フロントエンド編 ``` こちらの.Contentクラスより下の方でクリックすると、戻るのですが、 Mainクラスのとこでタップしても閉じない現象が起きています。 scssが原因だと考えていますが考えてもどこが原因であるか分かりませんでした。
退会済みユーザー

退会済みユーザー

2021/01/22 08:33

たびたびの質問で申し訳ありません。。 とても感謝しています。。。
Lhankor_Mhy

2021/01/22 08:38

ああ、そうか、こうですね。 $('.nav-button').click(function (e) { if (e.currentTarget === e.target) { $('.hamburger').toggleClass('active'); $('.nav-button').toggleClass('active'); } }); 追加の質問については、Haml はインデントが崩れると再現できないと思いますから、別質問を建てて他の方に聞かれた方がいいかもしれませんね。
退会済みユーザー

退会済みユーザー

2021/01/22 08:38

Xが戻らない現象だけ解決したいです、、、
Lhankor_Mhy

2021/01/22 08:42

それは上のコードに差し替えることで上手くいきませんか?
退会済みユーザー

退会済みユーザー

2021/01/22 08:47

できました!!! ありがとうございます!! とても感謝しています。。。 function(e)のこのeとは何を表しているものでしょうか?
退会済みユーザー

退会済みユーザー

2021/01/22 13:51

ありがとうございます。 ``` nav.nav-button { position: fixed; z-index: 1; top: 20px; //メニューバーの高さ調整 left: 0px; text-align: center; width: 100%; height: 100vh; //これが無いと領域外でタップした時の範囲が狭くなる opacity: 0; transition: opacity .6s ease, visibility .6s ease; //メニューが出てくるのに対して時間を設定 ``` こちらの ``` height: 100vh; ``` このコードがあると他の下の方にあるリンクなどがクリックできなくなっています。。。 しかし、こちらを外してしますと、領域外でクリックした時に反応しなくなります。。。 どのようにすればいいでしょうか??
退会済みユーザー

退会済みユーザー

2021/01/23 02:35

できました。。。。。 本当にたくさんありがとうございます。 また何かありましたらその際は是非お願いできたら嬉しく思います。
Lhankor_Mhy

2021/01/23 02:37

お力になれることがあれば喜んで。
退会済みユーザー

退会済みユーザー

2021/01/23 02:44

ありがとうございます!!
退会済みユーザー

退会済みユーザー

2021/01/23 04:37

pointer-events: none; を入れてしまうと、先ほど多分リロードしてなくてできたと勘違いしていたのか、できていません。。。 またフロントエンド、バックエンドにカーソルを持っていくと、 HTML,cssなどが表示されないです。。。 すみません。。
退会済みユーザー

退会済みユーザー

2021/01/23 04:39

``` @media screen and (max-width: 1199px) { .hamburger { display: block; position: fixed; z-index: 3; right: 13px; top: 12px; width: 42px; height: 42px; cursor: pointer; text-align: center; span { display: block; position: absolute; width: 30px; height: 2px; left: 6px; background: #fff; -webkit-transition: 0.3s ease-in-out; -moz-transition: 0.3s ease-in-out; transition: 0.3s ease-in-out; &:nth-child(1) { //三本線のスペースの設定 top: 10px; } &:nth-child(2) { top: 20px; } &:nth-child(3) { top: 30px; } } &.active span { //×に変更するためのコード &:nth-child(1) { top: 16px; left: 6px; background: #fff; -webkit-transform: rotate(-45deg); -moz-transform: rotate(-45deg); transform: rotate(-45deg); } &:nth-child(2), &:nth-child(3) { top: 16px; background: #fff; -webkit-transform: rotate(45deg); -moz-transform: rotate(45deg); transform: rotate(45deg); } } } // ナビ開いてる時のボタン nav.nav-button { position: fixed; z-index: 1; top: 20px; //メニューバーの高さ調整 left: 0px; text-align: center; width: 100%; height: 100vh; //これが無いと領域外でタップした時の範囲が狭くなる opacity: 0; transition: opacity .6s ease, visibility .6s ease; //メニューが出てくるのに対して時間を設定 pointer-events: none; .menu { background: rgba(0,0,0,0.7); margin-top: 20px; } ul { margin: 0 auto; padding: 20px; width: 100%; li { list-style-type: none; padding: 0; width: 100%; &:last-child { //プルダウンメニューのしたの余白 padding-bottom: 0; } &:hover { //リストにカーソルが乗った時に#dddに変化 background: #ddd; } a { display: block; } } } &.active { // このクラスを、jQueryで付与・削除する opacity: 100; } } ``` このようにscssなっています。。。
Lhankor_Mhy

2021/01/23 04:59

わかりにくくて申し訳ないのですが、pointer-events は2か所に設定する必要があります。 先ほどのサンプルを確認してみてください。
退会済みユーザー

退会済みユーザー

2021/01/23 05:58

こちらの確認不足でした。すみません。 サンプル本当にありがとうございました。 感謝しています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問