特定の位置で固定位置のスクロールを停止しますか?


94

私はposition:fixedの要素を持っているので、ページと一緒にスクロールします。ユーザーが上にスクロールしたとき、要素のスクロールを特定のポイントで停止させたい場合、たとえば、ページの上部から250pxになったら、これは可能ですか?何か助けやアドバイスがあれば助かります。

そのためにはjqueryを使用する必要があると感じました。ユーザーがいる場所のスクロールまたは場所を取得しようとしましたが、本当に混乱しました、jqueryソリューションはありますか?


1
私の知る限りでは、JavaScriptベースのソリューションだけがあなたの望むことをします。それを行う純粋なCSSソリューションはありません。
cdeszaq

回答:


124

これが、私が書いたばかりのクイックjQueryプラグインで、必要なことを実行できます。

$.fn.followTo = function (pos) {
    var $this = this,
        $window = $(window);

    $window.scroll(function (e) {
        if ($window.scrollTop() > pos) {
            $this.css({
                position: 'absolute',
                top: pos
            });
        } else {
            $this.css({
                position: 'fixed',
                top: 0
            });
        }
    });
};

$('#yourDiv').followTo(250);

実施例を見る→


これは有望なようです。特定のポイントで位置を変更することを考えていたので、感謝の気持ちをお知らせします。
Louise McComiskey、2011

1
こんにちは、はい、本当にありがとうございました。数週間で、まさに私が欲しかったものに感謝します。また、おかげで完全に機能するようになりました。
Louise McComiskey、2011

3
$('window')引用符で囲まないでください。しかし、このおかげで、それは非常に役に立ちました。
jeff 2012年

137

こういう意味ですか?

http://jsfiddle.net/b43hj/

$(window).scroll(function(){
    $("#theFixed").css("top", Math.max(0, 250 - $(this).scrollTop()));
});


ありがとうございます。私の仕事は、常にフッターの上にある[上へ]ボタンを作成することでしたが、このコードを少し変更しました。私のバージョンはこちら(js coffee):jsfiddle.net/9vnwx3fa/2
Alb

@James Montagne-固定要素のスティッキーボトムが必要な場合、このコードを元に戻すための解決策は何ですか?0; スクロールしてから、ページの下部に到達する前に250pxを停止しますか?
BoneStarr 2016

1
@BoneStarrはもう少し複雑です。現在のscrollTopをページの高さとビューポートと比較する必要があります。次に、上記の同じコードを使用します。ただしbottom、この計算値(最大250)を除きます。
James Montagne 2016

@JamesMontagne-このフィドルについて詳しく説明できる可能性はありますか?私はこれにこだわっているので、本当にそれを感謝します。jsfiddle.net/Hf5wH/137
BoneStarr

1
@bonestarrこれよりかなり複雑です。複数行のコードに拡張する必要があります。そうしないと、理解するのが非常に困難になります。 jsfiddle.net/Hf5wH/139
James Montagne

19

この問題を解決する完全なjqueryプラグインを次に示します。

https://github.com/bigspotteddog/ScrollToFixed

このプラグインの説明は次のとおりです。

このプラグインは、要素がビューの外に垂直にスクロールされる場合に、要素をページの上部に固定するために使用されます。ただし、水平スクロールで要素が左または右に移動し続けることができます。

オプションmarginTopを指定すると、垂直スクロールがターゲット位置に到達すると、要素は垂直上方への移動を停止します。ただし、ページが左または右にスクロールされると、要素は水平方向に移動します。ページがターゲット位置を超えて下にスクロールされると、要素はページ上の元の位置に復元されます。

このプラグインは、Firefox 3/4、Google Chrome 10/11、Safari 5、およびInternet Explorer 8/9でテストされています。

特定のケースでの使用法:

<script src="scripts/jquery-1.4.2.min.js" type="text/javascript"></script>
<script src="scripts/jquery-scrolltofixed-min.js" type="text/javascript"></script>

$(document).ready(function() {
    $('#mydiv').scrollToFixed({ marginTop: 250 });
});

1
ありがとう、本当に便利なこのルックスは、このプロジェクトは数ヶ月前だったと私は前の回答を使用しかし、私は間違いなく、将来のプロジェクトのためにこれを覚えておくだろうはい、それは簡単に見えますが、おかげで:)
ルイーズMcComiskey

6

James Montagneが彼のコードで彼の答えでしたことを行うことができますが、それはそれがChromeでちらつきになります(V19でテスト済み)。

「top」の代わりに「margin-top」を配置すれば修正できます。それがマージンthoで機能する理由が本当にわからない。

$(window).scroll(function(){
    $("#theFixed").css("margin-top",Math.max(-250,0-$(this).scrollTop()));
});

http://jsbin.com/idacel


これは、テキストの下の固定要素にも最適です。小さな画面表示で深刻な問題が発生しており、固定スクロール要素が1024x768のような小さな領域でブラウザーの上部まで実行されます。これはその問題を解決しました。
ジョシュア


2

私の解決策

$(window).scroll(function(){
        if($(this).scrollTop()>425) {
            $("#theRelative").css("margin-top",$(this).scrollTop()-425);
            }   else {
                $("#theRelative").css("margin-top",$(this).scrollTop()-0);
                }
            });
            });

2

プロジェクトでは、実際にはページの読み込み時に画面の下部にいくつかの見出しが固定されています(これは描画アプリであるため、見出しは下部にあり、ワイドビューポートのキャンバス要素に最大のスペースを提供します)。

見出しがフッターの上に表示されないようにするため、見出しがスクロール時にフッターに到達したときに「絶対」になるように見出しが必要でした(見出しの色はフッターの背景色と同じです)。

私はここで最も古い応答(Gearge Milloが編集)を取り、そのコードスニペットは私のユースケースで機能しました。いくつか遊んで、私はこれを機能させました。固定見出しは、フッターに到達すると、フッターの上に美しく表示されます。

私のユースケースとそれがどのように機能したかを共有し、ありがとうと言いました!アプリ:http : //joefalconer.com/web_projects/drawingapp/index.html

    /* CSS */
    @media screen and (min-width: 1100px) {
        #heading {
            height: 80px;
            width: 100%;
            position: absolute;  /* heading is 'absolute' on page load. DOESN'T WORK if I have this on 'fixed' */
            bottom: 0;
        }
    }

    // jQuery
    // Stop the fixed heading from scrolling over the footer
    $.fn.followTo = function (pos) {
      var $this = this,
      $window = $(window);

      $window.scroll(function (e) {
        if ($window.scrollTop() > pos) {
          $this.css( { position: 'absolute', bottom: '-180px' } );
        } else {
          $this.css( { position: 'fixed', bottom: '0' } );
        }
      });
    };
    // This behaviour is only needed for wide view ports
    if ( $('#heading').css("position") === "absolute" ) {
      $('#heading').followTo(180);
    }

1

私はこの機能を特徴とするこれについてのブログ投稿を書きました

$.fn.myFixture = function (settings) {
  return this.each(function () {

    // default css declaration 
    var elem = $(this).css('position', 'fixed');

    var setPosition = function () {         
      var top = 0;
      // get no of pixels hidden above the the window     
      var scrollTop = $(window).scrollTop();    
      // get elements distance from top of window
      var topBuffer = ((settings.topBoundary || 0) - scrollTop);
      // update position if required
      if (topBuffer >= 0) { top += topBuffer }
      elem.css('top', top);      
    };

    $(window).bind('scroll', setPosition);
    setPosition();
  });
};

0

Mootoolsフレームワークを使用したソリューション。

http://mootools.net/docs/more/Fx/Fx.Scroll

  1. $( 'myElement')。getPosition()。xを使用して、スクロールを停止する要素のPosition(x&y)を取得します

    $( 'myElement')。getPosition()。y

  2. アニメーションの一種のスクロール使用:

    新しいFx.Scroll( 'scrollDivId'、{offset:{x:24、y:432}})。toTop();

  3. すぐにスクロールを設定するには、次のコマンドを使用します。

    新しいFx.Scroll(myElement).set(x、y);

お役に立てれば !!:D


0

私はこのソリューションが好き

$(window).scroll(function(){
    $("#theFixed").css("margin-top",Math.max(-250,0-$(this).scrollTop()));
});

私の問題は、Adobe Museでコンテナーの位置関係を処理しなければならないことでした。

私の解決策:

$(window).scroll(function(){
    if($(this).scrollTop()>425) {
         $("#theRelative").css("margin-top",$(this).scrollTop()-425);
    }
});

0

即興のmVChrコード

$(".sidebar").css('position', 'fixed')

    var windw = this;

    $.fn.followTo = function(pos) {
        var $this = this,
                $window = $(windw);

        $window.scroll(function(e) {
            if ($window.scrollTop() > pos) {
                topPos = pos + $($this).height();
                $this.css({
                    position: 'absolute',
                    top: topPos
                });
            } else {
                $this.css({
                    position: 'fixed',
                    top: 250 //set your value
                });
            }
        });
    };

    var height = $("body").height() - $("#footer").height() ;
    $('.sidebar').followTo(height);
    $('.sidebar').scrollTo($('html').offset().top);

店舗への理由$(this)$(window)あなたが唯一のしなければならないので、変数ではある$this.height()ようにと。上部の位置を設定する代わりに、プラグインが元の上部の値を保存し、固定幅を設定するときに元の上部の値に戻せば、より良いと思いませんか?また、どういう意味Just improvised mVChr codeですか?
Cyclonecode、2015

0

私は@mVchrの回答を適応させ、スティッキー広告の配置に使用するように反転しました。ヘッダージャンクが画面から外れるまで絶対的に配置(スクロール)する必要があるが、その後画面に固定/表示されたままにする必要がある場合:

$.fn.followTo = function (pos) {
    var stickyAd = $(this),
    theWindow = $(window);
    $(window).scroll(function (e) {
      if ($(window).scrollTop() > pos) {
        stickyAd.css({'position': 'fixed','top': '0'});
      } else {
        stickyAd.css({'position': 'absolute','top': pos});
      }
    });
  };
  $('#sticky-ad').followTo(740);

CSS:

#sticky-ad {
    float: left;
    display: block;
    position: absolute;
    top: 740px;
    left: -664px;
    margin-left: 50%;
    z-index: 9999;
}

0

私は@jamesの回答が大好きでしたが、その逆、つまりフッターの直前に固定位置を停止することを探していました。これが私が思いついたものです

var $fixed_element = $(".some_element")
if($fixed_element.length){
        var $offset = $(".footer").position().top,
            $wh = $(window).innerHeight(),
            $diff = $offset - $wh,
            $scrolled = $(window).scrollTop();
        $fixed_element.css("bottom", Math.max(0, $scrolled-$diff));
    }

そのため、固定要素はフッターの直前で停止します。そしてそれと重複しません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.