2

OK-これを最も単純な形式に縮小しました:

<div id="bar>47 px high bar</div>
<div id="header">
    <ul>
        <li>Nav1</li>
    </ul>
</div>

//Down
$(function() {
    var interval = setInterval(function() {
        if ($(window).scrollTop() >= 47) {
            $("#header").attr("id","header2");
            clearInterval(interval);
        }
    }, 50);
});
//Up
$(function() {
    var interval = setInterval(function() {
        if ($(window).scrollTop() < 47) {
            $("#header2").attr("id","header");
            clearInterval(interval);
        }
    }, 50);
});

それは機能しますが、一方向にのみ機能します-ページの上部にロードすると、下にスクロールして機能します。ページの途中までロードすると、上にスクロールして動作します。この後、反対方向に進み、何も起こりません。誰もが理由を知っていますか?

4

3 に答える 3

1

キャッシングとタイマーについては、John Resig(jQueryの作成者)によるこの記事を読んでください。

$(function() {
    var $window = $(window),
        $header = $('#header'),
        scrolled = false;

    $window.scroll(function () {
        scrolled = true;
    });

    setInterval(function() {
        if ( ! scrolled ) return;
        scrolled = false;
        $header.attr('id', $window.scrollTop() < 47 ? 'header' : 'header2');
    }, 50);
});

PSここで何を達成しようとしているのか正確にはわかりませんが、CSSを介してヘッダーをターゲットにしようとしているようです。その場合は、IDをいじるよりも、クラスを切り替える方がよいでしょう。

$header.toggleClass('alternate-header', $window.scrollTop() > 46);

これがフィドルです:http://jsfiddle.net/6KdQG/

于 2012-11-13T00:18:14.253 に答える
0

間隔(clearInterval)をクリアすると、上下にスクロールして、何が再開しますか?どういうわけかそれを始めなければなりません。

このようにする必要はありません。の必要はありませんsetIntervalこの種のものに使用できるスクロールイベントがありますwindow

スクロールイベント(jquery)を使用した例

var $window = $(window),
    $header = $('#header');

$window.on('scroll', function () {
    $header.toggleClass('header2', $window.scrollTop() >= 47);
});​

これがフィドルです。

于 2012-11-13T00:13:52.533 に答える
0

あなたが目指していると思うものの実用的なサンプル:

    <!DOCTYPE HTML>
    <html lang="en-US">
    <head>
        <meta charset="UTF-8">
        <title></title>
        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
        <script type="text/javascript">
            var cacheState = $(window).scrollTop(); //detect when scroll has changed
             function downAndUp() {
                if (cacheState != $(window).scrollTop()) {
                    var target = $("li.first").offset().top;
                    if ($(window).scrollTop() >= target) {
                        console.log("Scrolled past li.first");
                        $("#header").addClass("header2");
                        cacheState = $(window).scrollTop();
                    }
                    else {
                        target = $("#bar").outerHeight();
                        if ($(window).scrollTop() <= target) {
                            console.log("Scrolled before li.first");
                            $("#header").removeClass("header2");
                            cacheState = $(window).scrollTop();
                        }
                    }
                }
            } 
            $(document).ready(function(){
                setInterval('downAndUp()',45)
            }); 
        </script>   
        <style type="text/css">
        .header2 {}
        </style>
    </head>
    <body>
    <div id="bar" style="height:300px;">Height:~300px</div>
    <div id="header">
        <ul style="display:block;">
            <li class="first">THIS</li>
            <li>&hellip;</li>
            <li>&hellip;</li>
            <li>&hellip;</li>
            <li>&hellip;</li>
            <li>&hellip;</li>
            <li>&hellip;</li>
            <li>&hellip;</li>
            <li>&hellip;</li>
            <li>&hellip;</li>
            <li>&hellip;</li>
            <li>&hellip;</li>
            <li>&hellip;</li>
            <li>&hellip;</li>
            <li>&hellip;</li>
            <li>&hellip;</li>
            <li>&hellip;</li>
            <li>&hellip;</li>
            <li>&hellip;</li>
            <li>&hellip;</li>
            <li>&hellip;</li>
            <li>&hellip;</li>
            <li>&hellip;</li>
            <li>&hellip;</li>
            <li>&hellip;</li>
            <li>&hellip;</li>
            <li>&hellip;</li>
            <li>&hellip;</li>
            <li>&hellip;</li>       
        </ul>
    </div>
    </body>
    </html>
于 2012-11-13T00:22:07.620 に答える