Событие триггера при прокрутке пользователя до определенного элемента-с помощью jQuery
у меня есть h1, который находится далеко вниз по странице..
<h1 id="scroll-to">TRIGGER EVENT WHEN SCROLLED TO.</h1>
и я хочу, чтобы вызвать предупреждение, когда пользователь прокручивает до h1, или имеет его в представлении браузера.
$('#scroll-to').scroll(function() {
alert('you have scrolled to the h1!');
});
как мне это сделать?
9 ответов:
вы можете посчитать
offsetэлемента, а затем сравнить, что сscrollзначение:$(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!'); } });проверить это Демо-Скрипка
Обновлено Демо-Скрипка нет предупреждения -- вместо FadeIn () элемент
обновленный код, чтобы проверить, если элемент находится внутри окна просмотра или нет. Таким образом, это работает независимо от того, прокручиваете ли Вы вверх или вниз, добавляя некоторые правила к if заявление:
if (wS > (hT+hH-wH) && (hT > wS) && (wS+wH > hT+hH)){ //Do something }
объединение этого вопроса с лучшим ответом от действие триггера jQuery, когда пользователь прокручивает определенную часть страницы
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 } });обновление
я улучшил код так, что он срабатывает, когда элемент находится на полпути вверх по экрану, а не на самом верху. Он также вызовет код, если пользователь попадает в нижнюю часть экрана, и функция еще не запущена.
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 } });
Я думаю, что лучше всего было бы использовать существующую библиотеку, которая делает именно это:
http://imakewebthings.com/jquery-waypoints/
вы можете добавить слушателей к вашим элементам, которые будут срабатывать, когда ваш элемент попадает в верхнюю часть окна просмотра:
$('#scroll-to').waypoint(function() { alert('you have scrolled to the h1!'); });для удивительной демонстрации его в использовании:
http://tympanus.net/codrops/2013/07/16/on-scroll-header-effects/
библиотека Inview вызвала событие и хорошо работает с jquery 1.8 и выше! 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 } });прочитайте это https://remysharp.com/2009/01/26/element-in-view-event-plugin
Это должно быть то, что вам нужно.
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>проверьте это bootply: http://www.bootply.com/atin_agarwal2/cJBywxX5Qp
можно использовать плагин jQuery С
inviewсобытие вроде этого :jQuery('.your-class-here').one('inview', function (event, visible) { if (visible == true) { //Enjoy ! } });Ссылка:https://remysharp.com/2009/01/26/element-in-view-event-plugin
просто быстрая модификация для ответа DaniP, ибо каждый, кто имеет дело с элементами, которые иногда могут выходить за пределы устройства просмотра.
добавлено только небольшое условие - в случае элементов, которые больше, чем видовой экран, элемент будет показан, как только его верхняя половина полностью заполнит видовой экран.
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; }
Если вы делаете много функций, основанных на положении прокрутки, прокрутите magic (http://scrollmagic.io/) построен полностью для этой цели.
Это позволяет легко запускать JS на основе того, когда пользователь достигает определенных элементов при прокрутке. Он также интегрируется с движком анимации GSAP (https://greensock.com/) который отлично подходит для параллакса прокрутки веб-сайтов
вы можете использовать это для всех устройств,
$(document).on('scroll', function() { if( $(this).scrollTop() >= $('#target_element').position().top ){ do_something(); } });
Comments