2012-06-12 28 views
5

Zasadniczo mam obecnie div, który pozostaje stały i podąża za użytkownikiem w trakcie przewijania, aż osiągnie określony punkt. Mogę z łatwością sprawić, że zatrzyma się na ustalonej pozycji piksela, tak jak to zrobiłem w poniższym przykładzie, ale ponieważ jestem idiotą jQuery, nie mam pojęcia, jak sprawić, by zatrzymał się na divie.Zatrzymaj div przewijanie po dotarciu do innego div

Oto co Używałem do tej pory:

var windw = this; 

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

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

$('#one').followTo(400); 

Oto przykład: jsFiddle

Powodem chcę go zatrzymać po osiągnięciu drugiego div dlatego z układem płynnej I” m używając, drugi div będzie siedział w różnych punktach w zależności od rozmiaru przeglądarki. Zdefiniowanie konkretnego punktu, w którym ma się zatrzymać, nie będzie działać. Czy ktoś ma jakieś pomysły na to, w jaki sposób mogę zrobić to, czego chcę? Alternatywnie, czy stały div może przestać przewijać, gdy osiągnie procent drogi w dół? Rozejrzałem się, ale niczego nie znalazłem.

Dzięki za pomoc.

Odpowiedz

8

Czy tego właśnie szukasz?

http://jsfiddle.net/Tgm6Y/1447/

var windw = this; 

$.fn.followTo = function (elem) { 
    var $this = this, 
     $window = $(windw), 
     $bumper = $(elem), 
     bumperPos = $bumper.offset().top, 
     thisHeight = $this.outerHeight(), 
     setPosition = function(){ 
      if ($window.scrollTop() > (bumperPos - thisHeight)) { 
       $this.css({ 
        position: 'absolute', 
        top: (bumperPos - thisHeight) 
       }); 
      } else { 
       $this.css({ 
        position: 'fixed', 
        top: 0 
       }); 
      } 
     }; 
    $window.resize(function() 
    { 
     bumperPos = pos.offset().top; 
     thisHeight = $this.outerHeight(); 
     setPosition(); 
    }); 
    $window.scroll(setPosition); 
    setPosition(); 
}; 

$('#one').followTo('#two'); 

EDIT: o swoim żądaniu nie przewijania aż w pewnym momencie po prostu zastąpić to:

if ($window.scrollTop() > (bumperPos - thisHeight)) { 

z tym:

if ($window.scrollTop() <= (bumperPos - thisHeight)) { 
+1

Dobry panie, to działa! A teraz idź i sprawdź, dlaczego to działa. MicronXD, jesteś dżentelmenem i uczonym, dziękuję ci śmiesznie. – mattmouth

+0

Przeprasza z góry za bycie tak potrzebującym haha. Czy jest możliwe, aby jakoś dodać ten konkretny kod do czegoś podobnego do tego - http://jsfiddle.net/cpL69/13/ - jak w, div nie rozpoczyna przewijania dopóki nie zostanie osiągnięty i kończy się na drugim div jako zrobił to w twoim przykładzie? – mattmouth

+0

dodano go na końcu odpowiedzi. NP ... to jest to, co spędzam cały dzień robiąc ... jeszcze, jakoś nadal czerpię przyjemność z zarabiania "bezsensownych punktów internetowych" za robienie tego więcej. To może być bardziej efektywne, ale jestem zajęty. Zaciągnę to później dla ciebie. – MicronXD

2

Zainspirowany skrzypce MicronXD za , ale napisany, aby być bardziej elastycznym, gdy DOM jest mocno naciągany na dokument Obciążenie ument (lub z innych powodów), oto inny podobny rozwiązanie opracowałem dla własnego użytku:

jQuery.fn.extend({ 
    followTo: function (elem, marginTop) { 
    var $this = $(this); 
    var $initialOffset = $this.offset().top; 
    setPosition = function() { 
     if ($(window).scrollTop() > $initialOffset) { 
     if (elem.offset().top > ($(window).scrollTop() + $this.outerHeight() + marginTop)) { 
      $this.css({ position: 'fixed', top: marginTop }); 
     } 
     if (elem.offset().top <= ($(window).scrollTop() + $this.outerHeight() + marginTop)) { 
      $this.css({ position: 'absolute', top: elem.offset().top - $this.outerHeight() }); 
     } 
     } 
     if ($(window).scrollTop() <= $initialOffset) { 
     $this.css({ position: 'relative', top: 0 }); 
     } 
    } 
    $(window).resize(function(){ setPosition(); }); 
    $(window).scroll(function(){ setPosition(); }); 
    } 
}); 

Następnie można uruchomić funkcję jako takie:

$('#div-to-move').followTo($('#div-to-stop-at'), 60); 

60 jest opcjonalnym margines chcesz element pływający, który ma mieć u góry ekranu w pozycji: ustalony, wyrażony w pikselach.

Powiązane problemy