Автоматическая прокрутка страницы в браузере
Анимации, имеющие отношение к скроллингу веб-страниц, существуют уже многие годы. В последнее время подобные анимации стали распространённее. Возможно, дело тут отчасти в том, что устройства, используемые для работы в интернете, стали мощнее. Эти устройства способны нормально обрабатывать и выводить больше визуальных эффектов, чем раньше.
Существует множество технологий, связанных со скроллингом. Цель этой статьи заключается в том, чтобы дать обзор таких технологий и инструментов, которые помогут подобрать и создать то, что нужно в каждой конкретной ситуации. Я разделил бы технологии скроллинга на две широкие категории. В первую входят технологии для реализации специфических механизмов скроллинга, во вторую — технологии скроллинга общего назначения.
Технологии для реализации специфических механизмов скроллинга
В CSS существует несколько простых стандартных эффектов скроллинга, поддерживаемых современными браузерами. В некоторых случаях их применения может быть достаточно для того чтобы обеспечить особенные нужды некоего проекта.
▍CSS-свойство position: sticky
Если вам нужно, чтобы некий элемент не прокручивался бы вместе с остальным содержимым страницы, то при стилизации этого элемента достаточно применить свойство position: sticky . Это — простой и понятный приём, его поддержка встроена в современные браузеры. Но для того, чтобы это работало бы в IE и в некоторых мобильных браузерах, понадобится полифилл. Если вам интересна эта тема — взгляните на данный материал.
Синий элемент «упирается» в верхнюю часть контейнера и не прокручивается вместе с остальными элементами
Вот демонстрация такого скроллинга.
▍Эффект параллакса
Эффект параллакса — это, скорее, не особая технология, а специальный технический приём. Но, как бы там ни было, этот эффект может оказаться весьма кстати в тех случаях, когда нужно, чтобы при скроллинге разные части страницы двигались бы с разной скоростью. Данный приём хорошо описан в этом материале. Существует и немало примеров его реализации. Например — этот. Для меня главный минус этого приёма заключается в том, что сложно понять то, какие значения, дающие правильный эффект параллакса, нужно использовать для настройки перспективы и трансформаций.
Эффект параллакса: элементы движутся с разной скоростью.
Вот демонстрация эффекта параллакса.
▍Прокрутка с привязкой к определённым точкам
Использование скроллинга с точками привязки позволяет браузеру автоматически настраивать положение элементов, перемещая их в определённую позицию после того, как пользователь завершил обычную операцию скроллинга. Это может оказаться полезным в случаях, когда нужно, чтобы после завершения прокрутки некий элемент находился бы целиком в поле зрения пользователя. Однако соответствующий API пока ещё нестабилен, поэтому постарайтесь пользоваться самыми свежими его реализациями и с осторожностью относитесь к применению этого подхода к скроллингу в продакшне. Вот хорошая статья на эту тему.
Если пользователь, прокручивая содержимое, уводит элемент за верхнюю границу контейнера, браузер автоматически изменит положение элемента так, чтобы он был бы виден целиком
Вот демонстрация работы скроллинга с точками привязки.
▍Плавная прокрутка
Плавный скроллинг поддерживается средствами браузера при прокрутке страницы до определённого раздела с использованием метода window.scrollTo() в JavaScript, или даже с применением CSS-свойства scroll-behavior. В настоящее время для реализации плавного скроллинга со сглаживанием движений колеса мыши требуются специальные JavaScript-библиотеки. Но при применении таких библиотек нужно обеспечить их нормальное взаимодействие с другими технологиями скроллинга. Кроме того, использование плавного скроллинга — это далеко не всегда хорошая идея.
Технологии скроллинга общего назначения
В настоящее время нет способа, применяя лишь CSS, запускать какие-либо анимации скроллинга общего назначения, основываясь на позиции прокрутки (хотя имеется предложение, в соответствии с которым в отдалённом будущем в нашем распоряжении могут появиться некие анимации, основанные на технологиях скроллинга общего назначения). В результате, если вы хотите анимировать элементы при скроллинге, вам нужно, как минимум, использовать некоторый объём JavaScript-кода для достижения требуемого эффекта. Существуют два метода применения JavaScript для анимирования элементов при скроллинге. Первый заключается в использовании API Intersection Observer, второй — в обработке события scroll .
▍Использование API Intersection Observer
API IntersectionObserver позволяет с успехом решать различные задачи, связанные со скроллингом, в том случае, если всё, что нужно для запуска анимации, — это знание о том, видим ли элемент в области просмотра, а так же о том, какая именно часть элемента видима. Это делает API IntersectionObserver отличным инструментом для запуска анимации, сопровождающей появление элемента на экране. Но, даже так, некоторые эффекты очень сложно (хотя и можно) реализовать с помощью этого API. Например — это запуск разных анимаций в зависимости от направления движения элемента. Этот API, кроме того, не особенно полезен в ситуации, если при скроллинге нужно запускать анимацию тогда, когда элемент находится где-то в середине области просмотра, то есть, не появляется в области просмотра и не исчезает из неё.
▍Использование события scroll
Перед тем, кто, для реализации анимации при скроллинге, использует событие scroll , открываются очень большие возможности. Этот приём позволяет, при прокрутке, воздействовать на элемент при любом положении элемента относительно границ области просмотра. Используя событие scroll , можно очень точно, в соответствии с нуждами проекта, задавать позиции начала и окончания анимации.
Учитывая это, нужно отметить, что данный подход к анимации скроллинга может создать немалую нагрузку на систему. Так происходит в том случае, если разработчик не заботится о производительности и не ограничивает частоту обработки события scroll . Кроме того, в распоряжении программиста, который решит пользоваться событием scroll , не будет удобного API, позволяющего реализовывать различные сценарии скроллинга. Именно поэтому часто, вместо того, чтобы реализовывать механизмы обработки события scroll самостоятельно, есть смысл применить специализированную библиотеку, авторы которой уже позаботились и о влиянии обработки события scroll на производительность, и об API. Некоторые из этих библиотек даже способны помочь разработчику при возникновении проблем с размерами элементов
Инструменты для создания механизмов скроллинга общего назначения
Существует несколько мощных библиотек для реализации скроллинга, которые нацелены на то, чтобы дать разработчику полный контроль над анимациями, выполняемыми при прокрутке страниц, а так же на то, чтобы как можно сильнее облегчить разработчику жизнь, не заставляя его самостоятельно заниматься сложными вычислениями.
▍ScrollMagic
Библиотека ScrollMagic даёт нам сравнительно простой API, позволяющий создавать различные эффекты при скроллинге. Эта библиотека может работать совместно с различными библиотеками для анимации, наподобие GSAP и Velocity.js. Правда, в последние несколько лет эта библиотека недостаточно хорошо поддерживается. Это привело к тому, что была создана библиотека ScrollScene.
▍ScrollScene
ScrollScene — это, в сущности, обёртка, которая направлена на то, чтобы повысить удобство работы с библиотекой ScrollMagic и (или) с API IntersectionObserver. Здесь используется собственная версия ScrollMagic, которая отличается лучшей поддержкой, чем обычный вариант библиотеки. Тут имеются и дополнительные возможности, наподобие проигрывания видео и поддержки контрольных точек, влияющих на анимацию. Кроме того, эта библиотека использует GSAP.
▍ScrollTrigger
Библиотека ScrollTrigger — это официальный GreenSock-плагин для GSAP. Эта библиотека отличается большим набором возможностей, её API кажется мне самым простым из API существующих библиотек для скроллинга. Используя эту библиотеку, вы полностью контролируете то, где именно начинается и заканчивается анимация скроллинга, вы можете анимировать при прокрутке всё что угодно (WebGL, canvas, SVG, DOM), можете закреплять элементы на время выполнения анимации. Этим возможности данной библиотеки не ограничиваются. Кроме того, эту библиотеку поддерживает GreenSock, получить помощь по её использованию можно на форумах GreenSock.
▍Библиотека, достойная упоминания: Locomotive Scroll
Библиотека Locomotive Scroll не стремится к реализации столь же широкого набора возможностей, как другие библиотеки, о которых мы говорили. Её основная цель — реализация плавной прокрутки. Используя её, кроме того, можно анимировать некоторые свойства DOM-объектов, используя атрибуты data-* , или пользоваться обработчиком onscroll для анимирования объектов других видов.
Сравнение технологий и инструментов
Вот сравнение технологий скроллинга.
API Intersection Observer | Плавная прокрутка | Точки привязки в CSS | CSS-эффект параллакса | CSS-свойство position: sticky | |
Закрепление элементов | - | - | - | - | + |
Эффект параллакса | - | - | - | + | - |
Управление динамикой анимации | ± | - | - | ± | - |
Использование контрольных точек | ± | - | + | - | - |
Динамическая пакетная обработка элементов | + | - | - | - | - |
Поддержка эффектов горизонтального скроллинга | + | + | + | + | + |
Подходит для продакшна (хорошая браузерная поддержка) | ± | ± | ± | + | ± |
Полная свобода в анимировании | - | - | - | - | - |
Поддержка разработчиком | n/a | n/a | n/a | n/a | n/a |
Работа с DOM, Canvas, WebGl, SVG | + | - | - | - | - |
Поддержка изменения размеров элементов | + | + | + | + | + |
Ограничивает анимацию только релевантным разделом | + | + | + | - | + |
Различает направления скроллинга | ± | - | - | - | - |
Технология, встроенная в браузер | + | + | + | + | + |
Вот сравнение рассмотренных библиотек.
ScrollTrigger | Locomotive Scroll | ScrollScene | ScrollMagic | |
Закрепление элементов | + | ± | + | + |
Эффект параллакса | + | + | + | + |
Управление динамикой анимации | + | ± | ± | ± |
Использование контрольных точек | + | ± | ± | ± |
Динамическая пакетная обработка элементов | + | - | + | - |
Поддержка эффектов горизонтального скроллинга | + | + | + | + |
Подходит для продакшна (хорошая браузерная поддержка) | + | ± | + | + |
Полная свобода в анимировании | + | ± | + | + |
Поддержка разработчиком | + | + | + | - |
Работает с DOM, Canvas, WebGl, SVG | + | ± | + | + |
Поддержка изменения размеров элементов | + | + | + | ± |
Ограничивает анимацию только релевантным разделом | + | - | ± | ± |
Различает направления скроллинга | + | ± | + | + |
Технология, встроенная в браузер | - | - | - | - |
Итоги
Для реализации некоторых особых механизмов скроллинга, вроде закрепления элементов и эффекта параллакса, может быть достаточно стандартных возможностей CSS. По меньшей мере — это так при условии использования полифиллов для браузеров, которые соответствующие возможности CSS не поддерживают.
Я обычно, для настройки скроллинга, рекомендую использовать библиотеку ScrollTrigger. Она позволяет достичь всего, на что способен чистый CSS, а так же — многого другого. Эта библиотека берёт на себя заботу о браузерной поддержке тех или иных технологий, облегчает выполнение вычислений, что позволяет тому, кто её использует, просто заниматься своими делами.
Какие технологии вы используете при настройке скроллинга в своих проектах?
Мышь
Для повышения производительности пользователей Microsoft реализует ряд небольших функций, которые влияют на общее восприятие и производительность пользователя. Но иногда эти функции сталкиваются с проблемами и приводят к ненормальной работе компьютера. Одной из таких функций является то, что прокрутка мыши происходит автоматически без какого-либо вмешательства пользователя. Это может быть неприятно, и если эта ошибка повторяется, это также может сделать ваш компьютер непригодным для использования. Сегодня мы рассмотрим, как решить эту проблему с автоматической прокруткой мыши на компьютере под управлением Windows 10.
Мышь прокручивается автоматически вверх или вниз
Есть три вещи, на которые нужно взглянуть:
- Переключите соответствующую настройку мыши.
- Удалите недавно установленные обновления Windows.
- Используйте Восстановление системы.
1] Переключите соответствующую настройку мыши 10
Попробуйте нажать комбинацию WINKEY + I , чтобы запустить приложение Настройки.
Теперь перейдите к Устройствам> Мышь.
Наконец, переключите Прокручивать неактивные окна при наведении на них курсора на значение Выкл.
Перезагрузите компьютер и проверьте, исправили ли это ваши проблемы.
2] Удаление недавно установленных обновлений Windows
Чтобы удалить обновления Windows, лучший способ сделать это в безопасном режиме. Возможно, что недавно установленные обновления могли испортить программное обеспечение вашего компьютера. Чтобы сначала решить проблему, сначала загрузитесь в безопасном режиме, а затем попробуйте нажать комбинацию WINKEY + I , чтобы запустить приложение Настройки.
Теперь нажмите Обновление и безопасность.
В левом столбце меню выберите Центр обновления Windows.
Затем в правом столбце выберите Просмотреть историю обновлений.
Затем нажмите Удалить обновления.
Теперь откроется окно, в котором будет показан список всех установленных обновлений на вашем компьютере. Затем вы можете выбрать обновление, которое хотите удалить, и нажать кнопку Удалить в правом нижнем углу окна.
3] Используйте восстановление системы
Начните с нажатия комбинации WINKEY + R, чтобы запустить утилиту Выполнить . Теперь введите sysdm.cpl и нажмите Enter.
Теперь выберите вкладку с меткой Защита системы , а затем нажмите кнопку Восстановление системы .
Теперь откроется новое окно, в котором вам нужно будет выбрать желаемую точку восстановления системы.
После выбора нужной точки восстановления системы следуйте инструкциям на экране для завершения процесса.
Теперь перезагрузите компьютер и проверьте, смог ли этот метод решить вашу проблему.
Если вы читаете этот пост, вы, вероятно, ищете автоматический скроллер. Бывают времена, когда мы просто хотим расслабиться, расслабиться и захотеть, чтобы наша веб-страница просто текла перед нашим глазом, чтобы мы могли наслаждаться ее чтением. В этом посте мы поговорим о некоторых расширениях и инструментах браузера, которые могут медленно прокручивать вашу веб-страницу, и вы можете наслаждаться чтением.
Автоматическая прокрутка веб-страницы вниз или вверх
Если вы используете настольный компьютер или даже ноутбук с внешней мышью, вам просто нужно использовать среднюю кнопку мыши, и вся веб-страница будет прокручиваться автоматически. Но вам все равно придется двигать мышь, чтобы контролировать прокрутку, и, кроме того, вы не можете контролировать скорость прокрутки. Таким образом, всегда лучше использовать некоторые расширения браузера или инструменты для автоматической прокрутки веб-страницы.
Мы рассмотрим следующие параметры, которые позволяют автоматически прокручивать веб-страницу вниз или вверх:
- Автопрокрутка без использования какого-либо расширения
- Простое расширение Auto Scroll Chrome
- HandFred букмарклет
- Расширение Auto Scroll Chrome
- Лучшее расширение для Auto Scroll Chrome.
- Автопрокрутка Аддон Firefox
- Fox Scroller Firefox Аддон
Давайте посмотрим на них в деталях.
1] Автопрокрутка без использования каких-либо расширений
Вы можете использовать код для автоматической прокрутки вашей веб-страницы. Вы должны ввести код JavaScript в консоль страницы, и все готово.
Откройте веб-страницу, которую вы хотите прокрутить автоматически, и нажмите F12, чтобы открыть консоль.
Теперь скопируйте + вставьте следующий код и нажмите Enter.
Веб-страница автоматически начнет прокрутку. Чтобы остановить автоматическую прокрутку, просто нажмите клавишу F5 или обновите страницу.
Давайте теперь поговорим о расширениях и инструментах автоматической прокрутки.
2] Простое расширение для Auto Scroll Chrome
Как следует из названия, это простое расширение для браузера, которое помогает автоматически прокручивать веб-страницу. Как только вы загрузите и установите это расширение Chrome, оно добавляет маленькую кнопку на вашу панель инструментов. Вы можете управлять расширением с этой кнопки. Один щелчок даст вам медленную прокрутку, двойной щелчок даст вам среднюю скорость прокрутки, и если вы щелкнете по ней три раза, страница быстро прокрутится вниз к нижней части страницы. Хотя вы можете настроить уровни скорости в соответствии со своими предпочтениями.
3] HandFred букмарклет
HandFred – это не расширение, это букмарклет, и он чрезвычайно прост и удобен в использовании. Все, что вам нужно сделать, это перетащить код на панель закладок, и всякий раз, когда вы хотите поместить любую веб-страницу в автопрокрутку. Просто нажмите на букмарклет, и все готово. Нажмите еще раз, если вы хотите ускорить прокрутку.
Перейдите на домашнюю страницу HandFred, чтобы получить код. Единственная загвоздка в том, что между ними невозможно остановить прокрутку. Если вы хотите остановить это, вы должны использовать кнопку F5 или Обновить страницу.
4] Расширение Auto Scroll Chrome
Это снова расширение Chrome, которое добавляет опцию автоматической прокрутки в ваш браузер. После загрузки и установки вы получите скрытую кнопку в правом верхнем углу браузера. Для использования вам просто нужно нажать CTRL + щелчок левой кнопкой мыши и немного перетащить мышь в направлении, которое вы хотите прокрутить страницу. Например, если вы хотите автоматически прокрутить страницу вверх, нажмите CTRL + щелчок левой кнопкой мыши и слегка переместите мышь вверх, инструмент начнет прокручивать страницу вверх.
Чтобы остановить прокрутку, просто нажмите в любом месте страницы, и она остановится. Кроме того, вы можете настроить параметры. Просто нажмите кнопку «Автопрокрутка» и выберите параметры. Вы можете получить его здесь.
5] Лучшее расширение для Chrome с автоматической прокруткой
Это еще одно расширение Chrome, которое помогает вам читать без помощи рук, автоматически прокручивая веб-страницу. Скачайте и добавьте это расширение и, как и любое другое расширение, этот инструмент также появится на панели инструментов вашего браузера в виде маленькой кнопки.
Чтобы использовать это расширение, просто нажмите на кнопку и выберите ваши предпочтения. Инструмент очень прост и требует технических ноу-хау. Просто выберите медленную, среднюю или быструю скорость, и инструмент начнет работать мгновенно. В инструменте также есть кнопка «Стоп», чтобы остановить прокрутку в любое время. Получи это здесь.
6] Автопрокрутка Firefox Аддон
Это дополнение называется самой автоматической прокруткой, и как только вы загрузите и добавите его в браузер Firefox, вы сможете легко прокручивать веб-страницы автоматически. Вы можете дополнительно настроить интервал прокрутки и конец периода обнаружения. Щелкните правой кнопкой мыши на кнопке «Добавить» на панели инструментов браузера, и вы сможете изменить настройки.
Вы можете получить его здесь.
7] Fox Scroller Firefox Addon
Загрузите это здесь.
Сообщите нам, если вы используете какой-либо другой инструмент или расширение для автоматической прокрутки своих веб-страниц.
Автоматизация является одним из важнейших ключей к максимизации вашей производительности. Подумайте о том, насколько кропотливой была бы повседневная работа, если бы не было таких простых сочетаний клавиш, как Ctrl + A, чтобы выделить весь текст, или Ctrl + LMB (щелчок левой кнопкой мыши), чтобы открыть ссылку на новой вкладке.
Современные браузеры хорошо справляются с основами сочетаний клавиш, такими как переход между вкладками, изменение уровня масштабирования, остановка загрузки страницы и многое другое. Тем не менее, автопрокрутка в значительной степени упускается из виду, несмотря на то, что она чрезвычайно полезна
Если у вас есть внешняя мышь и вы используете Windows, есть большая вероятность, что вы сможете щелкнуть ее средней кнопкой мыши. Щелчок средней кнопкой мыши по области веб-страницы в большинстве современных браузеров превратит курсор в разнонаправленное перекрестие. Когда вы перемещаете мышь в направлении от начальной точки этого перекрестия, страница начинает автоматически прокручиваться.
Однако знаете ли вы, что пользователям Mac и Linux вообще не предлагается эта функциональность? Некоторые веб-сайты также могут явно блокировать автоматическую прокрутку. Также возможно, что вы работаете в Windows, но у вас нет мыши с возможностью среднего щелчка, или трекпад вашего ноутбука не поддерживает щелчок тремя пальцами. В этих случаях вам не повезло — или нет?
К счастью для вас, есть несколько решений. Два лучших, которые я нашел, — это расширение, доступное для Chrome, и букмарклет, совместимый с любым современным браузером с поддержкой JavaScript и панель закладок.
Google Chrome: используйте расширение AutoScroll
Если вы используете Chrome, для этого гораздо проще использовать расширение, созданное специально для браузера. Мы обнаружили, что ни одно другое расширение Chrome не Автопрокрутка когда дело доходит до имитации функции автоматической прокрутки среднего щелчка Windows.
Чтобы установить AutoScroll, перейдите на страницу расширения и нажмите кнопку «Добавить в Chrome». По завершении вы увидите, что на панели расширений появится разнонаправленное перекрестие, которое находится справа от адресной строки.
Вам нужно будет перезапустить Chrome, чтобы расширение работало правильно. Вы можете сделать это, вручную закрыв и снова открыв браузер, или, если вы хотите сохранить вкладки, вы можете ввести «chrome: // restart» в адресную строку и нажать клавишу «Ввод».
После перезапуска Chrome щелкните правой кнопкой мыши значок расширения AutoScroll и выберите «Параметры».
Все параметры здесь не требуют пояснений, кроме тех, что указаны в базовой таблице. Эти параметры позволяют установить диапазон пикселей, в котором курсор должен оставаться в пределах для автоматической прокрутки для активации.
Единственные начальные изменения, которые мы рекомендуем сделать здесь, — это необязательное отключение одного из двух нижних параметров в основной таблице. Если вы уже используете сочетания клавиш MMB (средний щелчок) или Ctrl + LMB (щелчок левой кнопкой мыши) для других целей, вы можете отключить одно из них, чтобы предотвратить конфликты.
После этого проверьте, как работает AutoScroll, перейдя на веб-сайт с прокручиваемым контентом — я предлагаю Geek Help Desk. Нажмите MMB или Ctrl + LMB, чтобы увидеть, работает ли расширение. Затем вы должны увидеть двунаправленное перекрестие под вашим курсором. Несмотря на то, что это только визуально показывает вверх и вниз как направления, вы также можете прокручивать влево, вправо и любым способом по диагонали.
Другие браузеры: используйте автопрокрутку Bookmarklet
Если вы не используете Google Chrome или даже предпочитаете использовать букмарклет, для вас есть надежное решение. Все, что требуется, это чтобы ваш браузер поддерживал JavaScript и имел панель закладок. Это включает, но не ограничивается, Chrome, Firefox, Opera, Safari и Internet Explorer.
Автопрокрутка букмарклет был разработан Тимом Харпером в 2008 году и до сих пор работает. Чтобы использовать его, просто включите панель закладок браузера, которая обычно находится ниже адресной строки, нажмите и удерживайте большую ссылку «Автопрокрутка» на странице и перетащите ее на панель закладок.
Если вам сложно найти, где включить панель закладок, щелкните правой кнопкой мыши область адресной строки пользовательского интерфейса вашего браузера. Там вы должны увидеть опцию, чтобы включить ее, хотя в некоторых браузерах она может называться панелью избранного.
Если все сделано правильно, вы должны увидеть новую закладку на панели закладок с надписью «Автопрокрутка». Ниже показано, как это выглядит в Firefox, но оно должно выглядеть одинаково во всех современных веб-браузерах.
Этот маленький букмарклет мощный. Чтобы убедиться, что он работает в вашем текущем браузере, нажмите на любую прокручиваемую веб-страницу. Скорость по умолчанию очень низкая, но вы должны заметить, что она прокручивается вниз. Вы можете использовать следующие сочетания клавиш для управления букмарклетом Autoscroll во время прокрутки:
- 0–9 — устанавливает скорость прокрутки (чем выше, тем быстрее)
- — (минус) — уменьшает скорость прокрутки
- = (равно) — увеличивает скорость прокрутки
- Shift + — (минус) — быстро уменьшает скорость прокрутки
- Shift + = (равно) — быстро увеличивает скорость прокрутки
- Q — прекращает прокрутку
Оба эти решения должны предоставить вам все инструменты, необходимые для автоматической прокрутки во время чтения, перехода к нижней части «бесконечно» прокручиваемой веб-страницы и любых других целей, для которых вам нужна автоматическая прокрутка. Наслаждайтесь!
Прокрутка — одно из самых древних взаимодействий в вебе. Задолго до появления методов pull-to-refresh и списков бесконечной загрузки скромная полоса прокрутки решила изначальную проблему масштабирования в вебе: как взаимодействовать с контентом, который распространяется за пределы доступной области просмотра?
Сегодня прокрутка всё ещё остаётся самым фундаментальным взаимодействием в Сети, и, возможно, самым неправильно понятым. Например, вы знаете разницу между следующими сценариями?
- Пользователь прокручивает страницу двумя пальцами на тачпаде
- Пользователь прокручивает одним пальцем на тачскрине
- Пользователь прокручивает колесо мыши
- Пользователь щёлкает по полосе прокрутки и тянет её вниз и вверх
- Пользователь нажимает стрелки «вверх», «вниз», PageUp, PageDown и «пробел» на клавиатуре
Чтобы ответить на этот вопрос и понять, как реализовать наиболее плавную прокрутку для своего сайта, отступим на шаг понять и разберёмся, как браузеры разбираются с многопоточностью и вводом.
Концептуально, веб является однопоточной средой. JavaScript блокирует DOM, а DOM блокирует JavaScript, потому что оба борются за один и тот же поток, часто называемый «основным потоком» или «потоком UI».
Например, если вы добавите этот (ужасный) сниппет JavaScript на страницу, то немедленно заметите ухудшение в работе:
Пока этот JavaScript крутится в бесконечном цикле, кнопки не работают, элементы форм не реагируют и даже анимированные GIF'ки тормозят — во всех смыслах и отношениях страница зависла. Можете изучить эффект в действии в простом демо.
Более того, если вы попытаетесь прокрутить страницу клавишами «вверх» и «вниз» на клавиатуре, страница предсказуемо застрянет, пока JavaScript не прекратит выполнение. Всё это явные свидетельства нашего представления веба как однопоточной среды.
Есть забавная аномалия: если попробовать прокрутку через тачскрин, то страница отлично прокручивается вверх и вниз, хотя JavaScript и блокирует всё остальное на странице. То же самое относится к прокрутке с тачпада, колесом мыши и прокрутке после захвата страницы курсором click-and-drag (в зависимости от браузера).
Каким-то образом некоторые действия по прокрутке могут изменять состояние страницы, в то время как всё остальное — кнопки, поля ввода данных, GIF'ы — полностью зависло. Как мы можем совместить это с нашей теорией однопоточного веба?
Как выясняется, в целом тезис «браузеры однопоточные» правдив, но есть важные исключения. Прокрутка, во всём своём многообразии, является одним из таких исключений.
С годами разработчики браузеров осознали, что выгрузка вспомогательной работы в фоновые потоки может дать значительную выгоду по плавности работы и чувствительности. Прокрутка настолько важна для ключевого опыта работы с браузером, что эту задачу быстро выбрали для такой оптимизации. В наше время все основные браузерные движки (Blink, EdgeHTML, Gecko, WebKit) поддерживают прокрутку за пределами основного потока выполнения в той или иной степени (Firefox последним присоединился к клубу, с версии Firefox 46).
С фоновой прокруткой даже загромождённая страница будет плавно прокручиваться, потому что вся прокрутка выполняется в отдельном потоке. Только если вы попытаетесь взаимодействовать со страницей через некий посторонний механизм, не связанный с прокруткой — нажать клавишу, ввести данные в поле ввода, нажать на ссылку — тогда фасад сбрасывается и суть салонного трюка полностью раскрывает себя. (Учитывая, насколько хорошо он работает, это отличный трюк!)
Правда, у асинхронной прокрутки есть распространённый побочный эффект, который называют эффектом шахматной доски (checkerboarding). Он впервые проявился на в Safari для iOS в виде серых и белых клеток, словно с шахматной доски. В большинстве современных браузеров эффект проявляется как пустое пространство на экране, если вы осуществляете прокрутку быстрее, чем браузер может отрисовать страницу. Это не идеально, но это приемлемый компромисс, по сравнению с заблокированной, дёргающейся или неоткликающейся прокруткой.
К сожалению, не всегда можно легко перенести прокрутку в фоновый поток выполнения. Браузеры могут сделать это только в том случае, если операционная система допускает одновременный ввод, и это может варьироваться от устройства к устройству. В частности, ввод с клавиатуры не настолько оптимизирован, как ввод с мыши или тач-устройств, что в конечном счёте ведёт к более значительным лагам при вводе с клавиатуры во всех браузерах.
Здесь будет поучительной небольшая история. Когда впервые вышли операционные системы вроде Windows и macOS, они допускали только один поток выполнения, и мало кто предвидел необходимость предусмотреть одновременный ввод. Только когда появились многоядерные машины, операционные системы начали встраивать параллелизм в свою архитектуру.
Также как рудиментарные органы животных дают понять их эволюционную историю, однопоточное происхождение операционных систем проявляет себя, если посмотреть на способы прокрутки в вебе. Только если операционная система допускает параллельный ввод — с мыши, клавиатуры или другого устройства — браузеры могут эффективно оптимизировать прокрутку, чтобы на неё не влияло длительное выполнение JavaScript, захламившего основной поток выполнения.
Однако в группе разработки Microsoft Edge мы делаем успехи, чтобы гарантировать плавный и восприимчивый скроллинг, независимо от его метода. В EdgeHTML 14 (который вошёл в состав Windows 10 Anniversary Update) мы поддерживаем фоновую прокрутку для следующих методов:
- Один палец, тачскрин
- Два пальца, тачпад
- Колесо мыши
- Полоса прокрутки
По результатам тестирования в Windows 10 (14393, Surface Book) и macOS Sierra (10.12, MacBook Air) мы получили следующие результаты:
Два пальца тачпад | Тач | Колесо мыши | Полоса прокрутки | Клавиатура | |
---|---|---|---|---|---|
Edge 14 (Windows) | Есть | Есть | Есть | Есть | Нет |
Chrome 56 (Windows) | Есть | Есть | Есть | Нет | Нет |
Firefox 51 (Windows) | Нет | Нет | Нет | Нет | Нет |
Chrome 56 (MacOS) | Есть | N/A | Есть | Нет | Нет |
Firefox 51 (MacOS) | Есть | N/A | Есть | Нет | Нет |
Safari 10.1 (MacOS) | Есть | N/A | Есть | Нет | Нет |
Как демонстрирует* эта таблица, поведение прокрутки может драматически изменяться от браузера к браузеру, и даже от одной ОС к другой. Если вы тестируете один метод прокрутки только в одном браузере, то получите весьма неполные результаты производительности своего сайта, по сравнению с тем, как в реальности с ним работают пользователи!
В целом должно быть ясно, что у прокрутки особенное место в вебе и браузеры очень много работают, чтобы сделать её быстрой и восприимчивой. Однако, есть тонкие способы, как веб-разработчик может непреднамеренно отключить встроенные в браузер оптимизации. Посмотрим на то, как веб-разработчики могут влиять на прокрутку в браузере, по-хорошему и по-плохому.
Фоновая прокрутка даёт ощутимую прибавку в эффективности — прокрутка и JavaScript полностью разделены, позволяя им работать параллельно без помех друг другу.
Но каждый, кто немного разрабатывал веб-страницы, знает, как установить связь между JavaScript и прокруткой:
Когда мы добавляем прослушивающий процесс wheel, который вызывает event.preventDefault() , то он на 100% блокирует прокрутку, как для колеса мыши, так и для тачпада. И очевидно, если прокрутка заблокирована, то фоновая прокрутка тоже заблокирована.
Менее очевидно влияние такого примера:
Вы можете наивно подумать, что если функция не вызывает preventDefault() , то она вообще не может блокировать прокрутку или, в худшем случае, блокирует её только на время выполнения самой функции. Однако правда в том, что даже пустой прослушивающий процесс полностью блокирует прокрутку, пока не закончены все процессы JavaScript на этой странице, что вы можете проверить в этом демо.
Прослушивание колеса мыши не взаимодействует с нашей большой блокирующей операцией JavaScript, но у них общий цикл событий, так что фоновый поток выполнения должен ждать, пока закончится более длительная операция JavaScript, прежде чем получит ответ от функции прослушивания событий.
Почему он должен ждать? Ну, JavaScript — это динамический язык программирования, и браузер не может знать наверняка, что preventDefault() никогда не вызовут. Даже если для разработчика очевидно, что функция делает просто запись console.log() , разработчики браузеров предпочитают не оставлять шансов. На самом деле, даже пустая function() <> вызовет тот же эффект.
Обратите внимание, что это относится не только к колесу мыши: на тач-устройствах прокрутка тоже может быть заблокирована прослушивающими процессами touchstart или touchmove.
Нужно быть осторожным, добавляя прослушивающие события на страницу, потому что они влияют на производительность!
Есть несколько интерфейсов JavaScript API, связанных с прокруткой, однако они не блокируют прокрутку. Событие scroll, хотя это в чём-то нелогично, не может блокировать прокрутку, потому что оно запускается после прокрутки, и поэтому является неотменяемым. Также и новый Pointer Events API, представленный в IE и Microsoft Edge, и который недавно начали внедрять в Chrome и Firefox, изначально спроектирован с целью избежать неумышленного блокирования прокрутки.
Даже в тех случаях, когда нам действительно нужно прослушивать события wheel или touchstart, есть определённые хитрости, как веб-разработчики могут гарантировать работу прокрутки с максимальным качеством. Посмотрим на некоторые из этих хитростей.
В предыдущем примере мы видели случай глобального прослушивающего процесса (то есть прикреплённого к window или document). Но что насчёт прослушивающих процессов для индивидуальных элементов прокрутки?
Другими словами, представьте страницу, для которой работает прокрутка, но на странице есть отдельная область с собственной независимой прокруткой. Блокирует ли браузер прокрутку для всей страницы, если вы добавите прослушивающий процесс только в этой области?
Если вы проверите на простой демонстрационной странице, то заметите, что Microsoft Edge и Safari оставят плавную прокрутку для целого документа, если прослушивающий процесс для прокрутки находится в div с независимой прокруткой.
Вот таблица браузеров и их поведения:
Два пальца тачпад | Тач | Колесо мыши | Click-and-drag | Клавиатура | |
---|---|---|---|---|---|
Десктопный Edge 14 (Windows) | Есть | Есть | Есть | Есть | Нет |
Десктопный Chrome 56 (Windows) | Нет | Есть | Нет | Нет | Нет |
Десктопный Firefox 51 (Windows) | Нет | Нет | Нет | Нет | Нет |
Десктопный Chrome 56 (MacOS) | Нет | N/A | Нет | Нет | Нет |
Десктопный Firefox 51 (MacOS) | Есть | N/A | Есть | Нет | Нет |
Safari 10.1 (MacOS) | Есть | N/A | Есть | Нет | Нет |
Результаты показывают*, что для веб-разработчиков есть доступные оптимизации, чтобы получить пользу от этих функций браузеров. Вместо использования прослушивающих процессов wheel/touch для всего документа, предпочтительно добавить прослушивающие процессы в конкретный подраздел документа, так что прокрутка останется плавной для всех остальных частей страницы. Другими словами, вместо делегирования прослушивающих процессов wheel/touchstart на максимально высокий уровень, лучше всего изолировать их для элемента, где это нужно.
К сожалению, не все фреймворки JavaScript допускают такую практику — в частности, React, как правило, добавляет глобальный прослушивающий процесс ко всему документу даже если тот должен относиться только к части страницы. Однако есть открытый тикет конкретно для этой проблемы, и парни из React сказали, что с радостью примут пулл-реквест. (Уважение парням из React, которые так быстро среагировали на наше предложение)
Уход от глобальных прослушивающих процессов wheel/touchstart — это хорошая практика, но иногда такое просто невозможно, в зависимости от эффекта, которого вы пытаетесь добиться. И в некоторым роде выглядит глупо, что простое прослушивание событий заставляет браузер остановить весь мир, просто потому что существует гипотетическая вероятность вызова PreventDefault() , и он его ждёт.
К счастью, в браузерах начала появляться новая функция, когда веб-разработчики могут явно пометить прослушивающий процесс как «пассивный» и поэтому избежать ожидания:
С таким подходом браузер будет обрабатывать прокрутку так, как будто прослушивающий процесс wheel вообще отсутствует. Эта функция уже доступна в последних версиях Chrome, Firefox и Safari, и должна скоро появиться в будущем релизе Microsoft Edge. (Обратите внимание, что нужно применять feature detection для поддержки браузеров, которые не распознают пассивные прослушивающие процессы).
Для некоторых событий (в том числе touchstart и touchmove) Chrome с версии 56 принял решение вмешиваться и сделал их пассивными по умолчанию. Имейте в виду эту незначительную разницу между браузерами, когда добавляете прослушивающие процессы!
Как мы видели, прокрутка в вебе — фантастически сложный процесс, и все браузеры находятся на разных этапах улучшения своей производительности. Но в целом мы можем сформулировать некоторые чёткие советы для веб-разработчиков.
Во-первых, лучше не добавлять прослушивающие процессы wheel или touch к глобальным объектам document или window, а вместо этого добавлять их к меньшим элементам с индивидуальной прокруткой. Разработчикам также следует использовать пассивные прослушивающие процессы, где только возможно, с применением feature detection, чтобы избежать проблем совместимости. Использование Pointer Events (там есть polyfill) и прослушивающих событий scroll — тоже верный способ избежать непреднамеренной блокировки прокрутки.
Надеюсь, эта статья предоставила некоторые полезные советы для веб-разработчиков и позволила мельком взглянуть на то, что у браузеров под капотом. Без сомнений, по мере развития браузеров и роста веба, механика прокрутки станет даже более сложной и изощрённой.
Наша группа Microsoft Edge продолжит инновации в данной области, чтобы обеспечить плавную прокрутку для большего количества сайтов и пользователей. Скажем это для скромного скроллбара — самого старого и неоднозначного взаимодействия в вебе!
* Результаты получены на последней версии каждого браузера в феврале 2017 года. С тех пор Firefox 52 обновил поддержку прокрутки, и теперь соответствует поведению Edge 14 во всех тестах, за исключением скроллинга полосой прокрутки. Надеемся, остальные браузеры тоже сделают улучшения в реализации прокрутки и сделают веб быстрее и более восприимчивым!
Читайте также: