0



「上に移動」ボタンと「下に移動」ボタンを使用して、ウィンドウを次または前のセクション (div) にスクロールする単一ページを作成しようとしています。私が使用する方法は簡単です。たとえば、特別な ID を持つ 5 つの要素があります。jquery を使用して「pos」という名前の配列を作成し、すべての要素の位置を保持します。「上に移動」ボタンと「下に移動」ボタンをクリックしてこの配列をチェックし、値が低いまたは高い位置が含まれている場合、ウィンドウがスクロールします。

私は jfiddle を作成したので、ここでこの例を確認できます - http://jsfiddle.net/YbqAB/

jfiddle サイトでは機能しますが、私のページでは、$(window).scrollTop() の値が現在の位置と等しい場合、次の位置に存在する場合でも、「下に移動」ボタンはウィンドウをスクロールしません。この問題は常に発生するわけではありません。ページを何度も再表示 (CTRL + F5) すると、この問題が表示される場合と表示されない場合があります。

たとえば、位置が 0px、300px、500px、800px の 4 つの div がある場合、「下に移動」ボタンをクリックすると、ウィンドウは 300px の div に正常にスクロールします。しかし、もう一度「下に移動」ボタンをクリックして、500px の位置で次の div に移動すると、何も起こりません。マウスホイールでウィンドウをスクロールすると、数ピクセル下に移動すると、「下に移動」ボタンが再び機能し、ウィンドウが 500px の div にスクロールされます。

私は何を間違えましたか?あるいは、もっと簡単な解決策を知っている人もいるかもしれません。ありがとう。

HTML:

<div id="buttons">
    <div id="top-button"> up </div>
    <div id="bottom-button"> down </div>
</div>

<div id="position1"> First block </div>
<div id="position2"> Second block </div>
<div id="position3"> Third block </div>
<div id="position4"> Fourth block </div>
<div id="position5"> Fifth block </div>

CSS:

#buttons{
    position: fixed;
    right: 10px;
    top: 50%;
}

#top-button,
#bottom-button{
    width: 40px;
    height: 40px;
    background: orange;
    margin-bottom: 10px;
    font-size: 11px;
    text-align: center;
    line-height: 40px;
    color: yellow;
}

#position1,
#position2,
#position3,
#position4,
#position5{
    width: 100%;
    height: 400px;
    color: white;
    text-align: center;
    background: green;
    border-bottom: 5px solid yellow;
    padding-top: 20px;
}

Jクエリ:

var pos = [ 
    0,
    $("#position2").offset().top, 
    $("#position3").offset().top, 
    $("#position4").offset().top,
    $("#position5").offset().top
];

var $root = $('html, body');
var current;

$("#buttons #top-button").click(function () {
    $.each(pos, function(i,v){
        if( v < $(window).scrollTop() ){
            current = v;
        }
    });
    $root.stop(true,true).animate({scrollTop:current},500);         
});

$("#buttons #bottom-button").click(function () {
    $.each( pos, function(i,v){
        if( $(window).scrollTop() < v  ){
            $root.stop( true,true ).animate( {scrollTop: v}, 500);
            return false;
        }
    });         
});
4

1 に答える 1