2012-08-09 9 views
6

私は1ページのサイトに対して滑らかなスクロールスクリプトを使用しています。各アンカーにスクロールします。jQueryスクリプト異なるオフセットを持つ異なるセクションへスムーズにスクロール

デザイン上、アンカースナップをページの上部にまっすぐに置くことはできません。私はページの上にある隠れたアンカーを作成しなければならなかったので、上に正確にスナップしません。私は、このスクリプト内で発生するオフセットを作ることができることを知らされてい

jQuery(document).ready(function($) { 
    $(".scroll").click(function(event){ 
     event.preventDefault(); 
     $('html,body').animate({ 
      scrollTop: $('[name="' + this.hash.substring(1) + '"]').offset().top 
     }, 500); 
    }); 
}); 

:ここ

は、私が現在使用しているスクリプトです。これらのほとんど隠されたアンカーをどこにでも持つのではなく、単に頂点の最後に何かを加えて、それを特定のピクセル数だけオフセットすることができます。 250

$('html,body').animate({ 
    scrollTop:$('[name="' + this.hash.substring(1) + '"]').offset().top - 250 
}, 500); 

問題は、これは常に250ピクセルもオフセットになるだろうが、私は、例えば、ポートフォリオのdivは200pxのオフセットで固定することができるように、それは可変とする必要があるが、 - それはトップだろうdivに連絡するのは50ピクセルだけです。

誰かが、私がdivを固定していることに基づいてこのトップ - [変数]を調整できるスクリプトにセレクタを書き込むのを手伝ってもらえますか?

+0

コードスニペットを試しましたか?これは、アンカーのオフセットを取得し、動的値から250を引いたものとして機能します。確かに、大括弧で計算を囲んでみてください。 – Bojangles

+0

http://jsfiddle.net/で簡単なテストコードを提供できますか?あなたの 'div#contact'と' div#portfolio'はどこにあるのか分かりません。 – Giberno

+0

こんにちは、私は試しました。それは動作しますが、常にdivの上に正確に250pxの位置にあります。これは私が望むものではありません。 – Francesca

答えて

6

あなたは、指定されたアンカーのオフセットを決定するためのルールが何であるかについて実際には指摘していません。トップの値です。

おそらくもっとも簡単なのは、名前付きアンカーや、スクロールするために探している要素のオフセットを調整するために使用できる属性を導入することでしょう。

たとえば、data-section-offsetという新しい属性の名前付きアンカーがあり、のオフセットがで20pxになりたいとします。

<a id="myAnchor" data-section-offset="20">My Section</a> 

クリックハンドラでは、アニメーションの属性値を引き出すことができます。

jQuery(document).ready(function($) { 

    $(".scroll").click(function(event) { 
     event.preventDefault();   
     var $anchor = $('#' + this.hash.substring(1)); 
     $('html,body').animate({ 
      scrollTop: $anchor.offset().top - $anchor.attr('data-section-offset') 
     }, 500);   
    }); 
}); 

さらなる例を示すためにここにはfiddleがあります。

注@BenはHTML5 specification for custom data attributesは非常に有用で指摘したように、属性は、(上記のように)のいずれかのよう

$anchor.attr('data-section-offset') 

又はこの

$anchor.data('section-offset') 

等を引っ張ることができるようにjQueryのデータメソッドを有します>HTML 5 data- Attributes

+0

@BenSwayneご意見ありがとうございます - 私はカスタムデータ属性のHTML5仕様について知らなかったことを認めなければなりません。 –

2

まず、古い<a name=の規約を使用する必要はありません。アンカーHTML anchors on w3schoolsのw3schoolsページをご覧ください。コンテナ要素をidでリンクするのがベストプラクティスです。

したがって、コンテンツを含むdivにリンクする場合は、<div id="linkToMe">My content in here.</div><a href="#linkToMe">The link text</a>を使用してください。

これはもちろん、名前で要素を探しているので、上記のコードを壊します。あなたはidでそれらを探したい(とにかく速く!)。

私のウェブページには、時にはposition: fixed;というツールバーがあります。スクロールするときにスクロール位置をオフセットして、ページ上部のツールバーの下には表示されません。

これは私がそれを行う方法である。その後、

function goToByScroll(id) { 
    //Find toolbar height 
    var pageOffset = 0, 
     hdr = $('#sub'), 
     tb = $('#sitemenu'); 
    if (hdr.css('position') == 'fixed') { pageOffset += hdr.height() } 
    if (tb.css('position') == 'fixed') { pageOffset += tb.height() } 

    //Scroll the document 
    $('html,body').animate({ scrollTop: $("#" + id).offset().top - pageOffset }, 'slow'); } 

とjQueryでそれをワイヤー:

$(".jumptoid").click(function (e) { 
    e.preventDefault(); 

    // Track in google analytics if you are using it. 
    _gaq.push(['_trackEvent', 'Jump to Id', e.currentTarget.host, this.href, 0]); 

    // Scroll to item location using jquery 
    goToByScroll(this.href.split('#')[1]); 

    // Push History in browser bar so the forward/back button works 
    window.location.hash = this.href.split('#')[1]; 

    return false; 
}); 

これは完全に/私のヘッダーの下にターゲット要素の上部を揃えますツールバーが位置固定の場合はツールバー、そうでない場合はブラウザのビューポートの上部に表示されます。

あなたの場合は、オフセットを計算する方法を変更するか(hdrtbのアイテムの代わりに、他の数式を使用するか、他のページ要素を見ることができます)、またはカスタム属性を推奨として使用できます@chris moutrayによる

アトリビュートを使用する場合は、data-で始まる提案されたhtml5標準を使用して、検証に合格するようにします。たとえば、<div id="linkToMe" data-scroll-offset="250">My content here</div>の場合は、@ chrisのコードを使用して$anchor.attr('data-scroll-offset')のような属性を取得します。

+0

こんにちは、ありがとう、私はこれを見て、それがどのように動作するかを見ていきます。私がdivコンテナ自体にリンクすることができない理由は、これが上にコンテナを置く(私はそれが少し相殺されたかった)ので、これがうまくいくので私は非常に幸せになる純粋にでした:)あなたの時間をありがとう。 – Francesca

+0

@FrancescaHaselden答えを受け入れることで問題が解決した場合はお知らせください。それ以上の説明が必要な場合はコメントを追加することをお勧めします。 – BenSwayne

関連する問題