- ベストアンサー
jQueryページ内リンクの誤差を解決する方法
- フェード効果を追加したページ内リンクをクリックすると、上に300px程ずれてしまうエラーが発生しています。
- この問題を解決するためには、jQueryのコードを修正する必要があります。
- まず、jQueryのコードの一部を変更して、リンク先の要素の表示を切り替える方法を修正します。そして、スクロール位置の調整を行うために、アニメーション終了時に`window.location.hash`を使ってスクロール位置を保持し、再度スクロールさせることで正しい位置に表示させます。
- みんなの回答 (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)最初に表示していた部分(スクロールの量を)覚えておいて、最後に、同じ位置 を表示するように全体をスクロールする処理を追加する。 などなど。 とりあえず、思いつくのはこんなところでしょうか。