18

視差スクロールを作成しました。これはFirefoxで正常に機能しているようですが、Chromeブラウザでは、スクロール時に本文にわずかなジャンプがあります。ここをクリックして、aboutセクションまでスクロールします。これがcssの問題なのかJSの問題なのかわかりません。以下は、パララックス関数に組み込んだスニペットです。

誰かが私がこの問題を修正する方法を知っていますか?

$(document).ready(function(){

// Cache the Window object
$window = $(window);

// Cache the Y offset and the speed of each sprite
$('[data-type]').each(function() {  
    $(this).data('offsetY', parseInt($(this).attr('data-offsetY')));
    $(this).data('Xposition', $(this).attr('data-Xposition'));
    $(this).data('speed', $(this).attr('data-speed'));
});

// For each element that has a data-type attribute
$('[data-type="background"]').each(function(){


    // Store some variables based on where we are
    var $self = $(this),
        offsetCoords = $self.offset(),
        topOffset = offsetCoords.top;


    // When the window is scrolled...
    $(window).scroll(function() {

        // If this section is in view
        if ( ($window.scrollTop() + $window.height()) > (topOffset) &&
             ( (topOffset + $self.height()) > $window.scrollTop() ) ) {

            // Scroll the background at var speed
            // the yPos is a negative value because we're scrolling it UP!                              
            var yPos = -($window.scrollTop() / $self.data('speed')); 

            // If this element has a Y offset then add it on
            if ($self.data('offsetY')) {
                yPos += $self.data('offsetY');
            }

            // Put together our final background position
            var coords = '50% '+ yPos + 'px';

            // Move the background
            $self.css({ backgroundPosition: coords });

           $('[data-type="scroll-text"]', $self).each(function() {
                    var $text= $(this);
                     var pos = ($window.scrollTop()/10) * $text.data('speed');
                     var curP = $text.css('margin-top'); 
                     var is_chrome = navigator.userAgent.toLowerCase().indexOf('chrome') > -1;
                     if(is_chrome) {
                         $text.animate({
                         paddingTop: pos,
                        }, 200, 'linear', function() {
                            // Animation complete.
                        });
                     } else {
                     $text.css('padding-top', pos);
                     }
            }); 

        }; // in view

    }); // window scroll

}); // each data-type


      }); // document ready
4

6 に答える 6

4

いくつかの提案:

1.)position: fixed要素をドキュメント フローから除外するため、ジッターを回避するために使用します。その後、z-index を使用して配置できます。

2.) 処理時間を短縮するために、できるだけ多くをキャッシュします。

3.) Math.round は必要ないかもしれませんが、この CSS を移動領域に追加してみてください。-webkit-transform: translate3d(0,0,0);これにより、Chrome でハードウェア アクセラレーションが強制され、ジッタリングが緩和される場合があります。(これを Inspector で追加したとき、私の画面ではよりスムーズに見えましたが、スクロール ホイールによるガタガタ感は取り除かれませんでした。) 注: ドキュメント全体 (例: body タグ) に対してこれを行わないでください。現在のレイアウトでいくつかの問題が発生します。(たとえば、ナビゲーション バーがウィンドウの上部に固定されていませんでした。)

4.) パララックス ロジックの一部としてアニメーションを実行している場合 (余白を所定の位置に調整するか、それらの線に沿って何かを調整する)、それを削除します。おそらく、ジャンプが発生する可能性があります。

お役に立てれば。幸運を祈ります。

于 2012-11-20T16:20:50.487 に答える
2

FireFox と Chrome (Mac) で同じジッタリングが見られます。あなたのコンテナを見ると、計算/使用されているピクセル位置が目立ちます。

Chrome: <div id="about-title" style="margin-top: 1562.3999999999999px;">
FireFox: <div id="about-title" style="margin-top: 1562.4px;">

ブラウザーは、0.3999999 ピクセルは言うまでもなく、コンテンツを 1/2 ピクセルに収めることを許可しません。それを動かして、切り上げるか切り下げるかを計算しようとしていると思います。マウスホイールをクリックするたびに計算しているため、ジッタが発生します。

したがって、Math.round() をあなたの位置に追加して、コンテナーが宙に浮いたままにならないようにします。

こちらのコードをご覧ください: http://webdesigntutsplus.s3.amazonaws.com/tuts/338_parallax/src/index.html

いくつかの要素を Firebug すると、ピクセルの一部が '0.5' だけであることがわかります。それらのほとんど(バルク)は、数値を丸めます。

于 2012-11-20T14:54:36.753 に答える
1

スクロールの動作方法を変更する必要があります (つまり、間隔の計算方法を変更する) 必要がありますが、これは、position:fixedスクロールしているページ要素に CSS 要素を追加することで修正できます。この問題は、JavaScript が処理してレンダリングするのに時間がかかることに起因しています。

たとえば、ページで、<div>テキストを含む各タグを固定位置に設定し、JavaScript/JQuery 関数を使用してtop:CSS 要素を更新します。これにより、ページがスムーズにスクロールするはずです。

于 2012-11-20T14:54:28.610 に答える
0

前の質問で、私はかなり良い視差スクロールの実装を作成しました。Jquery視差スクロール効果-多方向あなたはそれが役に立つと思うかもしれません。

これがJSFiddlehttp : //jsfiddle.net/9R4hZ/40/です。上/下矢印またはスクロールホイールを使用します。

ポジショニングにパディングとマージンを使用することが、レンダリングの問題が発生している理由である可能性があります。私のコードはエフェクトにスクロールまたはキーボード入力を使用していますが、関連する部分をループして、画面上の目的の要素に到達するまで$moving変数を確認できます。

function parallaxScroll(scroll) {
    // current moving object
    var ml = $moving.position().left;
    var mt = $moving.position().top;
    var mw = $moving.width();
    var mh = $moving.height();
    // calc velocity
    var fromTop = false;
    var fromBottom = false;
    var fromLeft = false;
    var fromRight = false;
    var vLeft = 0;
    var vTop = 0;
    if($moving.hasClass('from-top')) {
        vTop = scroll;
        fromTop = true;
    } else if($moving.hasClass('from-bottom')) {
        vTop = -scroll;
        fromBottom = true;
    } else if($moving.hasClass('from-left')) {
        vLeft = scroll;
        fromLeft = true;
    } else if($moving.hasClass('from-right')) {
        vLeft = -scroll;
        fromRight = true;
    }
    // calc new position
    var newLeft = ml + vLeft;
    var newTop = mt + vTop;
    // check bounds
    var finished = false;
    if(fromTop && (newTop > t || newTop + mh < t)) {
        finished = true;
        newTop = (scroll > 0 ? t : t - mh);
    } else if(fromBottom && (newTop < t || newTop > h)) {
        finished = true;
        newTop = (scroll > 0 ? t : t + h);
    } else if(fromLeft && (newLeft > l || newLeft + mw < l)) {
        finished = true;
        newLeft = (scroll > 0 ? l : l - mw);
    } else if(fromRight && (newLeft < l || newLeft > w)) {
        finished = true;
        newLeft = (scroll > 0 ? l : l + w);
    }
    // set new position
    $moving.css('left', newLeft);
    $moving.css('top', newTop);
    // if finished change moving object
    if(finished) {
        // get the next moving
        if(scroll > 0) {
            $moving = $moving.next('.parallax');
            if($moving.length == 0)
                $moving = $view.find('.parallax:last');
        } else {
            $moving = $moving.prev('.parallax');
            if($moving.length == 0)
                $moving = $view.find('.parallax:first');
        }
    }
    // for debug
    $('#direction').text(scroll + " " + l + "/" + t + " " + ml + "/" + mt + " " + finished + " " + $moving.text());
}
于 2012-11-27T14:08:50.753 に答える
0

あなたの詳細とは関係ないかもしれませんが、パララックス スクロールの問題が不安定でした。ページの固定部分に次の CSS を追加することで解決できました。

@supports (background-attachment: fixed)
{
    .fixed-background
    {
        background-attachment: fixed;
    }
}

すべての詳細はわかりませんが、Alternate Fixed & Scroll Backgroundsにあります。

于 2018-12-27T12:10:55.797 に答える