Как прокрутить представление в React

В этой статье мы рассмотрим 2 различных способа прокрутки представления в React.

Настройка проекта

Сначала создайте проект react, выполнив следующую команду:

npx create-react-app react-scroll-into-view
Войти в полноэкранный режим Выйти из полноэкранного режима

Прокрутка с использованием чистого HTML и CSS

Обновите index.css со следующими стилями:

body {
  max-width: 900px;
  margin: 10px auto;
}

.App {
  display: flex;
  justify-content: center;
  flex-direction: column;
}
.section {
  height: 100vh;
}

header {
  display: flex;
  justify-content: center;
}

ul {
  margin: 0;
  padding: 0;
  list-style-type: none;
  display: flex;
  position: fixed;
  top: 0;
  background-color: white;
}
li a {
  padding: 1rem;
  text-decoration: none;
}
Войти в полноэкранный режим Выйти из полноэкранного режима

Теперь обновите App.js со следующим кодом:

function App() {
  return (
    <div className="App">
      <header>
        <ul>
          <li>
            <a href="#home">Home</a>
          </li>
          <li>
            <a href="#products">Products</a>
          </li>
          <li>
            <a href="#services">Services</a>
          </li>
          <li>
            <a href="#about-us">About Us</a>
          </li>
        </ul>
      </header>
      <div className="section" id="home">
        <h2>Home</h2>
        <p>
          Lorem ipsum dolor, sit amet consectetur adipisicing elit. Harum, unde!
          Nisi officia, placeat, enim quibusdam nostrum similique atque
          accusantium natus sit molestias minima voluptates eos doloribus illum
          ullam, pariatur fugiat? Minima minus aspernatur, quos, explicabo sed
          asperiores, enim officia qui voluptates magnam vero aliquid corrupti?
          Aliquid, est! Expedita tempore impedit fuga eligendi veritatis
          molestiae ipsa nulla! Est aspernatur eius corrupti.
        </p>
      </div>
      <div className="section" id="products">
        <h2>Products</h2>
        <p>
          Lorem ipsum dolor, sit amet consectetur adipisicing elit. Harum, unde!
          Nisi officia, placeat, enim quibusdam nostrum similique atque
          accusantium natus sit molestias minima voluptates eos doloribus illum
          ullam, pariatur fugiat? Minima minus aspernatur, quos, explicabo sed
          asperiores, enim officia qui voluptates magnam vero aliquid corrupti?
          Aliquid, est! Expedita tempore impedit fuga eligendi veritatis
          molestiae ipsa nulla! Est aspernatur eius corrupti.
        </p>
      </div>
      <div className="section" id="services">
        <h2>Services</h2>
        <p>
          Lorem ipsum dolor, sit amet consectetur adipisicing elit. Harum, unde!
          Nisi officia, placeat, enim quibusdam nostrum similique atque
          accusantium natus sit molestias minima voluptates eos doloribus illum
          ullam, pariatur fugiat? Minima minus aspernatur, quos, explicabo sed
          asperiores, enim officia qui voluptates magnam vero aliquid corrupti?
          Aliquid, est! Expedita tempore impedit fuga eligendi veritatis
          molestiae ipsa nulla! Est aspernatur eius corrupti.
        </p>
      </div>
      <div className="section" id="about-us">
        <h2>About Us</h2>
        <p>
          Lorem ipsum dolor, sit amet consectetur adipisicing elit. Harum, unde!
          Nisi officia, placeat, enim quibusdam nostrum similique atque
          accusantium natus sit molestias minima voluptates eos doloribus illum
          ullam, pariatur fugiat? Minima minus aspernatur, quos, explicabo sed
          asperiores, enim officia qui voluptates magnam vero aliquid corrupti?
          Aliquid, est! Expedita tempore impedit fuga eligendi veritatis
          molestiae ipsa nulla! Est aspernatur eius corrupti.
        </p>
      </div>
    </div>
  )
}

export default App
Войти в полноэкранный режим Выйти из полноэкранного режима

Как вы можете видеть в коде, у нас есть заголовок со ссылками на 4 различных раздела. Мы задали id каждого раздела в качестве значения атрибута href (например: <a href="#products">Products</a>). Мы также добавили высоту 100vh к разделам, чтобы они занимали всю высоту экрана и прокрутка была видна правильно.

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

html {
  scroll-behavior: smooth;
}
Вход в полноэкранный режим Выход из полноэкранного режима

Теперь, если вы запустите приложение, вы сможете увидеть плавную прокрутку. Вы также можете протестировать приложение здесь.

Плавная прокрутка пока не поддерживается в Safari. Подробности о поддержке браузера вы можете узнать здесь.

Прокрутка с помощью хука useRef

Если вы не хотите указывать идентификаторы и хотите использовать ссылку, вы можете сделать это с помощью следующего кода:

import React, { useRef } from "react"

const App = () => {
  const paraRef = useRef(null)
  const clickHandler = () => {
    paraRef.current &&
      paraRef.current.scrollIntoView({ behavior: "smooth", block: "start" })
  }
  return (
    <div>
      <button onClick={clickHandler}>Scroll to Next para</button>
      <p className="section">
        Lorem ipsum dolor sit, amet consectetur adipisicing elit. Unde eum
        repudiandae ut tempore laudantium, provident labore doloremque sit
        magnam, minima temporibus explicabo voluptatibus cupiditate a culpa
        reprehenderit magni, qui aspernatur! Laborum a iure doloribus, officia
        earum asperiores ut, hic voluptates libero sed consequuntur facere
        itaque natus quisquam! Numquam explicabo sint saepe porro, qui quibusdam
        nam eum minima quasi temporibus. Non?
      </p>
      <p className="section" ref={paraRef}>
        Lorem ipsum dolor sit, amet consectetur adipisicing elit. Unde eum
        repudiandae ut tempore laudantium, provident labore doloremque sit
        magnam, minima temporibus explicabo voluptatibus cupiditate a culpa
        reprehenderit magni, qui aspernatur! Laborum a iure doloribus, officia
        earum asperiores ut, hic voluptates libero sed consequuntur facere
        itaque natus quisquam! Numquam explicabo sint saepe porro, qui quibusdam
        nam eum minima quasi temporibus. Non?
      </p>
      <p className="section">
        Lorem ipsum dolor sit, amet consectetur adipisicing elit. Unde eum
        repudiandae ut tempore laudantium, provident labore doloremque sit
        magnam, minima temporibus explicabo voluptatibus cupiditate a culpa
        reprehenderit magni, qui aspernatur! Laborum a iure doloribus, officia
        earum asperiores ut, hic voluptates libero sed consequuntur facere
        itaque natus quisquam! Numquam explicabo sint saepe porro, qui quibusdam
        nam eum minima quasi temporibus. Non?
      </p>
    </div>
  )
}

export default App
Вход в полноэкранный режим Выйти из полноэкранного режима

Здесь мы использовали хук useRef для создания ссылки на раздел, к которому мы хотим прокрутить страницу. При нажатии на кнопку мы вызываем метод scrollIntoView этой ссылки.

В параметре block можно указать ‘end’ для прокрутки в конец раздела и ‘center’ для прокрутки в центр раздела.

Рабочую демонстрацию можно посмотреть здесь.

Оцените статью
devanswers.ru
Добавить комментарий