Spec-Zone.ru › Vue Router 4

Поведение прокрутки

Посмотреть бесплатный урок на Vue School

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

Примечание: эта функция работает только, если браузер поддерживает history.pushState.

При создании экземпляра маршрутизатора вы можете предоставить функцию scrollBehavior:

const router = createRouter({
  history: createWebHashHistory(),
  routes: [...],
  scrollBehavior (to, from, savedPosition) {
    // return desired position
  }
})

Функция scrollBehavior получает объекты маршрута to и from, как и навигационные защитники. Третий аргумент, savedPosition, доступен только, если это навигация popstate (вызванная кнопками "Назад" / "Вперед" браузера).

Функция может возвращать объект позиции ScrollToOptions:

const router = createRouter({
  scrollBehavior(to, from, savedPosition) {
    // always scroll to top
    return { top: 0 }
  },
})

Вы также можете передать CSS-селектор или DOM-элемент через el. В этом случае top и left будут обрабатываться как смещения относительно этого элемента.

const router = createRouter({
  scrollBehavior(to, from, savedPosition) {
    // always scroll 10px above the element #main
    return {
      // could also be
      // el: document.getElementById('main'),
      el: '#main',
      top: -10,
    }
  },
})

Если возвращается ложное значение или пустой объект, прокрутка не произойдёт.

Возврат savedPosition приведет к поведению, аналогичному поведению браузера при навигации с помощью кнопок "Назад" / "Вперед":

const router = createRouter({
  scrollBehavior(to, from, savedPosition) {
    if (savedPosition) {
      return savedPosition
    } else {
      return { top: 0 }
    }
  },
})

Если требуется имитация поведения "прокрутка к якорю":

const router = createRouter({
  scrollBehavior(to, from, savedPosition) {
    if (to.hash) {
      return {
        el: to.hash,
      }
    }
  },
})

Если ваш браузер поддерживает поведение прокрутки, вы можете сделать её плавной:

const router = createRouter({
  scrollBehavior(to, from, savedPosition) {
    if (to.hash) {
      return {
        el: to.hash,
        behavior: 'smooth',
      }
    }
  }
})

Задержка прокрутки

Иногда требуется подождать некоторое время перед прокруткой страницы. Например, при работе с переходами нужно подождать завершения перехода перед прокруткой. Для этого можно вернуть Promise, который возвращает желаемый описатель позиции. Вот пример, где мы ждем 500 мс перед прокруткой:

const router = createRouter({
  scrollBehavior(to, from, savedPosition) {
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve({ left: 0, top: 0 })
      }, 500)
    })
  },
})

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

Предложить изменения на этой странице
Переходы
Ленивая загрузка маршрутов

© 2013–present Evan You
Licensed under the MIT License.
https://next.router.vuejs.org/guide/advanced/scroll-behavior

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API