Содержание

scroll и wheel — JavaScript — Дока

Кратко

Секция статьи «Кратко»

scroll — это событие на HTML-элементе. Событие происходит, когда страница или элемент не входит на экран и пользователь её прокручивает. Способ прокрутки может быть любым — колесом мыши, кнопками клавиатуры, с помощью полосы прокрутки на экране.

Событие wheel происходит, когда пользователь прокручивает колесо мыши. При этом реального прокручивания может не происходить. Например, наша страница полностью помещается на экран, но пользователь пытается её прокрутить. В этом случае событие wheel будет происходить, а событие scroll — нет.

Событие wheel говорит о том, что пользователь пытается прокрутить страницу или элемент, а событие scroll говорит о том, что прокрутка реально происходит.

Как пишется

Секция статьи «Как пишется»

Стандартно с помощью addEventListener():

document. addEventListener('scroll', function(event) {  console.log(event)})
          document.addEventListener('scroll', function(event) {
  console.log(event)
})

Отловим все случаи, когда пользователь крутит колесо мыши при наведённом на первый <div> курсоре:

const div = document.getElementsByTagName('div')[0]div.addEventListener('wheel', function(event) {  console.log(event)})
          const div = document.getElementsByTagName('div')[0]
div.addEventListener('wheel', function(event) {
  console.log(event)
})

Как понять

Секция статьи «Как понять»

Разницу между событиями можно понять на демо ниже. wheel происходит всегда когда пользователь крутит колесо мыши (или что-то его заменяющее), а scroll только при прокрутке:

Открыть демо в новой вкладке

Объект события

scroll Секция статьи «Объект события scroll»

scroll использует базовый элемент события, в котором отсутствует информация о скорости прокрутки и направлении.

Чтобы понять, насколько прокрутилась страница или элемент, этот элемент получают из DOM-дерева или ключевого слова this и запрашивают свойства scrollTop или scrollLeft.

document.addEventListener('scroll', function() {  // получаем высоту элемента, на котором произошло событие  console.log(this.scrollTop)})
          document.addEventListener('scroll', function() {
  // получаем высоту элемента, на котором произошло событие
  console.log(this.scrollTop)
})

Объект события

wheel Секция статьи «Объект события wheel»

Так как прокрутки при wheel не происходит, объект события содержит информацию о направлении и «силе» прокрутки в свойствах:

  • deltaX — горизонтальная прокрутка. Значение — целое число:
    • отрицательное, если пользователь прокручивает влево;
    • 0 — если в этом направлении прокрутка не происходит
    • положительное при прокрутке вправо;
  • deltaY — вертикальная прокрутка. Значение — целое число:
    • отрицательное, если пользователь прокручивает вверх;
    • 0 — если в этом направлении прокрутка не происходит
    • положительное при прокрутке вниз;

Если элемент имеет полосу прокрутки, то обычно после события

wheel происходит scroll (смотри пример выше). Этого можно избежать, вызвав метод события preventDefault().

document.addEventListener('wheel', function(event) {  // останавливаем поведение по умолчанию, то есть прокрутку  event.preventDefault()})
          document.addEventListener('wheel', function(event) {
  // останавливаем поведение по умолчанию, то есть прокрутку
  event.preventDefault()
})

С помощью объекта события можно, например, перемещать элемент по экрану при прокрутке колеса мыши на десктопе. Чтобы посмотреть, как это работает, откройте демо в новой вкладке по ссылке внизу.

Открыть демо в новой вкладке

На практике

Секция статьи «На практике»

Николай Лопин

Секция статьи «Николай Лопин»

🛠 Если вы подписались на scroll, то приготовьтесь получать большое количество событий. Событие будет приходить примерно на каждый кадр. Поэтому в обработчике не рекомендуется производить тяжёлых вычислений и модификации DOM. Это приведёт к потере кадров при отрисовке и ощущения, что сайт тормозит.

🛠 Избежать большого количества событий scroll можно, используя технику под названием throttling. Её смысл состоит в том, чтобы принимать следующее событие только после истечения некоторого промежутка времени.

const throttle = (func, limit) => {  let lastFunc  let lastRan  return function() {    const context = this    const args = arguments    if (!lastRan) {      func.apply(context, args)      lastRan = Date.now()    } else {      clearTimeout(lastFunc)      lastFunc = setTimeout(function() {        if ((Date.now() - lastRan) >= limit) {          func.apply(context, args)          lastRan = Date.now()        }      }, limit - (Date.now() - lastRan))    }  }}// код будет срабатывать раз в 1 секундуdocument.addEventListener('scroll', throttle(function() {  return console. log('Hey! It is', new Date().toUTCString())}, 1000))
          
const throttle = (func, limit) => { let lastFunc let lastRan return function() { const context = this const args = arguments if (!lastRan) { func.apply(context, args) lastRan = Date.now() } else { clearTimeout(lastFunc) lastFunc = setTimeout(function() { if ((Date.now() - lastRan) >= limit) { func.apply(context, args) lastRan = Date.now() } }, limit - (Date.now() - lastRan)) } } } // код будет срабатывать раз в 1 секунду document.addEventListener('scroll', throttle(function() { return console.log('Hey! It is', new Date().toUTCString()) }, 1000))

Отслеживание прокрутки. Компоненты · Bootstrap. Версия v4.6

Cмотреть на GitHub

Автоматически обновляйте элементы навигации Bootstrap или группы списков в зависимости от положения прокрутки, чтобы указать, какая ссылка в данный момент активна в области просмотра.

Как это устроено

Скроллспай имеет несколько требований для правильной работы:

  • Если вы подключаете JavaScript из файлов, вам потребуется util.js.
  • Скроллспай надо создавать на компонентах навигации или группе списка.
  • Скроллспай требует position: relative; у того элемента, по которому производится работа скроллспай, обычно это
    <body>
    .
  • Когда работа плагина происходит по другим элементам <body>, удостоверьтесь, что задали height и overflow-y: scroll;.
  • Якоря (<a>) требуются для работы и должны указывать на элемент с тем же id.

При успешном применении ваши элементы nav или группы списка будут обновляться соответственно, передавая класс .active от одного элемента другому, базируясь на связанных с ними «целях».

Примеры в navbar

Прокручивайте область ближе к навбару и наблюдайте, как изменяется активный класс. Выпадающие элементы будут также выделены.

@fat

Placeholder content for the scrollspy example. You got the finest architecture. Passport stamps, she’s cosmopolitan. Fine, fresh, fierce, we got it on lock. Never planned that one day I’d be losing you. She eats your heart out. Your kiss is cosmic, every move is magic. I mean the ones, I mean like she’s the one. Greetings loved ones let’s take a journey. Just own the night like the 4th of July! But you’d rather get wasted.

@mdo

Placeholder content for the scrollspy example. ‘Cause she’s the muse and the artist. (This is how we do) So you wanna play with magic. So just be sure before you give it all to me. I’m walking, I’m walking on air (tonight). Skip the talk, heard it all, time to walk the walk.

один

Placeholder content for the scrollspy example. Takes you miles high, so high, ’cause she’s got that one international smile. There’s a stranger in my bed, there’s a pounding in my head. Oh, no. In another life I would make you stay. ‘Cause I, I’m capable of anything. Suiting up for my crowning battle. Used to steal your parents’ liquor and climb to the roof. Tone, tan fit and ready, turn it up cause its gettin’ heavy. Her love is like a drug. I guess that I forgot I had a choice.

два

Placeholder content for the scrollspy example. It’s time to bring out the big balloons. I’m walking, I’m walking on air (tonight). Yeah, we maxed our credit cards and got kicked out of the bar. Yo, shout out to all you kids, buying bottle service, with your rent money. I’m ma get your heart racing in my skin-tight jeans. If you get the chance you better keep her. Yo, shout out to all you kids, buying bottle service, with your rent money.

три

Placeholder content for the scrollspy example. If you wanna dance, if you want it all, you know that I’m the girl that you should call. Walk through the storm I would. So let me get you in your birthday suit. The one that got away. Last Friday night, yeah I think we broke the law, always say we’re gonna stop. ‘Cause she’s a little bit of Yoko, And she’s a little bit of ‘Oh no’. I want the jaw droppin’, eye poppin’, head turnin’, body shockin’. Yeah, we maxed our credit cards and got kicked out of the bar.

And some more placeholder content, for good measure.

<nav>
  <a href="#">Панель навигации</a>
  <ul>
    <li>
      <a href="#fat">@fat</a>
    </li>
    <li>
      <a href="#mdo">@mdo</a>
    </li>
    <li>
      <a data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">Выпадающий список</a>
      <div>
        <a href="#one">один</a>
        <a href="#two">два</a>
        <div role="separator"></div>
        <a href="#three">три</a>
      </div>
    </li>
  </ul>
</nav>
<div data-spy="scroll" data-target="#navbar-example2" data-offset="0">
  <h5>@fat</h5>
  <p>.
..</p> <h5>@mdo</h5> <p>...</p> <h5>один</h5> <p>...</p> <h5>два</h5> <p>...</p> <h5>три</h5> <p>...</p> </div>

Пример с вложенным элементом nav

Если вложенный элемент класса .nav имеет класс .active, его «родители» будут также иметь класс .active. Прокрутите к области, близкой к навбару, и увидите, как класс активного элемента изменится.

Элемент 1

Placeholder content for the scrollspy example. This one relates to item 1. Takes you miles high, so high, ’cause she’s got that one international smile. There’s a stranger in my bed, there’s a pounding in my head. Oh, no. In another life I would make you stay. ‘Cause I, I’m capable of anything. Suiting up for my crowning battle. Used to steal your parents’ liquor and climb to the roof. Tone, tan fit and ready, turn it up cause its gettin’ heavy. Her love is like a drug. I guess that I forgot I had a choice.

Элемент 1-1

Placeholder content for the scrollspy example. This one relates to the item 1-1. You got the finest architecture. Passport stamps, she’s cosmopolitan. Fine, fresh, fierce, we got it on lock. Never planned that one day I’d be losing you. She eats your heart out. Your kiss is cosmic, every move is magic. I mean the ones, I mean like she’s the one. Greetings loved ones let’s take a journey. Just own the night like the 4th of July! But you’d rather get wasted.

Элемент 1-2

Placeholder content for the scrollspy example. This one relates to the item 1-2. Her love is like a drug. All my girls vintage Chanel baby. Got a motel and built a fort out of sheets. ‘Cause she’s the muse and the artist. (This is how we do) So you wanna play with magic. So just be sure before you give it all to me. I’m walking, I’m walking on air (tonight). Skip the talk, heard it all, time to walk the walk. Catch her if you can. Stinging like a bee I earned my stripes.

Элемент 2

Placeholder content for the scrollspy example. This one relates to item 2. Don’t need apologies. There is no fear now, let go and just be free, I will love you unconditionally. Last Friday night. Don’t be a shy kinda guy I’ll bet it’s beautiful. Summer after high school when we first met. ‘Cause she’s the muse and the artist. What? Wait. No, no, no, no. Thought that I was the exception.

Элемент 3

Placeholder content for the scrollspy example. This one relates to item 3. Word on the street, you got somethin’ to show me, me. All this money can’t buy me a time machine. Make it like your birthday everyday. So we hit the boulevard. You make me feel like I’m livin’ a teenage dream, the way you turn me on Skip the talk, heard it all, time to walk the walk. Word on the street, you got somethin’ to show me, me. It’s no big deal, it’s no big deal, it’s no big deal.

Элемент 3-1

Placeholder content for the scrollspy example. This one relates to item 3-1. Baby do you dare to do this? This is no big deal. Yeah, you’re lucky if you’re on her plane. Just own the night like the 4th of July! Standing on the frontline when the bombs start to fall. So just be sure before you give it all to me.

Элемент 3-2

Placeholder content for the scrollspy example. This one relates to item 3-2. You’re original, cannot be replaced. All night they’re playing, your song. California girls we’re undeniable. Like a bird without a cage. There is no fear now, let go and just be free, I will love you unconditionally. I can see the writing on the wall. You could travel the world but nothing comes close to the golden coast.

<nav>
  <a href="#">Панель навигации</a>
  <nav>
    <a href="#item-1">Элемент 1</a>
    <nav>
      <a href="#item-1-1">Элемент 1-1</a>
      <a href="#item-1-2">Элемент 1-2</a>
    </nav>
    <a href="#item-2">Элемент 2</a>
    <a href="#item-3">Элемент 3</a>
    <nav>
      <a href="#item-3-1">Элемент 3-1</a>
      <a href="#item-3-2">Элемент 3-2</a>
    </nav>
  </nav>
</nav>

<div data-spy="scroll" data-target="#navbar-example3" data-offset="0">
  <h5>Элемент 1</h5>
  <p>. ..</p>
  <h5>Элемент 1-1</h5>
  <p>...</p>
  <h5>Элемент 1-2</h5>
  <p>...</p>
  <h5>Элемент 2</h5>
  <p>...</p>
  <h5>Элемент 3</h5>
  <p>...</p>
  <h5>Элемент 3-1</h5>
  <p>...</p>
  <h5>Элемент 3-2</h5>
  <p>...</p>
</div>

Пример с группой списков

Скроллспай также работает с элементами класса .list-group. Прокрутите до области, близкой к группе списков, и увидите, как изменяется активный класс.

Элемент 1 Элемент 2 Элемент 3 Элемент 4

<div>
  <a href="#list-item-1">Элемент 1</a>
  <a href="#list-item-2">Элемент 2</a>
  <a href="#list-item-3">Элемент 3</a>
  <a href="#list-item-4">Элемент 4</a>
</div>
<div data-spy="scroll" data-target="#list-example" data-offset="0">
  <h5>Элемент 1</h5>
  <p>. ..</p>
  <h5>Элемент 2</h5>
  <p>...</p>
  <h5>Элемент 3</h5>
  <p>...</p>
  <h5>Элемент 4</h5>
  <p>...</p>
</div>

Использование

Через атрибуты

Для легкого добавления функциональности скроллспая к вашей панели навигации вверху страницы, добавьте атрибут data-spy="scroll" к элементу, который вы хотите отслеживать скроллспаем (обычно это бывает <body>). Затем добавьте атрибут data-target с ID или классом родительского элемента любого компонента .nav.

body {
  position: relative;
}
<body data-spy="scroll" data-target="#navbar-example">
  ...
  <div>
    <ul role="tablist">
      ...
    </ul>
  </div>
  . ..
</body>

Через JavaScript

После добавления position: relative; в ваш CSS, вызовите скроллспай через JavaScript:

$('body').scrollspy({ target: '#navbar-example' })
Resolvable ID targets required

Ссылки навбара должны быть нацелены на элементы с соответствующими id. Например, элемент <a href="#home">home</a> должен соотноситься с неким элементом DOM, имеющим такой же id: <div></div>.

Методы

.scrollspy('refresh')

Используя скроллспай в сочетании с добавлением или удалением элементов из DOM, вам потребуется вызывать данный метод вот так:

$('[data-spy="scroll"]').each(function () {
  var $spy = $(this).scrollspy('refresh')
})
.scrollspy('dispose')

Уничтожает скроллспай элемента.

Параметры

Параметры можно передавать через атрибуты или JavaScript. В случае атрибутов – добавьте название параметра к data-, как в data-offset="".

Название Тип Умолч. Описание
offset number 10 Число пикселей для отступа от верха при вычислении позиции прокрутки.
method string auto Находит, в каком разделе находится элемент spied. auto выберет лучший метод получения координат прокрутки. offset будет использовать метод смещения jQuery для получения координат прокрутки. position будет использовать метод позиционирования jQuery для получения координат прокрутки.
target string Определяет элемент для применения плагина Scrollspy.

События

Тип события Описание
activate.bs.scrollspy Это событие запускается на элементе прокрутки независимо от того, активирован ли скроллспаем новый элемент или нет.
$('[data-spy="scroll"]').on('activate.bs.scrollspy', function () {
  // сделайте что-нибудь...
})

Please enable JavaScript to view the comments powered by Disqus.

10 лучших плагинов прокрутки одной страницы для мобильных устройств (обновление 2022 г.)

Что такое прокрутка одной страницы?

Прокрутка одной страницы — это веб-технология, которая позволяет использовать возможности прокрутки мобильного приложения в Интернете.

С помощью One Page Scroll ваши посетители могут плавно прокручивать разделы страницы (с полной шириной и высотой), как на мобильных устройствах.

Лучший плагин прокрутки одной страницы

В этом посте мы перечисляем 10 лучших плагинов jQuery и Vanilla JavaScript для прокрутки одной страницы с сенсорным экраном , которые отлично работают как на ПК, так и на мобильных устройствах. Наслаждаться.

Первоначально опубликовано 14 февраля 2019 г., обновлено 31 января 2022 г.

  • Плагины прокрутки одной страницы Vanilla JS
  • Лучшие плагины jQuery для прокрутки одной страницы

    Создание полноэкранных веб-сайтов с прокруткой одной страницы с помощью fullPage.js

    fullPage.js — еще один плагин jQuery для одностраничного веб-сайта, который позволяет создавать веб-страницы с вертикальной или горизонтальной прокруткой с плавной анимацией и плавностью. опции.

    [Демо] [Скачать]


    Автоматический переход к следующему разделу при прокрутке — SnapScroll

    Плагин jQuery для веб-сайта с прокруткой одной страницы, который имеет возможность автоматически прокручивать следующий раздел страницы при прокрутке вверх/вниз. веб-страницу с помощью колесика мыши.

    [Демо] [Скачать]


    Горизонтальный и вертикальный плагин прокрутки одной страницы — jQuery fsscroll

    Легкий (менее 4 КБ), быстрый плагин jQuery прокрутки одной страницы, который поможет вам создать отзывчивый полноэкранный слайдер/карусель страниц который поддерживает как горизонтальное, так и вертикальное направление.

    [Демо] [Скачать]


    Плагин JavaScript для плавной привязки прокрутки — panelSnap

    Плагин JavaScript (jQuery является необязательным), который позволяет привязываться к блокам контента при прокрутке веб-страницы или ее частей. .

    [Демо] [Скачать]


    Плагин jQuery для красивого веб-сайта с полноэкранной прокруткой — pagePiling.js

    Еще один плагин jQuery для прокрутки одной страницы, который позволяет вертикально и плавно перемещать веб-страницу к нужной точке привязки .

    [Демо] [Скачать]


    Лучшие ванильные плагины для прокрутки одной страницы на JavaScript

    onepagescroll.

    js

    Облегченная библиотека JavaScript, упрощающая создание эффекта плавной прокрутки с помощью навигации по боковой странице. страничный веб-сайт / одностраничное приложение. Поддерживается навигация с помощью клавиатуры и сенсорные события.

    Загрузка демо-версии


    Боковая навигация для веб-сайта с прокруткой одной страницы — точка-nav

    Библиотека JavaScript с точкой-навигация автоматически создает вертикальную боковую навигацию для веб-сайта с прокруткой одной страницы.

    Загрузка демоверсии


    fullPageScrollPureJS

    Чистая реализация JavaScript/CSS для кросс-платформенной плавной прокрутки одной страницы без третьих зависимостей.

    [Демо] [Скачать]


    Библиотека навигации с простой прокруткой одной страницы – слайд-навигация

    Легкий, простой в использовании плагин JavaScript, используемый для создания липкой навигации для ваших веб-страниц с прокруткой одной страницы. Scrollspy и плавная прокрутка также поддерживаются.

    Скачать демонстрационную версию


    Плагин вертикальной прокрутки одной страницы с JavaScript — Cachu Slider

    Cachu Slider — это надежный плагин слайдера страниц JavaScript, который поможет вам с легкостью создать полностью отзывчивый веб-сайт с прокруткой одной страницы или одностраничное веб-приложение.

    Загрузка демоверсии


    Дополнительные ресурсы:

    Ищете дополнительные плагины jQuery или библиотеки JavaScript для создания потрясающих эффектов прокрутки одной страницы в Интернете и на мобильных устройствах? Дополнительные сведения см. в разделах jQuery One Page Scroll и JavaScript One Page Scroll.

    См. также:

    • Лучшие библиотеки JavaScript для прокрутки одной страницы
    • Лучшие плагины с эффектом прокрутки параллакса
    • Лучшие плагины Smooth Scroll
    • Лучшие плагины Scrollspy для JavaScript
    • Лучшие плагины бесконечной прокрутки в JavaScript
    • Лучшие плагины анимации, активируемые прокруткой, с JavaScript

    Перемещение, прокрутка и изменение размера окна

    Прокрутка окна

    Та же концепция, только разные действия. scrollBy() и Методы scrollTo() позволяют программно прокручивать окно вверх-вниз, влево-вправо или в оба. Вот они, аккуратно перечисленные в таблица:

    Методы Описание
    scrollBy(dx, dy) Прокручивает окно на указанную величину в пикселях
    прокрутить до (х, у) Прокручивает окно с до указанного значения пикселей

    Я думаю, довольно понятно, как каждый из них работы, так что вместо этого я просто сосредоточусь на паре их приложений.

    Пример №1: Запрет прокрутки пользователем вниз

    В этом первом примере метод scrollTo() используется для «заблокировать» прокрутку страницы. Это полезно, скажем, когда вы хотите чтобы пользователь мог взаимодействовать со страницей только тогда, когда она полностью загружен. Реализация довольно проста, на самом деле. Просто постоянно звоните window.scrollTo(0,0) и отключите его только после завершения страницы. загрузка. Вот полный рабочий код:

     
    <голова>
    <тип сценария="текст/javascript">
    var lockit = setInterval ("window.scrollTo (0,0)", 10)
    
    
    
    
     

    Для всех, кто не знаком с используемым методом setInterval выше, это метод JavaScript, который работает аналогично setTimeout, кроме setInterval постоянно запускает функцию с указанными интервалами по второму параметру (а не только один раз).

    Пример №2: Ссылка как полоса прокрутки

    Теперь, при наличии метода moveBy(), вы можете легко имитировать полосы прокрутки браузера по умолчанию с помощью скрипта.