Как создать растущий-уменьшающийся заголовок в React

RedDeveloper
08.03.2023 12:29

Привет, мир!

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

Шаги для достижения цели

  1. Прислушивайтесь к прокрутке страницы.
  2. Когда страница прокручивается до определенного места, сжимайте заголовок.
  3. При прокрутке обратно к вершине верните заголовок в нормальное положение.
  4. Добавьте несколько переходов, чтобы сделать рост/уменьшение плавным

Реализация

Прослушивание прокрутки страницы

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

useEffect(() => {
    // Adding the scroll listener
    window.addEventListener('scroll', handleScroll, { passive: true });

    return () => {
        // Removing listener
        window.removeEventListener('scroll', handleScroll);
    };
}, []);

Passive используется для обозначения того, что событие является пассивным, и обработчик не будет вызывать preventDefault для отключения прокрутки.

Реализация обработчика

Чтобы узнать, прокручивается страница или нет, мы можем использовать флаг isScrolled . Флаг isScrolled должен быть установлен в true, когда экран прокручивается за определенную точку (например, 250) и в false, когда прокрутка возвращается к вершине (когда позиция прокрутки меньше 250). Мы можем отслеживать позицию прокрутки с помощью window.pageYOffset .

Таким образом, функция-обработчик будет выглядеть следующим образом:

// Flag, which stores whether the screen is scrolled
const [isScrolled, setScrolled] = useState(false);

// Handler when page is scrolled
const handleScroll = () => {
  if (window.pageYOffset > 250) {
    setScrolled(true)
  } else {
    setScrolled(false)
  }
}

Реализация компонента

Теперь мы можем определить, прокручивается страница или нет, используя флаг isScrolled. Теперь мы можем реализовать разметку компонента заголовка следующим образом:

return (
    <div className = {`header-container ${isScrolled && 'header-scrolled'}`}>
      <h1>SR</h1>
      <h2>Sriram</h2>
    </div>
  );

Здесь мы внедряем класс header-scrolled, когда экран прокручивается. То есть когда флаг isScrolled равен true.

Давайте посмотрим на стилизацию компонента:

.header-container {
  display: flex;
  align-items: center;
  background: $header-color;
  box-shadow: rgba(0, 0, 0, 0.2) 0px 12px 28px 0px, rgba(0, 0, 0, 0.1) 0px 2px 4px 0px, rgba(255, 255, 255, 0.05) 0px 0px 0px 1px inset;
  height: 7rem;
}
.header-scrolled {
  height: 3rem;
}

Здесь в классе header-container высота установлена на 7rem . Когда страница прокручивается и вводится класс header-scrolled, высота будет заменена на 3rem , что приведет к уменьшению заголовка по вертикали.

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

.header-container {
  display: flex;
  align-items: center;
  background: $header-color;
  box-shadow: rgba(0, 0, 0, 0.2) 0px 12px 28px 0px, rgba(0, 0, 0, 0.1) 0px 2px 4px 0px, rgba(255, 255, 255, 0.05) 0px 0px 0px 1px inset;
  height: 7rem;
  // To make the grow/shrink smooth.
  transition: height 2s;
}

Вот и все, мы закончили! Теперь при прокрутке экрана заголовок будет плавно увеличиваться и уменьшаться.

Окончательный код будет выглядеть так:

import React, { useEffect, useState } from "react";
import "./header.scss";

export default function Header() {
  const [isScrolled, setScrolled] = useState(false);
  useEffect(() => {
    window.addEventListener('scroll', handleScroll, { passive: true });

    return () => {
        window.removeEventListener('scroll', handleScroll);
    };
}, []);
const handleScroll = () => {
  if (window.pageYOffset > 250) {
    setScrolled(true)
  } else {
    setScrolled(false)
  }
}
  return (
    <div className = {`header-container ${isScrolled && 'header-scrolled'}`}>
      <h1>SR</h1>
      <h2>Sriram</h2>
    </div>
  );
}

Надеюсь, это было полезно для вас. С нетерпением ждем ваших отзывов, спасибо!

Originally published at https://sriram23.hashnode.dev.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?

20.08.2023 18:21

Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в 2023-2024 годах? Или это полная лажа?".

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией

20.08.2023 17:46

В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.

Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox

19.08.2023 18:39

Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в частности, магию поплавков и гибкость flexbox.

Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest

19.08.2023 17:22

В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для чтения благодаря своей простоте. Кроме того, мы всегда хотим проверить самые последние возможности в наших проектах!

Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️

18.08.2023 20:33

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

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL

14.08.2023 14:49

Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип предназначен для представления неделимого значения.