Dừng cuộn vị trí cố định tại một điểm nhất định?


94

Tuy nhiên, tôi có một phần tử là vị trí: cố định và vì vậy sẽ cuộn trang theo cách tôi muốn. Khi người dùng cuộn lên, tôi muốn phần tử dừng cuộn tại một điểm nhất định, giả sử khi nó cách đầu trang 250px, điều này có khả thi không? Mọi sự giúp đỡ hoặc lời khuyên sẽ hữu ích, cảm ơn!

Tôi có cảm giác rằng tôi sẽ cần phải sử dụng jquery để làm như vậy. Tôi đã thử lấy cuộn hoặc vị trí của người dùng nhưng thực sự bối rối, có giải pháp jquery nào không?


1
Theo như tôi biết, chỉ có một giải pháp dựa trên javascript sẽ làm những gì bạn muốn. Không có giải pháp CSS thuần túy nào làm được điều đó.
cdeszaq

Câu trả lời:


124

Đây là một plugin jQuery nhanh mà tôi vừa viết có thể làm những gì bạn yêu cầu:

$.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);

Xem ví dụ làm việc →


Điều này có vẻ hứa hẹn có nó những gì tôi nghĩ thay đổi vị trí ở một số điểm nhất định, tôi sẽ cho bạn biết làm thế nào tôi có được cảm ơn!
Louise McComiskey

1
Xin chào vâng cảm ơn bạn rất nhiều điều này với một vài tweet chính xác những gì tôi muốn và nó hiện đang hoạt động hoàn hảo, cảm ơn một lần nữa.
Louise McComiskey

3
$('window')không nên ở trong dấu ngoặc kép. Nhưng cảm ơn vì điều này, nó rất hữu ích.
jeff

137

Bạn có nghĩa là đại loại như thế này?

http://jsfiddle.net/b43hj/

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


Tuyệt vời, cảm ơn bạn rất nhiều! Mặc dù nhiệm vụ của tôi là tạo nút "Lên đầu trang" luôn ở trên chân trang, tôi đã sửa đổi mã này một chút. Xem phiên bản của tôi tại đây (js coffee): jsfiddle.net/9vnwx3fa/2
Alb

@James Montagne - Giải pháp nào để đảo ngược mã này nếu tôi muốn phần tử cố định dính đáy: 0; trên cuộn và sau đó dừng 250px trước khi nó xuống cuối trang?
BoneStarr

1
@BoneStarr thì phức tạp hơn một chút. Bạn sẽ cần phải so sánh scrollTop hiện tại với chiều cao của trang và khung nhìn. Sau đó, bạn chỉ cần sử dụng cùng một mã ở trên, ngoại trừ bottomvà giá trị được tính toán này (bù đắp bằng 250) trong giá trị tối đa.
James Montagne

@JamesMontagne - Có cơ hội nào bạn có thể giải thích thêm về trò chơi này không? Thực sự sẽ đánh giá cao nó vì tôi đang mắc kẹt với cái này. jsfiddle.net/Hf5wH/137
BoneStarr

1
@bonestarr Phức tạp hơn nhiều so với cái này. Bạn nên mở rộng nó thành nhiều dòng mã hoặc nó thực sự khó hiểu. jsfiddle.net/Hf5wH/139
James Montagne

19

Đây là một plugin jquery hoàn chỉnh giải quyết vấn đề này:

https://github.com/bigspotteddog/ScrollToFixed

Mô tả của plugin này như sau:

Plugin này được sử dụng để cố định các phần tử lên đầu trang, nếu phần tử đã cuộn ra khỏi chế độ xem, theo chiều dọc; tuy nhiên, nó cho phép phần tử tiếp tục di chuyển sang trái hoặc phải với cuộn ngang.

Cho một tùy chọn marginTop, phần tử sẽ ngừng di chuyển theo chiều dọc lên trên khi cuộn dọc đã đến vị trí mục tiêu; nhưng, phần tử sẽ vẫn di chuyển theo chiều ngang khi trang được cuộn sang trái hoặc phải. Khi trang đã được cuộn xuống qua vị trí mục tiêu, phần tử sẽ được khôi phục về vị trí ban đầu trên trang.

Plugin này đã được thử nghiệm trên Firefox 3/4, Google Chrome 10/11, Safari 5 và Internet Explorer 8/9.

Cách sử dụng cho trường hợp cụ thể của bạn:

<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
Thankyou có vẻ điều này thực sự hữu ích, tôi đã sử dụng một câu trả lời trước khi dự án này là một vài tháng trước tuy nhiên tôi sẽ chắc chắn giữ điều này trong tâm trí cho các dự án trong tương lai, có vẻ dễ dàng hơn, Cảm ơn bạn :)
Louise McComiskey

6

Bạn có thể làm những gì James Montagne đã làm với mã của anh ấy trong câu trả lời của anh ấy, nhưng điều đó sẽ khiến nó nhấp nháy trong Chrome (được thử nghiệm trong V19).

Bạn có thể khắc phục điều đó nếu bạn đặt "margin-top" thay vì "top". Không thực sự biết tại sao nó hoạt động với margin tho.

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

http://jsbin.com/idacel


Điều này cũng hoạt động tốt cho các phần tử cố định bên dưới văn bản, tôi đã gặp sự cố nghiêm trọng với màn hình nhỏ và các phần tử cuộn cố định của tôi chạy lên đầu trình duyệt trên các khu vực nhỏ hơn như 1024x768. Điều này đã giải quyết vấn đề đó.
Joshua


2

giải pháp của tôi

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

2

Trong một dự án, tôi thực sự có một số tiêu đề cố định ở cuối màn hình khi tải trang (đó là một ứng dụng vẽ nên tiêu đề ở dưới cùng để cung cấp không gian tối đa cho phần tử canvas trên khung nhìn rộng).

Tôi cần tiêu đề trở thành 'tuyệt đối' khi nó đến chân trang khi cuộn, vì tôi không muốn tiêu đề trên chân trang (màu tiêu đề giống với màu nền của chân trang).

Tôi đã lấy câu trả lời cũ nhất ở đây (được chỉnh sửa bởi Gearge Millo) và đoạn mã đó hoạt động cho trường hợp sử dụng của tôi. Với một số trò chơi xung quanh, tôi đã làm việc này. Bây giờ tiêu đề cố định nằm đẹp mắt phía trên chân trang khi nó đến chân trang.

Tôi chỉ nghĩ rằng tôi sẽ chia sẻ trường hợp sử dụng của mình và cách nó hoạt động, và nói lời cảm ơn! Ứng dụng: 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

Tôi đã viết một bài đăng trên blog về điều này có chức năng này:

$.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

Giải pháp sử dụng Mootools Framework.

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

  1. Lấy Vị trí (x & y) của phần tử mà bạn muốn dừng cuộn bằng cách sử dụng $ ('myElement'). GetPosition (). X

    $ ('myElement'). getPosition (). y

  2. Đối với loại hoạt ảnh sử dụng cuộn:

    new Fx.Scroll ('scrollDivId', {offset: {x: 24, y: 432}}). toTop ();

  3. Để chỉ cần đặt cuộn ngay lập tức, hãy sử dụng:

    new Fx.Scroll (myElement) .set (x, y);

Hi vọng điêu nay co ich !! : D


0

Tôi thích giải pháp này

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

vấn đề của tôi là tôi phải xử lý vùng chứa vị trí tương đối trong Adobe Muse.

Giải pháp của tôi:

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

0

Chỉ mã mVChr ngẫu hứng

$(".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);

Lý do để lưu trữ $(this)$(window)trong các biến là vì vậy bạn chỉ phải làm $this.height()và như vậy. Thay vì đặt vị trí hàng đầu, sẽ tốt hơn nếu plugin lưu trữ giá trị hàng đầu ban đầu và hoàn nguyên về giá trị đó khi đặt chiều rộng cố định? Ngoài ra, bạn có ý nghĩa Just improvised mVChr codegì với ?
Cyclonecode

0

Tôi đã điều chỉnh câu trả lời của @ mVchr và đảo ngược nó để sử dụng cho định vị quảng cáo cố định: nếu bạn cần nó được định vị hoàn toàn (cuộn) cho đến khi rác tiêu đề tắt màn hình nhưng sau đó cần nó ở trạng thái mơ hồ / hiển thị trên màn hình sau đó:

$.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

Tôi thích câu trả lời @james nhưng tôi đang tìm kiếm nghịch đảo của nó, tức là dừng vị trí cố định ngay trước chân trang, đây là những gì tôi nghĩ ra

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));
    }

Vì vậy, bây giờ phần tử cố định sẽ dừng ngay trước chân trang. và sẽ không trùng lặp với nó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.