
同一ページ内にスクロール移動するときにハンバーガーメニューをクリックしたら閉じさせようとしています。以下のようにしてみましたが、リンク先の「E」を選択してもスクロール移動するだけで、メニューが閉じません。何か抜けてる箇所などあるようでしたら教えてください。
その他、必要な情報がありましたら教えてください。
<div class="bottom-menu-content">
<input type="checkbox" id="nav" />
<label for="nav" class="menu-bar"></label>
<label for="nav" class="toggle-label">MENU</label>
<nav class="nav-container">
<div class="wrapper">
<ul class="menu">
<li><a href="a.html" class="link-nav">A</a></li>
<li><a href="b.html" class="link-nav">B</a></li>
<li><a href="c.html" class="link-nav">C</a></li>
<li><a href="d.html" class="link-nav">D</a></li>
<li><a href="#e" class="scroll link-nav">E</a></li>
</ul>
</div>
</nav>
</div>
<script src="assets/js/jquery-3.3.1.min.js"></script>
<script>
$(window).load(function() {
$(".menu li a").click(function(event) {
$(".nav-container").hide();
});
$(".bottom-menu-content").click(function(event) {
$(".nav-container").show();
});
});
</script>
どうぞよろしくお願いいたします。
No.4ベストアンサー
- 回答日時:
No3です
>今は「#e」をクリックしたときはバッテンのままとなっています。
「ハンバーガーメニュー」とおっしゃっていますけれど、未だにどこがハンバーグなのか不明です。
仕組みがどうなっているかの情報を示さずに質問されても、それは質問者様にしかわからないことです。
方法は検索すればいくらでも見つかると思いますけれど、何をなさりたいのかもほとんどわからないので、以下は勝手な推測に基づくものです。
・ハンバーガーと言っているものは、いわゆる3本線のメニューで
・クリック時にバツ印とトグルになるもの
・メニューリストは元のCSSに「left:-50%」とあったので、
いわゆるドロワータイプと推測しました
現状がどのような仕組みなのか不明なので、上記のような内容のものを勝手に作成してみました。
(ですので、質問者様が作成しているものとは違うだろうと思います)
仕組みとして、activeクラスを設定/削除するだけで状態が変わるようにしてあるので、setTimeoutのような時間差を設定する必要もなくなります。
また、簡単なスクリプトで済むのでjQueryも不要です。
以下、ご参考までに。
<!DOCTYPE HTML>
<html lang="ja">
<head><title>Sample</title>
<style>
#menu {
position: relative; cursor: pointer;
width: 45px; height: 36px;
}
#menu span {
position: absolute;
width: 100%; height: 3px;
line-height: 0;
background-color: #666;
border-radius: 2px;
transition: 0.7s;
}
#menu span { top: 0; left: 0; }
#menu span:nth-child(2) { top: 16px; left: 0; }
#menu span:nth-child(3) { top: 32px; left:0; }
#menu.active span:first-child {
transform: translateY(16px) rotate(135deg);
}
#menu.active span:nth-child(2) { left: 22px; width: 0; }
#menu.active span:nth-child(3) {
transform: translateY(-16px) rotate(-135deg);
}
#navi {
position: absolute;
top: 0; left: -200px;
margin-top: 50px;
width: 130px; height: calc(100% - 50px);
background-color: rgba(0, 0, 0, 0.3);
transition: 0.5s;
}
#navi a { text-decoration: none; }
#menu.active + #navi { left: 0; }
</style>
<script>
window.addEventListener('DOMContentLoaded', e => {
const
ELM = s => document.querySelector(s),
ADDEvt = (e, f) => { e.addEventListener('click', f) },
menu = ELM('#menu');
ADDEvt( menu, e => { menu.classList.toggle('active') });
ADDEvt(ELM('#navi'), e =>{
if(e.target.nodeName == "A") menu.classList.remove('active');
});
});
</script>
</head>
<body>
<section>
<div id="menu">
<span></span><span></span><span></span>
</div>
<nav id="navi">
<ul>
<li><a href="a.html">A</a></li>
<li><a href="b.html">B</a></li>
<li><a href="c.html">C</a></li>
<li><a href="d.html">D</a></li>
<li><a href="#e">E</a></li>
</ul>
</nav>
</section>
</body>
</html>
早速ありがとうございます!説明が足りず申し訳ございません。CSSをなるべく貼り付けようと思いながら、文字数オーバーになりどの部分を提示するのがいいのか分からず、失礼いたしました。
そして、以下で解決しました!
<script>
$(info => {
$(".menu li a").on('click', info =>{
setTimeout(()=>{ $(".nav-container").hide(); }, 30);
/*→追加部分*/ $("#nav").prop("checked", false);
});
$(".bottom-menu-content").on('click', info => {
$(".nav-container").show();
});
});
</script>
<input type="checkbox" id="nav" />の「:checked」によってハンバーガー三本線<label for="nav" class="menu-bar"></label>の切り替えをしているようだったので、このチェックを外す処理を追加したらバッテンから三本線に戻りました。三本線はmenu-barで以下のように作っていました。
説明不足のなか細やかに教えて頂きありがとうございました。
CSS
.bottom-menu-content label.menu-bar:before {
content: '';
width: 40px;
height: 4px;
position: absolute;
top: 10px;
left: 0px;
}
.bottom-menu-content label.menu-bar:after {
/*beforeと同じ内容*/;
top: 20px;
left: 0px;
}
省略 input#nav:checked~label.menu-bar:before {
/*バッテンにしたときの斜め棒*/
}
省略 input#nav:checked~label.menu-bar:after {
/*バッテンにしたときの斜め棒*/
}
No.3
- 回答日時:
No2です
>イベント処理外、というのは以下で合っていますか。
何をなさりたいのかわからなくなってきましたけれど・・・
こういうことではないのでしょうか?
※ 私が勝手に解釈した内容です
※ ご提示のままではCSSが邪魔するので、最低限の修正を加えてます
<!DOCTYPE HTML>
<html lang="ja">
<head><title>Sample</title>
<style>
.nav-container {
position: absolute;
/* left: -50%; */
top: 0;
height: 100%;
width: 130px;
background-color: rgba(0, 0, 0, 0.7);
display: none;
}
</style>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6 …
<script>
$(e => {
$(".menu li a").on('click', e =>{
setTimeout(()=>{ $(".nav-container").hide(); }, 30);
});
$(".bottom-menu-content").on('click', e => {
$(".nav-container").show();
});
});
</script>
</head>
<body>
<div class="bottom-menu-content">
<input type="checkbox" id="nav" />
<label for="nav" class="menu-bar"></label>
<label for="nav" class="toggle-label">MENU</label>
<nav class="nav-container">
<div class="wrapper">
<ul class="menu">
<li><a href="a.html" class="link-nav">A</a></li>
<li><a href="b.html" class="link-nav">B</a></li>
<li><a href="c.html" class="link-nav">C</a></li>
<li><a href="d.html" class="link-nav">D</a></li>
<li><a href="#e" class="scroll link-nav">E</a></li>
</ul>
</div>
</nav>
</div>
</body>
</html>
早速ありがとうございます!
クリックしたら閉じる、できました!
そして、すみません。
現在、ハンバーガーをクリックすると三本線がバッテンへ変化し、リンク先をクリックするとバッテンが三本線へ戻り各ページへ遷移するにようになっています。これを「#e」をクリックしたときも同様の流れにできたらと思います。今は「#e」をクリックしたときはバッテンのままとなっています。
以前記入したこの部分で開閉のチェックをしているのかと思い、
<script>
$('#nav').change(function () {
if ($('#nav').is(":checked")) {
$('body').css('overflow', 'hidden');
} else {
$('body').css('overflow', 'auto');
}
});
</script>
以下の部分に一文追加してみたのですが、値が変わるだけで、バツ印のままでした。
<script>
$(e=> {
$(".menu li a").on('click', e=>{
setTimeout(()=>{ $(".nav-container").hide(); }, 30);
/*追加→*/ $('body').css('overflow', 'auto');
});
$(".bottom-menu-content").on('click', e=> {
$(".nav-container").show();
});
});
</script>
その他、CSS部分で記載したほうがよい箇所ございましたらご指摘頂けますと幸いです。
度々申し訳ございません。
どうぞよろしくお願いいたします。
No.2
- 回答日時:
No1です。
>CSSに「.hide { display: none; }」~~みましたが、
>動きが変わりませんでした。
あらら…、確認しました。間違ってしまったようです。ごめんなさい。
同時にいろいろ試していたので、2)の設定を外し忘れてテストしてしまっていたようです。(←言い訳 笑)
どうやらイベント処理終了時に、jQuery側が「display:block」を再設定しているように見受けられます。
(そのために、処理中に非表示にしても効かないようです)
…というわけで、2)の方法なら動作するはずですので、そちらを試してみてください。
早速ありがとうございます。
イベント処理外、というのは以下で合っていますか。
動きが変わらず、その他確認事項ございましたら教えてください。
nav-containerのCSSを念のため記載いたします。
<script>
$(window).load(function() {
setTimeout(()=>{ $(".nav-container").hide(); }, 30);
$(".menu li a").click(function(event) {
$(".nav-container").hide();
});
$(".bottom-menu-content").click(function(event) {
$(".nav-container").show();
});
});
</script>
CSS
.nav-container {
position: absolute;
left: -50%;
top: 0;
height: 100%;
width: 130px;
background-color: rgba(0, 0, 0, 0.7);
}
No.1
- 回答日時:
こんにちは
>ハンバーガーメニューをクリックしたら
CSS等何もないので、どれが「ハンバーガー」なのかわかりませんけれど、ご提示のスクリプトの
>$(".nav-container").hide();
が動作しないのかなと解釈しました。
jQueryの内部を調べてはいませんけれど、雰囲気からすると、event.targetの非表示に制限がかかってるっぽいですね。
素のスクリプトだけで同様の処理を試してみたところ、問題なく非表示にできます。
対処療法的になってしまいますが、間接的に非表示にすれば処理できるようです。
あるいは、(簡単な処理なので)素のスクリプトのみで実装してしまうかですね。
以下、jQueryでも動作する方法。
1)クラスを利用する
CSSであらかじめ
.hide { display: none; }
などを設定しておいて、スクリプトからは
$(".nav-container").addClass('hide');
を実行する。
2)イベント処理外で非表示にする
setTimeout(()=>{ $(".nav-container").hide(); }, 30);
などとしておく。
1)、2)どちらでも動作します。
他にも方法はあると思いますし、原因をきちんと調べた上ではないので申し訳ありませんけれど、とりあえずご参考までに。
早速ありがとうございます。
CSSに「.hide { display: none; }」を追加して以下のようにしてみましたが、動きが変わりませんでした。
〇index.html
$(window).load(function() {
$(".menu li a").click(function(event) {
$(".nav-container").addClass('hide');
});
$(".bottom-menu-content").click(function(event) {
$(".nav-container").show();
});
});
購入したテンプレートを修正しているのですが、よく見ると、最初の方で以下のようにあり、これが関係あるのか?と見ていました。
index.html
<script>
$('#nav').change(function () {
if ($('#nav').is(":checked")) {
$('body').css('overflow', 'hidden');
} else {
$('body').css('overflow', 'auto');
}
});
</script>
CSS部分を貼り付けようとしたら文字数オーバーになってしましました。
その他必要な情報ありましたら確認いたします。
何か、その他確認事項ございましたら教えてください。
どうぞよろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- HTML・CSS 書籍を見つつサイト造りの練習をしているのですが、見た目が一致しません 2 2022/11/28 15:00
- HTML・CSS テキストを画面の真ん中に配置したいです。 2 2022/11/25 16:11
- HTML・CSS htmlについて質問です! 写真のように写真の部分が?になってしまいます。 ファイルもしっかり選べて 1 2023/07/09 21:17
- HTML・CSS ヘッダーの画像にメインエリアがかぶってしまいます 1 2022/11/28 14:06
- HTML・CSS cssの display: flex;で横並びにならずに困ってます 1 2022/12/04 13:18
- JavaScript jqueryを使ったスムーススクロールのコードを書いたのですが、HTMLコード内にある、a butt 2 2022/04/14 10:59
- HTML・CSS CSS のみのタブ切り替えについて 1 2023/01/11 16:47
- PHP style.cssのjQuery条件付きcssが機能しない 4 2022/07/17 18:27
- PHP アコーディオンPHPが上手くいかない 3 2022/07/15 16:29
- Perl RSSにdiv,ul classを付けたいのですがどのようにつけるのかわからないです 2 2022/03/28 01:53
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
-
大麻の使用罪がなかった理由や法改正での変更点、他国との違いを弁護士が解説
ドイツで2024年4月に大麻が合法化され、その2ヶ月後にサッカーEURO2024が行われた。その際、ドイツ警察は大会運営における治安維持の一つの方針として「アルコールを飲んでいるグループと、大麻を吸っているグループ...
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
jQueryでスライドショー作成(無...
-
HTMLDivElement等の比較、評価...
-
jqueryでAJAX非同期通信をしてp...
-
C言語の 配列の中 出力について
-
毎日午前0時にhtmlを切り替えた...
-
Google Mapsからxmlファイルの...
-
Ajaxのエンコードで
-
javaの変数又はデータの共有
-
絞り込み検索の後にソートを追...
-
jQueryで追加した要素がマウス...
-
google翻訳ツール設置
-
階層別の組織図の自動作成について
-
google maps 吹き出しカウント...
-
jqueryのloadで読み込んだペー...
-
フォームの入力時の項目切替に...
-
C#、foreachを使ってハッシュテ...
-
ajaxでPOSTする変数の変数名を...
-
JScriptでDBへの接続方法について
-
FullCalendarについて
-
サイドバー付きGoogle Mapについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
同一ページ移動時ハンバーガー...
-
アコーディオンで多階層のメニ...
-
jQueryでスライドショー作成(無...
-
jQueryのアコーディオンメニュ...
-
jQueryで複数あるUL要素の最後...
-
jqueryで開閉メニューの状態をc...
-
CSSプルダウンメニューとjQuery...
-
jQueryを複数設置した場合の優...
-
Javascriptを使ってQRコード読...
-
JavaScriptでtabindexの変更っ...
-
JavascriptからPHPへのAjax通信...
-
SQLのmaxで求めた値を変数に代...
-
FullCalendar の複数月表示につ...
-
[jQuery UI] sortableを使いaja...
-
jQueryのblockUIをformのボタン...
-
階層別の組織図の自動作成について
-
Selenium Basicの件
-
パソコンで動くjavascriptがス...
-
二つのbxsliderをレスポンシブ...
-
JSONをperlで受け取る方法
おすすめ情報