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

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

詳細はこちら
jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

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

Q&A

解決済

2回答

3768閲覧

アンカーリンクでアコーディオンメニューを開かせる際の挙動

mmrk

総合スコア0

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

CSS

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

0グッド

0クリップ

投稿2021/03/23 03:54

前提・実現したいこと

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

ご教示いただけますと幸いです。よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

自己解決

上記、解決しました。idを付与する場所が異なっていました。
display:noneで非表示にしているタグにidをつけていたため、アンカーリンクで反応しなくなっていたようです。
親の要素の.containerに付与し、cssを書き換えることで解決しました。

css

1 .js-accordion .container:target > dd { 2 display: block; 3 height: auto; 4 }

投稿2021/03/24 01:47

mmrk

総合スコア0

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

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

0

ごめんなさい、回答する質問間違えました

投稿2021/03/23 05:21

編集2021/03/23 05:32
yambejp

総合スコア116661

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問