前提・実現したいこと
mmenuで後述のソースのように構築したのですが、
ハンバーガーボタンを押してスライドメニューが出た状態になると、
開く前にposition:fixedで固定されていたヘッダーが固定されなくなります。
試してみた対処法
対処として、
.mm-opened #wrap {
height: 100vh;
}
をつけましたが、これだと、
スクロールしてコンテンツの途中までいってハンバーガーボタン押してスライドメニューが出てきたとしても、
コンテンツ本体部分(.mm-page)の先頭が表示され(先頭に戻るかたち)、
スライドメニューを閉じた後、スクロールして行ったところの続きから閲覧することができません。
#menuの中に閉じるボタンを設置するデザインにしようとして、
↓こちらのページを参考に後述のソースのように組み込んでみましたが、
https://teratail.com/questions/68466
<a href="#my-page">Close the menu</a>の部分をクリックしても閉じず、ボタンが効きませんでした。
ハンバーガーボタンが入っているheaderの固定ができなかったら、
#menu(.mm-menu)の中に閉じるボタンを設置することで対処する方法でも構いません。
何か対処方法をご存知の方がいらっしゃいましたら、
ご助言いただけると大変幸いです。
該当のソースコード
下記ページへ現状を再現したものをUPしてみました。
(解決後削除いたします)
http://saigentest.ojaru.jp/
※前述のhttps://teratail.com/questions/68466 のように#menuの中に閉じるボタンを設置してみたものは
http://saigentest.ojaru.jp/index2.html にアップいたしました。
広告が出ていますが、スライドしてきたメニューの中の<a href="#my-page">Close the menu</a>が該当の箇所です。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
今回は、http://saigentest.ojaru.jp/のコードを編集してこの問題を解決していきます。
上記のリンク先のページを見ると、質問者さんがぶつかっている問題は、以下の2つだということになりますね。
0. スライドメニューが出ると、コンテンツの先頭まで移動してしまう。
0. スライドメニューが出ると、position: fixed
で固定されていたヘッダーが消える。
-
1つ目は、質問文にて記述されている
.mm-opened #wrap
に付与したheight
プロパティを削除することで解決すると思います。 -
2つ目は、
fixedElements
というアドオンを使って、スライドメニューが表示された後もヘッダーが表示されるようにすることで解決できます。
この2つを行った結果、最終的なコードは以下のようになります。
もしも、質問者さんが上の手順でコードを修正しても問題が解決しないときは、以下のコードを実行してみてください。
HTML
1<!doctype html> 2<html lang="ja"> 3<head> 4 <meta charset="UTF-8"> 5 <meta name="viewport" 6 content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"> 7 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 8 <link rel="stylesheet" href="http://saigentest.ojaru.jp/common.css"> 9 <link rel="stylesheet" href="http://saigentest.ojaru.jp/slick.css"> 10 <link rel="stylesheet" href="http://saigentest.ojaru.jp/slick-theme.css"> 11 <link rel="stylesheet" 12 href="https://cdnjs.cloudflare.com/ajax/libs/jQuery.mmenu/5.6.1/css/jquery.mmenu.all.min.css"> 13 <title>タイトル</title> 14 <style> 15 .mm-opened #wrap { 16 height: auto; 17 } 18 </style> 19</head> 20<body> 21 22<a id="top"></a> 23<div id="wrap"> 24 <div id="main"> 25 <header class="Fixed"> 26 <div id="h1"> 27 <h1> </h1> 28 </div> 29 <a class="menu-btn" href="#menu"></a> 30 <iframe id="iHeaderSp" src="http://saigentest.ojaru.jp/header.html"></iframe> 31 </header> 32 <main> 33 <ul class="slider wideslider"> 34 <li><a href="#" target="_blank"><img src="http://saigentest.ojaru.jp/img/main1.jpg"></a> 35 <li><a href="#" target="_blank"><img src="http://saigentest.ojaru.jp/img/main2.jpg"></a> 36 </ul> 37 <div class="spaceWrap"> 38 <p style="padding:10px; margin-bottom:10px; background-color:#A0D2D8;"> 39 スクロールしてコンテンツの途中までいってハンバーガーボタン押してスライドメニューが出てきたとしても、<br> 40 コンテンツ本体部分(.mm-page)の先頭が表示され(先頭に戻るかたち)、<br> 41 スライドメニューを閉じた後、スクロールして行ったところの続きから閲覧することができません。</p> 42 <p style="padding:10px; margin-bottom:10px;">スクロールしてコンテンツの途中までいってハンバーガーボタン押してスライドメニューが出てきたとしても、<br> 43 コンテンツ本体部分(.mm-page)の先頭が表示され(先頭に戻るかたち)、<br> 44 スライドメニューを閉じた後、スクロールして行ったところの続きから閲覧することができません。</p> 45 <p style="padding:10px; margin-bottom:10px; background-color:#FFE1E1;"> 46 スクロールしてコンテンツの途中までいってハンバーガーボタン押してスライドメニューが出てきたとしても、<br> 47 コンテンツ本体部分(.mm-page)の先頭が表示され(先頭に戻るかたち)、<br> 48 スライドメニューを閉じた後、スクロールして行ったところの続きから閲覧することができません。</p> 49 <p style="padding:10px; margin-bottom:10px;">スクロールしてコンテンツの途中までいってハンバーガーボタン押してスライドメニューが出てきたとしても、<br> 50 コンテンツ本体部分(.mm-page)の先頭が表示され(先頭に戻るかたち)、<br> 51 スライドメニューを閉じた後、スクロールして行ったところの続きから閲覧することができません。</p> 52 <p style="padding:10px; margin-bottom:10px; background-color:#B5D0AE;"> 53 スクロールしてコンテンツの途中までいってハンバーガーボタン押してスライドメニューが出てきたとしても、<br> 54 コンテンツ本体部分(.mm-page)の先頭が表示され(先頭に戻るかたち)、<br> 55 スライドメニューを閉じた後、スクロールして行ったところの続きから閲覧することができません。</p> 56 <p style="padding:10px; margin-bottom:10px;">スクロールしてコンテンツの途中までいってハンバーガーボタン押してスライドメニューが出てきたとしても、<br> 57 コンテンツ本体部分(.mm-page)の先頭が表示され(先頭に戻るかたち)、<br> 58 スライドメニューを閉じた後、スクロールして行ったところの続きから閲覧することができません。</p> 59 <p style="padding:10px; margin-bottom:10px; background-color:#EAE3AC;"> 60 スクロールしてコンテンツの途中までいってハンバーガーボタン押してスライドメニューが出てきたとしても、<br> 61 コンテンツ本体部分(.mm-page)の先頭が表示され(先頭に戻るかたち)、<br> 62 スライドメニューを閉じた後、スクロールして行ったところの続きから閲覧することができません。</p> 63 <p style="padding:10px; margin-bottom:10px;">スクロールしてコンテンツの途中までいってハンバーガーボタン押してスライドメニューが出てきたとしても、<br> 64 コンテンツ本体部分(.mm-page)の先頭が表示され(先頭に戻るかたち)、<br> 65 スライドメニューを閉じた後、スクロールして行ったところの続きから閲覧することができません。</p> 66 <p style="padding:10px; margin-bottom:10px; background-color:#E2DBEC;"> 67 スクロールしてコンテンツの途中までいってハンバーガーボタン押してスライドメニューが出てきたとしても、<br> 68 コンテンツ本体部分(.mm-page)の先頭が表示され(先頭に戻るかたち)、<br> 69 スライドメニューを閉じた後、スクロールして行ったところの続きから閲覧することができません。</p> 70 <p style="padding:10px; margin-bottom:10px;">スクロールしてコンテンツの途中までいってハンバーガーボタン押してスライドメニューが出てきたとしても、<br> 71 コンテンツ本体部分(.mm-page)の先頭が表示され(先頭に戻るかたち)、<br> 72 スライドメニューを閉じた後、スクロールして行ったところの続きから閲覧することができません。</p> 73 <p style="padding:10px; margin-bottom:10px; background-color:#A8FFE2;"> 74 スクロールしてコンテンツの途中までいってハンバーガーボタン押してスライドメニューが出てきたとしても、<br> 75 コンテンツ本体部分(.mm-page)の先頭が表示され(先頭に戻るかたち)、<br> 76 スライドメニューを閉じた後、スクロールして行ったところの続きから閲覧することができません。</p> 77 <p style="padding:10px; margin-bottom:10px;">スクロールしてコンテンツの途中までいってハンバーガーボタン押してスライドメニューが出てきたとしても、<br> 78 コンテンツ本体部分(.mm-page)の先頭が表示され(先頭に戻るかたち)、<br> 79 スライドメニューを閉じた後、スクロールして行ったところの続きから閲覧することができません。</p> 80 </div> 81 </main> 82 </div> 83 <footer> 84 <div id="goTop"> 85 <a href="#top">▲<br> TOP</a> 86 </div> 87 </footer> 88</div> 89<nav id="menu" class="menuArea"> 90 <iframe id="iSlideMenu" src="http://saigentest.ojaru.jp/leftnavi.html"></iframe> 91</nav> 92 93<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script> 94<script src="https://cdnjs.cloudflare.com/ajax/libs/jQuery.mmenu/5.6.1/js/jquery.mmenu.all.min.js"></script> 95<script src="http://saigentest.ojaru.jp/slick.min.js"></script> 96<script> 97 $(function () { 98 $("#hdload").load("header.html #header"); 99 100 $('#menu').mmenu({ 101 slidingSubmenus: false 102 }); 103 104 $('a[href^="#"]:not([href*="menu"])').on("click", function () { 105 var speed = 1000; 106 var href = $(this).attr("href"); 107 var target = $(href == "#" || href == "" ? 'html' : href); 108 var position = target.offset().top - 55 + 'px'; 109 $("html, body").animate({ 110 scrollTop: position 111 }, speed, "swing"); 112 return false; 113 }); 114 115 $(window).on('scroll', function () { 116 if ($(this).scrollTop() > 1) { 117 $('body').addClass('fixed'); 118 } else { 119 $('body').removeClass('fixed'); 120 } 121 }); 122 123 $('.wideslider').slick({ 124 dots: true, 125 slidesToShow: 1, 126 autoplay: true, 127 responsive: [{ 128 settings: {} 129 }] 130 }); 131 }); 132</script> 133</body> 134</html>
投稿2018/09/02 17:35
編集2018/09/05 00:50総合スコア14731
0
JSの問題については,s8_chuさんが調べてくれたようなので,私は代替案の方を書きます
とりあえず<iframe>
をパーツの分割に使うのはおかしいので,そこは修正してもらい,
JSプラグインを使うと競合とか面倒なのでCSSで実装します
こんな感じです(HTMLができるかぎりセマンティックになるようにしました)
https://thimbleprojects.org/liveasnotes/536993/
(右上の「リミックス」ボタンからコードの閲覧・編集ができます)
対応内容
- アコーディオンメニュー
- メニュー開閉ボタン
- メニュー枠外クリックでのメニュー終了
- アコーディオンに使ったラジオボタンの初期化
- メニュー内容の
overflow: auto;
- メニュー選択時のアニメーション(矢印)
解説(抜粋)
html
1<!--こういうHTMLに--> 2 3<nav ui> 4 <input type="checkbox" id="menu_btn" dn> 5 <label id="menu_btn_tgl" for="menu_btn">≡</label> 6 <ul id="menu_w"> 7 <li> 8 <input type="radio" name="menu" id="c_menu_A" dn> 9 <label for="c_menu_A">Section A</label> 10 <ul class="child_menu"> 11 <li><a href="#sA-1">Section A-1</a></li> 12 <li><a href="#sA-2">Section A-2</a></li> 13 <li><a href="#sA-3">Section A-3</a></li> 14 </ul> 15 </li> 16 <li> 17 <input type="radio" name="menu" id="c_menu_B" dn> 18 <label for="c_menu_B">Section B</label> 19 <ul class="child_menu"> 20 <li><a href="#sB-1">Section B-1</a></li> 21 <li><a href="#sB-2">Section B-2</a></li> 22 <li><a href="#sB-3">Section B-3</a></li> 23 </ul> 24 </li> 25 <li> 26 <input type="radio" name="menu" id="c_menu_C" dn> 27 <label for="c_menu_C">Section C</label> 28 <ul class="child_menu"> 29 <li><a href="#sC-1">Section C-1</a></li> 30 <li><a href="#sC-2">Section C-2</a></li> 31 <li><a href="#sC-3">Section C-3</a></li> 32 </ul> 33 </li> 34 </ul> 35
css
1/*アコーディオン*/ 2 3.child_menu >li{ 4 overflow: hidden; 5 height: 0; 6 transition: .5s; 7} 8input[name="menu"]:checked ~.child_menu >li{ 9 height: 3em; 10} 11
css
1/*メニュー開閉ボタン*/ 2 3#menu_btn_tgl{ 4 position: absolute; 5 top: 0; 6 left: 100%; 7 width: 50px; 8 height: 50px; 9 overflow: hidden; 10 color: #fff; 11 font-size: 50px; 12 line-height: 50px; 13 text-align: center; 14 transition: left .5s; 15} 16/*ボタンの表示を書き換える*/ 17#menu_btn:checked +#menu_btn_tgl{ 18 left: 200%; 19 font-size: 0;/*元の文字を見えなくする*/ 20} 21#menu_btn:checked +#menu_btn_tgl::before{ 22 content: "×";/*追加の文字*/ 23 font-size: 50px; 24 line-height: 50px; 25} 26 27#menu_btn:checked ~#menu_w{ 28 transform: translateX(100%);/*自分自身の幅の分だけ,右側へスライド*/ 29 box-shadow: 0 1em #fff, 0 0 10px; 30} 31
css
1/*メニュー枠外クリックでのメニュー終了*/ 2 3/*メニュー枠外いっぱいに広がる半透明の巨大ボタン*/ 4#menu_btn:checked +#menu_btn_tgl::after{ 5 content: ""; 6 position: fixed; 7 top: 0; 8 left: 0; 9 z-index: -1; 10 width: 100vw; 11 height: 100vh; 12 background: rgba(0,0,0,.1) 13} 14
js
1/*アコーディオンに使ったラジオボタンの初期化*/ 2 3/* You need to set these at last of a document. */ 4 5function offRadio() { 6 var radios = document.querySelectorAll('[name="menu"]'); 7 for(i=0; i<radios.length; i++){ 8 radios[i].checked = false; 9 } 10} 11 12document.getElementById('menu_btn_tgl').addEventListener('click', offRadio); 13
css
1/*メニュー内容のoverflow: auto;*/ 2#menu_w{ 3 width: 200px; 4 height: calc(100vh - 1em); 5 overflow-x: hidden;/*y方向のscrollだけ許可*/ 6 background: #fff; 7 padding: 1em; 8 box-shadow: 0 1em #fff; 9 transition: .5s; 10} 11
css
1/*メニュー選択時のアニメーション*/ 2 3label[for^="c_menu"]{ 4 position: relative; 5} 6label[for^="c_menu"]::after{ 7 content: ""; 8 position: absolute; 9 top: .9em; 10 right: 1em; 11 display: block; 12 width: 1em; 13 height: 1em; 14 background-size: 1em 7px, 7px 1em; 15 background-position: -1em calc(1em - 7px), calc(1em - 7px) 1em; 16 background-image: 17 linear-gradient(90deg, #aaa 0%, #aaa 100%), 18 linear-gradient(0deg, #aaa 0%, #aaa 100%); 19 background-repeat: no-repeat; 20 transform: rotateZ(45deg); 21} 22input[name="menu"]:checked +label[for^="c_menu"]::after{ 23 animation: c_menu_after .5s linear forwards; 24} 25@keyframes c_menu_after{ 26 50%{ 27 background-position: 0 calc(1em - 7px), calc(1em - 7px) 1em; 28 } 29 50.1%{ 30 background-position: 0 calc(1em - 7px), calc(1em - 7px) .5em; 31 } 32 100%{ 33 background-position: 0 calc(1em - 7px), calc(1em - 7px) 0; 34 } 35} 36
という感じです
Keywords:
- 擬似要素(
::before
,::after
) - 擬似クラス(特に
:checked
) - 隣接セレクタ(
+
) - 兄弟セレクタ(
~
) - 属性セレクタ(
[]
) user-select
で文字を選択不可にbackground
系プロパティの複数指定linear-gradient()
による背景画像(グラデーション)生成transform
プロパティの活用rgba()
による色指定@keyframes
によるアニメーションelement.checked
でのチェック状態の確認・上書きaddEventListener()
による関数の実行
など
細かい説明はちょっと書ききれないですが,こういうやり方もあるんだということぐらいは知っておいても良いかなと思います
ほぼHTMLとCSSで実装し,唯一書いたJSがこれ↓だけなので,かなりクリーンなソースになったように思います
js
1function offRadio() { 2 var radios = document.querySelectorAll('[name="menu"]'); 3 for(i=0; i<radios.length; i++){ 4 radios[i].checked = false; 5 } 6} 7 8document.getElementById('menu_btn_tgl').addEventListener('click', offRadio);
代わりにCSSが若干長めですが,慣れればこっちのが楽なので,余力があればお試しください
(CSSの力を布教したい)
あ,ちなみにiframeでパーツを分けるデメリットとして,読み込みが少し遅くなる,SEOに弱くなるかも,コードがバラバラになって管理しづらい,iframe内の操作が若干面倒,iframe内のイベントを他の要素に影響させる方法が面倒,などが挙げられます.
いろいろと不自由になりがちなので,ふつうに直接HTMLを記述する方が良いかなと思います
投稿2018/09/03 03:58
編集2018/09/03 15:20総合スコア1284
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/04 08:28
2018/09/04 08:40
2018/09/13 13:01
0
まさかとは思いますが,添付のコードをそのまま,HTMLとして保存してはいませんよね?
そうであるならコードを修正し,そうでないなら以下のように質問文を修正してください
また,下記ページを参照してください
https://teratail.com/help/question-tips#questionTips3-7
それから,現時点で示されたコードで確認できるのは以下の通りです
(htmlはいくらか追記しています)
(ボタンを押しても反応しません)
既にサーバーを借りているなら,そのサーバー上にデモページを設置するか,各種オンラインエディタから公開URLを引っ張ってくるかして,即座にデバッグ作業が行える状態にしてください
投稿2018/08/25 15:44
編集2018/08/25 16:35総合スコア1284
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/02 09:58
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/02 17:44
2018/09/04 07:43
2018/09/05 00:50
2018/09/13 13:04