Mam element, który jest ustawiony na stałe, więc przewija się ze stroną tak, jak chcę. kiedy użytkownik przewija w górę, chcę, aby element przestał się przewijać w pewnym momencie, powiedzmy, gdy znajduje się 250 pikseli od góry strony, czy jest to możliwe? Każda pomoc lub rada byłaby pomocna, dzięki!
Wydawało mi się, że do tego celu będę musiał użyć jquery. Próbowałem uzyskać przewijanie lub lokalizację miejsca, w którym znajduje się użytkownik, ale byłem naprawdę zdezorientowany, czy są jakieś rozwiązania jQuery?
jquery
css
positioning
Louise McComiskey
źródło
źródło
Odpowiedzi:
Oto krótka wtyczka jQuery, którą właśnie napisałem, która może zrobić to, czego potrzebujesz:
$.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);
Zobacz przykład roboczy →
źródło
$('window')
nie powinno być w cudzysłowie. Ale dzięki za to, było to bardzo pomocne.Masz na myśli coś takiego?
http://jsfiddle.net/b43hj/
$(window).scroll(function(){ $("#theFixed").css("top", Math.max(0, 250 - $(this).scrollTop())); });
Pokaż fragment kodu
$(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>
źródło
bottom
i tej obliczonej wartości (przesunięcie o 250) w maks.Oto kompletna wtyczka jquery, która rozwiązuje ten problem:
https://github.com/bigspotteddog/ScrollToFixed
Opis tej wtyczki jest następujący:
Ta wtyczka służy do mocowania elementów na górze strony, jeśli element zostałby przewinięty poza widok, pionowo; jednak pozwala elementowi na dalsze przesuwanie w lewo lub w prawo za pomocą poziomego przewijania.
Mając opcję marginTop, element przestanie przesuwać się pionowo w górę, gdy przewijanie w pionie osiągnie pozycję docelową; ale element będzie nadal przesuwał się w poziomie podczas przewijania strony w lewo lub w prawo. Po przewinięciu strony z powrotem w dół poza położenie docelowe, element zostanie przywrócony do pierwotnej pozycji na stronie.
Ta wtyczka została przetestowana w przeglądarkach Firefox 3/4, Google Chrome 10/11, Safari 5 i Internet Explorer 8/9.
Użycie w konkretnym przypadku:
<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 }); });
źródło
Możesz zrobić to, co James Montagne zrobił ze swoim kodem w swojej odpowiedzi, ale spowoduje to migotanie w Chrome (testowane w V19).
Możesz to naprawić, wstawiając „margin-top” zamiast „top”. Naprawdę nie wiem, dlaczego to działa z marginesem.
$(window).scroll(function(){ $("#theFixed").css("margin-top",Math.max(-250,0-$(this).scrollTop())); });
http://jsbin.com/idacel
źródło
Możliwe rozwiązanie TYLKO CSS można osiągnąć za pomocą
position: sticky;
Obsługa przeglądarki jest naprawdę dobra: https://caniuse.com/#search=position%3A%20sticky
tutaj jest przykład: https://jsfiddle.net/0vcoa43L/7/
źródło
moje rozwiązanie
$(window).scroll(function(){ if($(this).scrollTop()>425) { $("#theRelative").css("margin-top",$(this).scrollTop()-425); } else { $("#theRelative").css("margin-top",$(this).scrollTop()-0); } }); });
źródło
W projekcie faktycznie mam jakiś nagłówek przymocowany do dołu ekranu podczas wczytywania strony (jest to aplikacja do rysowania, więc nagłówek znajduje się na dole, aby zapewnić maksymalne miejsce na element Canvas w szerokim oknie roboczym).
Potrzebowałem, aby nagłówek stał się „absolutny”, gdy dotrze do stopki na przewijaniu, ponieważ nie chcę, aby nagłówek znajdował się nad stopką (kolor nagłówka jest taki sam jak kolor tła stopki).
Wziąłem tutaj najstarszą odpowiedź (edytowaną przez Gearge Millo) i ten fragment kodu działał w moim przypadku użycia. Po zabawie udało mi się to. Teraz ustalony nagłówek pięknie leży nad stopką, gdy dotrze do stopki.
Pomyślałem, że podzielę się moim przykładem użycia i tym, jak to działa, i podziękuję! Aplikacja: 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); }
źródło
Napisałem o tym post na blogu, który zawierał tę funkcję:
$.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(); }); };
źródło
Rozwiązanie wykorzystujące Mootools Framework.
http://mootools.net/docs/more/Fx/Fx.Scroll
Uzyskaj pozycję (x i y) elementu, w którym chcesz zatrzymać przewijanie za pomocą $ ('myElement'). GetPosition (). X
$ ('myElement'). getPosition (). y
Do animacji użyj:
new Fx.Scroll ('scrollDivId', {offset: {x: 24, y: 432}}). toTop ();
Aby natychmiast ustawić przewijanie, użyj:
nowy Fx.Scroll (myElement) .set (x, y);
Mam nadzieję że to pomoże !! :RE
źródło
Podobało mi się to rozwiązanie
$(window).scroll(function(){ $("#theFixed").css("margin-top",Math.max(-250,0-$(this).scrollTop())); });
mój problem polegał na tym, że miałem do czynienia z kontenerem względnym położenia w Adobe Muse.
Moje rozwiązanie:
$(window).scroll(function(){ if($(this).scrollTop()>425) { $("#theRelative").css("margin-top",$(this).scrollTop()-425); } });
źródło
Po prostu improwizowany kod 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);
źródło
$(this)
i$(window)
w zmiennych jest to, że musisz tylko zrobić$this.height()
i tak dalej. Zamiast ustawiać najwyższą pozycję, czy nie byłoby lepiej, gdyby wtyczka zapisała pierwotną górną wartość i przywróciła ją podczas ustawiania stałej szerokości? Co masz na myśliJust improvised mVChr code
?Dostosowałem odpowiedź @ mVchr i odwróciłem ją, aby użyć do pozycjonowania reklamy przyklejonej: jeśli potrzebujesz jej absolutnie pozycjonowanej (przewijanie), aż śmieci nagłówka znikną z ekranu, ale potem chcesz, aby pozostała naprawiona / widoczna na ekranie:
$.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; }
źródło
Uwielbiałem odpowiedź @james, ale szukałem jej odwrotności, tj. Zatrzymaj stałą pozycję tuż przed stopką, oto co wymyśliłem
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)); }
Więc teraz stały element zatrzymałby się tuż przed stopką. i nie będzie się z nim pokrywać.
źródło