• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:jQueryでページ内リンクに誤差が出る。)

jQueryページ内リンクの誤差を解決する方法

このQ&Aのポイント
  • フェード効果を追加したページ内リンクをクリックすると、上に300px程ずれてしまうエラーが発生しています。
  • この問題を解決するためには、jQueryのコードを修正する必要があります。
  • まず、jQueryのコードの一部を変更して、リンク先の要素の表示を切り替える方法を修正します。そして、スクロール位置の調整を行うために、アニメーション終了時に`window.location.hash`を使ってスクロール位置を保持し、再度スクロールさせることで正しい位置に表示させます。

質問者が選んだベストアンサー

  • ベストアンサー
  • fujillin
  • ベストアンサー率61% (1594/2576)
回答No.1

どうやら、私の回答だったような… 最初は、ページ内リンクをキャンセルし忘れてブラウザがスクロールしているのかと思いましたが、ちゃんとキャンセルはされているみたいですね。 タブのコンテンツの後ろに、他のコンテンツがあればご指摘のようなスクロールは起こりません。 例えば、ご提示のソースの後ろに  <div style="height:500px;">続き</div> のようなものがあれば、ご指摘のスクロールはおこらないと思います。 原因は、fadeOutしてからfadeInしているので、fadeOutした時に瞬間的にタブコンテンツ表示部分の高さが0になるため、ブラウザはそこをページの最後と判断してしまい、ご提示の例でいえば、<hr>の部分を画面の一番下にくるようにスクロールしてしまうためと思われます。 (その後で、表示部分が追加されても自動的にスクロールはしません) >これを直すにはどうすればいいでしょうか? 方法はいろいろあるかと思いますが、 1)現状では、タブコンテンツの表示部分の高さが可変になっていますが、   固定高さにして表示領域を確保しておく。   (ラッパーのdivの高さを確保しておくなど) 2)タブコンテンツの表示部分をposition:absoluteなどにしておいて、重ねて   表示する方式にし、activeな部分が上にくるようにしてfadeInしながら   それまでの表示要素をfadeOutする。   (現状に近い動作にするなら、fadeInをすぐに始めずにfadeOut終了に    少し前にするとか…) 3)ラッパーのdivの高さを、タブ表示の内容(の高さ)に応じて、明示的に確保  するような処理を追加し、fadeOut後fadeInを行なう(現在の順序)  (高さの変更もアニメーションで行なうとか…) 4)最初に表示していた部分(スクロールの量を)覚えておいて、最後に、同じ位置  を表示するように全体をスクロールする処理を追加する。 などなど。 とりあえず、思いつくのはこんなところでしょうか。

関連するQ&A