Blog. Just Blog

Прокрутка страницы к определенному элементу

Версия для печати Добавить в Избранное Отправить на E-Mail | Категория: Web-мастеру и не только | Автор: ManHunter
Прокрутка страницы к определенному элементу
Прокрутка страницы к определенному элементу

Функция плавной прокрутки страницы до определенного элемента в настоящее время одна из обязательных составляющих web-приложений и сайтов. Для ее реализации в современных браузерах есть специальный метод scrollIntoView(). С его помощью можно автоматически прокрутить страницу таким образом, чтобы нужный элемент попал в область видимости.

В параметрах опционально задается область элемента, которая обязательно должна присутствовать на экране - его верх или низ, а также стиль прокрутки. По умолчанию это просто быстрый переход, но предусмотрена и плавная прокрутка. В виде функции это можно изобразить следующим образом:
  1. function scroll_to (element_idblock_type) {
  2.     var target=document.getElementById(element_id);
  3.     if (target) {
  4.         target.scrollIntoView({
  5.             behavior"smooth",
  6.             blockblock_type
  7.         });
  8.     }
  9. }
В параметрах передается ID элемента, до которого надо прокрутить страницу, а также граница его видимости. Метод универсальный, с очень хорошей поддержкой браузерами, в том числе и старыми. В новых браузерах просто добавили поддержку всяких наворотов.

Для достижения однообразия с плавной прокруткой можно также воспользоваться собственной функцией. В ее основе лежит анимация, вызываемая через метод requestAnimationFrame. Эта функция обеспечивает плавную прокрутку, но только до верхней границы элемента, хотя в подавляющем большинстве случаев этого достаточно. Соответственно, единственным параметром для ее вызова будет ID элемента.
  1. function smooth_scroll_to (element_id) {
  2.     var target=document.getElementById(element_id);
  3.     if (!target) {
  4.         return;
  5.     }
  6.     var container=target;
  7.     var scroll_y=0;
  8.  
  9.     do {
  10.         if (!(container=container.parentNode)) {
  11.             return;
  12.         }
  13.         container.scrollTop+=1;
  14.     }
  15.     while (container.scrollTop==0);
  16.  
  17.     if (target!=container) {
  18.         do {
  19.             scroll_y+=target.offsetTop;
  20.         }
  21.         while (target=target.offsetParent);
  22.     }
  23.  
  24.     var step=Math.max(
  25.         15,
  26.         (scroll_y-container.scrollTop)/10
  27.     );
  28.  
  29.     var chk=0;
  30.  
  31.     function single_step() {
  32.         var old_y=container.scrollTop;
  33.  
  34.         container.scrollTop=Math.min(
  35.             scroll_y,
  36.             step+container.scrollTop
  37.         );
  38.  
  39.         if (container.scrollTop>=scroll_y) {
  40.             return;
  41.         }
  42.  
  43.         if (container.scrollTop==old_y) {
  44.             chk++;
  45.             if (chk>10) {
  46.                 return;
  47.             }
  48.         }
  49.         else {
  50.             chk=0;
  51.         }
  52.  
  53.         window.requestAnimationFrame(single_step);
  54.     };
  55.  
  56.     window.requestAnimationFrame(single_step);
  57. }
Вызывать обе функции можно по клику на определенные контролы интерфейса, по событиям типа листания страницы, после динамической подгрузки данных и т.п., все зависит от решаемой задачи.

Рабочий пример прокрутки страницы с использованием приведенных выше функций можно посмотреть на демонстрационной странице.

Поделиться ссылкой ВКонтакте
Просмотров: 38 | Комментариев: 0

Метки: JavaScript

Комментарии

Отзывы посетителей сайта о статье
Комментариeв нет

Добавить комментарий

Заполните форму для добавления комментария
Имя*:
Текст комментария (не более 2000 символов)*:

*Все поля обязательны для заполнения.
Комментарии, содержащие рекламу, ненормативную лексику, оскорбления и т.п., а также флуд и сообщения не по теме, будут удаляться. Нарушителям может быть заблокирован доступ к сайту.
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2024
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.0023 сек.) / Память: 4.5 Mb
Наверх