Подія тригера, коли користувач переходить до певного елемента - за допомогою jQuery


88

У мене є h1, який знаходиться далеко на сторінці ..

<h1 id="scroll-to">TRIGGER EVENT WHEN SCROLLED TO.</h1>

і я хочу спрацьовувати попередження, коли користувач прокручує до h1 або має його у своєму браузері.

$('#scroll-to').scroll(function() {
     alert('you have scrolled to the h1!');
});

як мені це зробити?

Відповіді:


153

Ви можете розрахувати 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
   }

Демо-скрипка


14
Зречіться цього, будь ласка!
Фрамбот,

1
Чи існує якась бібліотека пакунків, яка робить це як функцію, як jQuery Waypoint?
Карл Коельо

1
Дякую @DaniP. Класний фрагмент!
Anahit DEV

2
@ClosDesign, який можна використати .off()для розв’язування
DaniP

1
@DaniP Я щойно зробив, дякую! І спасибі за відповідь, мені дуже допомогло :)
Паоло

30

Поєднуючи це запитання з найкращою відповіддю дії запуску 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
    }
});

9

Я думаю, що найкращим варіантом було б використовувати існуючу бібліотеку, яка робить саме те:

http://imakewebthings.com/waypoints/

Ви можете додати слухачів до своїх елементів, які запускатимуться, коли ваш елемент потрапляє у верхню частину області перегляду:

$('#scroll-to').waypoint(function() {
 alert('you have scrolled to the h1!');
});

Для дивовижної демонстрації його використання:

http://tympanus.net/codrops/2013/07/16/on-scroll-header-effects/


1
Я вже пробував це. Це спрацьовує лише після прокрутки елемента PAST. Будь-які інші рішення?
Карл Коельо

Це рішення добре працює для отримання рекомендацій, і я використовував його у виробництві. Зверніться до блогу: liyao13.wordpress.com/2017/05/11/…
Яо Лі


4

Ви можете використовувати це на всіх пристроях,

$(document).on('scroll', function() {
    if( $(this).scrollTop() >= $('#target_element').position().top ){
        do_something();
    }
});

4

Запустити прокрутку лише один раз після успішної прокрутки

Прийнята відповідь спрацювала для мене (90%), але мені довелося трохи її налаштувати, щоб насправді запустити лише один раз.

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

        });

Примітка : Під успішною прокруткою я маю на увазі, коли користувач прокрутив мій елемент або іншими словами, коли мій елемент перебуває у полі зору.



2

Це має бути те, що вам потрібно.

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>

Перевірте це завантаження: http://www.bootply.com/atin_agarwal2/cJBywxX5Qp


2

Intersection Observer може бути найкращим для IMO, без жодної зовнішньої бібліотеки він робить справді хорошу роботу.

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

1

Якщо ви виконуєте багато функціональних можливостей, заснованих на положенні прокрутки, магія прокрутки ( http://scrollmagic.io/ ) повністю створена для цієї мети.

Це полегшує спрацьовування JS на основі того, коли користувач досягає певних елементів під час прокрутки. Він також інтегрується з механізмом анімації GSAP ( https://greensock.com/ ), який чудово підходить для прокрутки веб-сайтів паралакс


1

Просто швидка модифікація відповіді 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;
}

Я б запропонував використовувати менш загадкові імена змінних, навіть якщо прийнята відповідь використовує їх.
weirdan

0

Я постійно використовую той самий код, тому додав простий плагін jquery. 480 байт в довжину і швидко. Тільки пов'язані елементи, проаналізовані під час виконання.

https://www.npmjs.com/package/jquery-on-scroll-to

Це буде $('#scroll-to').onScrolledTo(0, function() { alert('you have scrolled to the h1!'); });

або використовуйте 0,5 замість 0, якщо потрібно попередити про появу половини h1.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.