2013-11-20 14 views
13

私はハードコード化された高さとスクロールコンテナを持っています。スクロール要素

.scrollingContainer { 
    overflow: scroll; 
    height: 400px; 
} 

私はそうコンテナをスクロールしたい項目をクリックすると、このスクロールコンテナは、アイテムのリストが含まれていますクリックされたアイテムがスクロールしているコンテナの上部にあることを示します。

$('.scrollingContainer li a').click(function(event) { 
    var vpHeight = $('.scrollingContainer').height(); 
    var offset = $(this).offset(); 
    $('.scrollingContainer').animate({ 
    scrollTop: vpHeight - offset.top 
    }, 500); 
}); 

上記は私が現在行っていることですが、私は実行する必要がある数学的計算に問題があります。また、私はvar offset値が間違っていると思うので、スクロールしているコンテナの位置に基づいてオフセット値を取得することを望んでいたページの上部からオフセットを取得しているようです。

+0

はここでフィドルです。それは問題を実証していますか?それは動作するようです。 http://jsfiddle.net/isherwood/LqQGR – isherwood

+0

はい、問題は、私が実際にスクロールする位置を制御していないということです。また、2回クリックすると、以前にスクロールした位置に固定するのではなく、2回スクロールします。 – CLiown

+0

この質問は未解決ですか? – isherwood

答えて

2

ここでは実際の例です:http://jsfiddle.net/LqQGR/12/

あなたは、要素の位置(コンテナの上端とリンクの間の距離) にあなたのscrollTopスプライトを設定したい

プラス現在のscrollTopスプライト(の頂​​部との間の距離コンテンツを含んでおり、現在のところは、それが目に見えるのです。また

:。。あなたはそれが内のコンテンツのoffset parentだそうことposition: relativeにごscrollingContainerを設定する必要が

var $scrollingContainer = $('.scrollingContainer'); 

$scrollingContainer.on('click', 'a', function (event) { 
    var vpHeight = $scrollingContainer.height(); 
    var scrollTop = $scrollingContainer.scrollTop(); 
    var link = $(event.currentTarget); 
    var position = link.position(); 

    $('.scrollingContainer').animate({ 
     scrollTop: (position.top + scrollTop) 
    }, 500); 
}); 
+0

ハハハ、かなり簡単なものが私たちを引き上げていました。私が気付かなかったのは、あなたが誤って完璧に働いていたからです。 scrollingContainerをposition:relativeに設定して、オフセットの親となるようにする必要があります。私は自分の答えを更新しました。今はもっと簡単です。 – Nate

+1

ところで、私の答えは、すべてのアンカータグにクリックイベントリスナーを個別に追加するよりも優れています。これは1つだけのリスナーを追加します。これはパフォーマンスが向上します。委任されたイベントの詳細については、こちらをご覧ください:http://api.jquery.com/on/#direct-and-delegated-events – Nate

+0

Btwは、あなたが元の質問の質問者ではなく、仲間の回答者であることを認識しました。私の発言がもう少し意味をなさないことを願っています。ごめんなさい! – Nate

39

this answerの変動は、トリックを行います。

http://jsfiddle.net/isherwood/LqQGR/14

var myContainer = $('.scrollingContainer') 

$(myContainer).on('click', 'a', function() { 
    var scrollTo = $(this); 
    myContainer.animate({ 
     scrollTop: scrollTo.offset().top - myContainer.offset().top + myContainer.scrollTop() 
    }); 
}); 
関連する問題