前提・実現したいこと
jQueryを使用し、アコーディオンメニューを実装しています。
ページ内リンク・ページ外リンクからアコーディオンメニューを開いたときに、スムーススクロールをしながらアコーディオンメニューのTOPへ移動させたいです。
発生している問題・エラーメッセージ
現在、以下のようなコードで実装していますが、ページ内リンクで開いたとき、アンカーリンクが上手く作動しなく、ページ全体の上部へスクロールしてしまいます。
html
1 <dl class="js-accordion"> 2 <div class="container"> 3 <dt>アコーディオンメニュー01</dt> 4 <dd id="link01">アコーディオンメニュー01の内容。<a href="#link02">メニュー02を開く</a></dd> 5 </div> 6 <div class="container"> 7 <dt>アコーディオンメニュー02</dt> 8 <dd id="link02">アコーディオンメニュー02の内容。<a href="#link03">メニュー03を開く</a></dd> 9 </div> 10 <div class="container"> 11 <dt>アコーディオンメニュー03</dt> 12 <dd id="link03">アコーディオンメニュー03の内容。<a href="#link04">メニュー04を開く</a></dd> 13 </div> 14 <div class="container"> 15 <dt>アコーディオンメニュー04</dt> 16 <dd id="link04">アコーディオンメニュー04の内容。<a href="#link05">メニュー05を開く</a></dd> 17 </div> 18 <div class="container"> 19 <dt>アコーディオンメニュー05</dt> 20 <dd id="link05">アコーディオンメニュー05の内容。<a href="#link01">メニュー01を開く</a></dd> 21 </div> 22 </dl>
css:
1 <style> 2 .container { 3 margin-bottom: 300px; 4 } 5 6 .js-accordion dd { 7 display: none; 8 } 9 10 .js-accordion dd:target { 11 display: block; 12 height: auto; 13 } 14 </style>
js:
1 2 $(function () { 3 $('.js-accordion dt').on('click', function () { 4 $(this).next().slideToggle(); 5 }); 6 }); 7 8 var headerHeight = 80; 9 var urlHash = location.hash; 10 $('a[href^="#"]').click(function () { 11 var href = $(this).attr("href"); 12 var target = $(href); 13 var position = target.offset().top - 30; 14 $('body,html').stop().animate({ scrollTop: position }, 500); 15 }); 16
試したこと
スムーススクロールのjQueryを外すと、きちんとアンカーリンクの場所へ移動してくれます。
http://www.ofuta.me/jquery/585
上記の記事を確認し、どうやらtarget.offset().top;
が問題であることは分かったのですが、解決策を試してもうまく動作しませんでした。
補足事項
別ページからのアンカーリンクの取得は上手くいき、下記の記述を追加することで別ぺージからのスムーススクロールも可能したが、同一ページでのアンカーリンクだけが上手く動作しませんでした。
js
1 if (urlHash) { 2 $('body,html').stop().scrollTop(0); 3 setTimeout(function () { 4 var target = $(urlHash); 5 var position = target.offset().top - headerHeight; 6 $('body,html').stop().animate({ scrollTop: position }, 500); 7 }, 100); 8 } 9
ご教示いただけますと幸いです。よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。