Możesz obliczyć offset
element, a następnie porównać go z scroll
wartością, taką jak:
$(window).scroll(function() {
var hT = $('#scroll-to').offset().top,
hH = $('#scroll-to').outerHeight(),
wH = $(window).height(),
wS = $(this).scrollTop();
if (wS > (hT+hH-wH)){
console.log('H1 on the view!');
}
});
Sprawdź to Demo Fiddle
Zaktualizowano Demo Fiddle no alert - zamiast tego FadeIn () element
Zaktualizowano kod, aby sprawdzić, czy element znajduje się wewnątrz rzutni, czy nie. Dlatego działa to niezależnie od tego, czy przewijasz w górę, czy w dół, dodając pewne reguły do instrukcji if:
if (wS > (hT+hH-wH) && (hT > wS) && (wS+wH > hT+hH)){
}
Demo Fiddle
.off()
do usunięcia powiązania wydarzenia jsfiddle.net/n4pdx/543Połączenie tego pytania z najlepszą odpowiedzią z jQuery wyzwala akcję, gdy użytkownik przewinie określoną część strony
var element_position = $('#scroll-to').offset().top; $(window).on('scroll', function() { var y_scroll_pos = window.pageYOffset; var scroll_pos_test = element_position; if(y_scroll_pos > scroll_pos_test) { //do stuff } });
AKTUALIZACJA
Poprawiłem kod tak, aby uruchamiał się, gdy element znajduje się w połowie ekranu, a nie na samej górze. Uruchomi również kod, jeśli użytkownik dotknie dolnej części ekranu, a funkcja nie została jeszcze uruchomiona.
var element_position = $('#scroll-to').offset().top; var screen_height = $(window).height(); var activation_offset = 0.5;//determines how far up the the page the element needs to be before triggering the function var activation_point = element_position - (screen_height * activation_offset); var max_scroll_height = $('body').height() - screen_height - 5;//-5 for a little bit of buffer //Does something when user scrolls to it OR //Does it when user has reached the bottom of the page and hasn't triggered the function yet $(window).on('scroll', function() { var y_scroll_pos = window.pageYOffset; var element_in_view = y_scroll_pos > activation_point; var has_reached_bottom_of_page = max_scroll_height <= y_scroll_pos && !element_in_view; if(element_in_view || has_reached_bottom_of_page) { //Do something } });
źródło
Myślę, że najlepszym rozwiązaniem byłoby wykorzystanie istniejącej biblioteki, która robi właśnie to:
http://imakewebthings.com/waypoints/
Możesz dodać detektory do swoich elementów, które będą odpalane, gdy element dotrze do górnej części widoku:
$('#scroll-to').waypoint(function() { alert('you have scrolled to the h1!'); });
Aby uzyskać niesamowite demo w użyciu:
http://tympanus.net/codrops/2013/07/16/on-scroll-header-effects/
źródło
Zdarzenie wyzwalane przez bibliotekę Inview i działa dobrze z jquery 1.8 i nowszymi! https://github.com/protonet/jquery.inview
$('div').on('inview', function (event, visible) { if (visible == true) { // element is now visible in the viewport } else { // element has gone out of viewport } });
Przeczytaj to https://remysharp.com/2009/01/26/element-in-view-event-plugin
źródło
Możesz użyć tego dla wszystkich urządzeń,
$(document).on('scroll', function() { if( $(this).scrollTop() >= $('#target_element').position().top ){ do_something(); } });
źródło
Zwój ognia tylko raz po udanym zwoju
Zaakceptowana odpowiedź zadziałała dla mnie (90%), ale musiałem trochę ją poprawić, aby odpalić tylko raz.
$(window).on('scroll',function() { var hT = $('#comment-box-section').offset().top, hH = $('#comment-box-section').outerHeight(), wH = $(window).height(), wS = $(this).scrollTop(); if (wS > ((hT+hH-wH)-500)){ console.log('comment box section arrived! eh'); // After Stuff $(window).off('scroll'); doStuff(); } });
źródło
Możesz użyć wtyczki jQuery do
inview
takiego zdarzenia:jQuery('.your-class-here').one('inview', function (event, visible) { if (visible == true) { //Enjoy ! } });
Link: https://remysharp.com/2009/01/26/element-in-view-event-plugin
źródło
To powinno być tym, czego potrzebujesz.
JavaScript:
$(window).scroll(function() { var hT = $('#circle').offset().top, hH = $('#circle').outerHeight(), wH = $(window).height(), wS = $(this).scrollTop(); console.log((hT - wH), wS); if (wS > (hT + hH - wH)) { $('.count').each(function() { $(this).prop('Counter', 0).animate({ Counter: $(this).text() }, { duration: 900, easing: 'swing', step: function(now) { $(this).text(Math.ceil(now)); } }); }); { $('.count').removeClass('count').addClass('counted'); }; } });
CSS:
#circle { width: 100px; height: 100px; background: blue; -moz-border-radius: 50px; -webkit-border-radius: 50px; border-radius: 50px; float:left; margin:5px; } .count, .counted { line-height: 100px; color:white; margin-left:30px; font-size:25px; } #talkbubble { width: 120px; height: 80px; background: green; position: relative; -moz-border-radius: 10px; -webkit-border-radius: 10px; border-radius: 10px; float:left; margin:20px; } #talkbubble:before { content:""; position: absolute; right: 100%; top: 15px; width: 0; height: 0; border-top: 13px solid transparent; border-right: 20px solid green; border-bottom: 13px solid transparent; }
HTML:
<div id="talkbubble"><span class="count">145</span></div> <div style="clear:both"></div> <div id="talkbubble"><span class="count">145</span></div> <div style="clear:both"></div> <div id="circle"><span class="count">1234</span></div>
Sprawdź ten bootply: http://www.bootply.com/atin_agarwal2/cJBywxX5Qp
źródło
Intersection Observer może być najlepszą rzeczą w IMO, bez żadnej zewnętrznej biblioteki wykonuje naprawdę dobrą robotę.
const options = { root: null, threshold: 0.25, // 0 - 1 this work as a trigger. rootMargin: '150px' }; const target = document.querySelector('h1#scroll-to'); const observer = new IntersectionObserver( entries => { // each entry checks if the element is the view or not and if yes trigger the function accordingly entries.forEach(() => { alert('you have scrolled to the h1!') }); }, options); observer.observe(target);
źródło
Jeśli wykonujesz wiele funkcji opartych na pozycji przewijania, Scroll magic ( http://scrollmagic.io/ ) jest zbudowany całkowicie w tym celu.
Ułatwia uruchamianie JS na podstawie tego, kiedy użytkownik osiągnie określone elementy podczas przewijania. Integruje się również z silnikiem animacji GSAP ( https://greensock.com/ ), który doskonale sprawdza się w przypadku witryn z przewijaniem paralaksy
źródło
Tylko szybka modyfikacja odpowiedzi DaniP dla każdego, kto ma do czynienia z elementami, które czasami mogą wykraczać poza granice widoku urządzenia.
Dodano tylko niewielki warunek - w przypadku elementów, które są większe niż rzutnia, element zostanie ujawniony, gdy jego górna połowa całkowicie wypełni rzutnię.
function elementInView(el) { // The vertical distance between the top of the page and the top of the element. var elementOffset = $(el).offset().top; // The height of the element, including padding and borders. var elementOuterHeight = $(el).outerHeight(); // Height of the window without margins, padding, borders. var windowHeight = $(window).height(); // The vertical distance between the top of the page and the top of the viewport. var scrollOffset = $(this).scrollTop(); if (elementOuterHeight < windowHeight) { // Element is smaller than viewport. if (scrollOffset > (elementOffset + elementOuterHeight - windowHeight)) { // Element is completely inside viewport, reveal the element! return true; } } else { // Element is larger than the viewport, handle visibility differently. // Consider it visible as soon as it's top half has filled the viewport. if (scrollOffset > elementOffset) { // The top of the viewport has touched the top of the element, reveal the element! return true; } } return false; }
źródło
Używam tego samego kodu przez cały czas, więc dodałem prostą wtyczkę jquery, która to robi. 480 bajtów długości i szybko. Tylko powiązane elementy analizowane w czasie wykonywania.
https://www.npmjs.com/package/jquery-on-scrolled-to
To będzie
$('#scroll-to').onScrolledTo(0, function() { alert('you have scrolled to the h1!'); });
lub użyj 0,5 zamiast 0, jeśli chcesz ostrzec, gdy pokazana jest połowa h1.
źródło