Остановка прокрутки фиксированной позиции в определенной точке? - PullRequest
85 голосов
/ 05 мая 2011

У меня есть элемент, который является position: fixed и поэтому прокручивает страницу так, как я хочу. когда пользователь прокручивает вверх, я хочу, чтобы элемент прекратил прокрутку в определенный момент, скажем, когда это 250px от верхней части страницы, возможно ли это? Любая помощь или совет будут полезны, спасибо!

У меня было ощущение, что для этого мне понадобится jquery. Я попытался прокрутить или определить местоположение пользователя, но действительно запутался, есть ли какие-нибудь решения jquery?

Ответы [ 13 ]

130 голосов
/ 05 мая 2011

Вы имеете в виду что-то вроде этого?

http://jsfiddle.net/b43hj/

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

$(window).scroll(function(){
    $("#theFixed").css("top", Math.max(0, 100 - $(this).scrollTop()));
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>

<div id="theFixed" style="position:fixed;top:100px;background-color:red">SOMETHING</div>

<!-- random filler to allow for scrolling -->
STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>STUFF <BR>
118 голосов
/ 05 мая 2011

Вот быстрый плагин 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);

См. Рабочий пример →

19 голосов
/ 29 августа 2011

Вот полный плагин 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 });
});
6 голосов
/ 21 июня 2012

Вы можете сделать то же, что сделал Джеймс Монтань со своим кодом в своем ответе, но это заставит его мерцать в Chrome (протестировано в V19).

Это можно исправить, если вместо «top» поставить «margin-top». Не знаю, почему это работает с полем tho.

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

http://jsbin.com/idacel

4 голосов
/ 24 ноября 2017

Возможное CSS ONLY решение может быть достигнуто с position: sticky;

Поддержка браузера действительно хороша: https://caniuse.com/#search=position%3A%20sticky

вот пример: https://jsfiddle.net/0vcoa43L/7/

3 голосов
/ 17 июня 2016

В проекте у меня фактически есть какой-то заголовок, прикрепленный к нижней части экрана при загрузке страницы (это приложение для рисования, поэтому заголовок находится внизу, чтобы обеспечить максимальное пространство для элемента canvas в широком окне просмотра).

Мне нужно, чтобы заголовок стал «абсолютным», когда он достигает нижнего колонтитула при прокрутке, поскольку я не хочу, чтобы заголовок нижнего колонтитула (цвет заголовка совпадает с цветом фона нижнего колонтитула).

Я взял самый старый ответ здесь (отредактированный 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);
    }
2 голосов
/ 09 февраля 2014

мое решение

$(window).scroll(function(){
        if($(this).scrollTop()>425) {
            $("#theRelative").css("margin-top",$(this).scrollTop()-425);
            }   else {
                $("#theRelative").css("margin-top",$(this).scrollTop()-0);
                }
            });
            });
2 голосов
/ 10 июня 2011

Я написал сообщение в блоге об этом , в котором описана эта функция:

$.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 голосов
/ 21 марта 2017

Мне понравился ответ @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));
    }

Так что теперь фиксированный элемент остановится прямо перед нижним колонтитулом. и не будет пересекаться с ним.

0 голосов
/ 18 ноября 2015

Я адаптировал ответ @ 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;
}
...