2013-08-09 20 views
29

アンカーリンクを使用してさまざまなセクション要素にスムーズにスクロールする、固定位置のナビゲーションバーを使用して1ページのサイトを構築しています。要素へのスクロールのデフォルトの動作は、ブラウザウィンドウの上部に配置することです。代わりに、要素を画面の中央に揃えたいと思います。jQuery - 要素をアンカーリンクで上部の代わりに画面の中央にスクロール

私は、ナビゲーションのために、このマークアップを使用します。

<nav class="main-nav"> 
    <a href="#top">Top</a> 
    <a href="#section-1">Section 1</a> 
    <a href="#section-2">Section 2</a> 
    <a href="#section-3">Section 3</a> 
    <a href="#section-4">Section 4</a> 
    <a href="#section-5">Section 5</a> 
</nav> 

私はスクロールを滑らかにするためにkswedberg's jQuery Smooth Scroll pluginを使用しています。

$('.main-nav a').smoothScroll({ 
    offset: 0, 
    speed: 700 
}); 

私はそれが垂直方向に中央揃えていますように((window).height/2) - (element height/2)ようにオフセットを設定したいが、私はそれを正しく実行する方法を見つけ出すのに役立つ必要があります。私はこのようにそれを開始します。

私はそれを必要とする:

  • 要素の高さを取得し、2
  • ことによってそれを分割ウィンドウの高さを取得し、2
  • で割り、後者
  • から、前者を引きます
  • 可能な場合は、多くのANCHがあるので要素はウィンドウ

よりも高い場合には、デフォルトごとにトップにそれを揃えますまたはリンク私は、リンクのクリックされたアンカーリンクの要素の高さを確認するか、すべてのアンカーリンクに対してsmoothScrollを開始する必要があると仮定します。

誰でもこの方法を知っていますか?

+0

プラグインですが、 'offset'プロパティは有望です。 –

+0

私は' offset'プロパティを使うつもりですが、動的にその値を計算するのに助けが必要です。それが私が求めていることです。 –

+0

ブラウザでスクロールしてもスムーズにスクロールできるようにするページよりも、面倒なことはありません。 –

答えて

30

APIは、要素にバインドされていないsmoothScrollを実行する方法を提供します。 アンカータグのonclickイベント内でこのメソッドを実行して、そのタグのターゲットにアクセスできるようにします。次に、あなたが望む位置に到達するために必要なものを計算することができます。 offsetは相対オフセットではなく絶対オフセットになっているので、スクロールするために正確な位置を取得する必要があります。

$('.main-nav a').on('click', function(e) { 
    var el = $(e.target.getAttribute('href')); 
    var elOffset = el.offset().top; 
    var elHeight = el.height(); 
    var windowHeight = $(window).height(); 
    var offset; 

    if (elHeight < windowHeight) { 
    offset = elOffset - ((windowHeight/2) - (elHeight/2)); 
    } 
    else { 
    offset = elOffset; 
    } 

    $.smoothScroll({ speed: 700 }, offset); 
    return false; 
}); 
+0

ブリリアント!私はこのようなonclickイベントを作成しようとしましたが、正しい値を得るためには2回のクリックが必要でした。おそらく私はそれを要素に束縛する必要がないことを気付かなかったからでしょう。ありがとうございました! –

30

ここscrollToを(使用したプレーンなjQueryを使ってそれを行う方法です)

$('.main-nav a').on('click', function(e) { 
    var el = $(e.target.getAttribute('href')); 
    var elOffset = el.offset().top; 
    var elHeight = el.height(); 
    var windowHeight = $(window).height(); 
    var offset; 

    if (elHeight < windowHeight) { 
    offset = elOffset - ((windowHeight/2) - (elHeight/2)); 
    } 
    else { 
    offset = elOffset; 
    } 
    var speed = 700; 
    $('html, body').animate({scrollTop:offset}, speed); 
}); 

これは、この質問からstrakerのコードとコードの組み合わせです:私は精通していないよjQuery scrollTo - Center Div in Window Vertically

+0

私は$(window).height()でスクリーンよりも大きな文書で運が悪かった。代わりに、window.innerHeightを使用してviewPortの高さを取得しました。ここをクリックしてください:https://stackoverflow.com/questions/8794338/get-the-height-and-width-of-the-browser-viewport-without-scrollbars-using-jquery – xtravar

+1

ウィンドウがスクロールの場合はここに注意してくださいdiv、目標を達成するためのオフセットの計算の2つのステップ:1.ターゲット要素の一番上までスクロールします。 2。サイズの半分でスクロールアップします。 $(window).height()/ 2 + $(el)。$(el).offset()。 height()/ 2''' – TerrenceSun

+0

@TerrenceSunこの式をありがとうございます!!選択したアイテムを水平スクロールdivに配置する必要がありました。私はウィンドウをスクロール可能なdivに置き換え、 'top'を' left'sと 'height'sを' width'sに切り替えました。完全に動作します。 –

関連する問題