React - скользящее вниз меню показывает пункты меню при наведении курсора

Я пытаюсь добавить раскрывающееся меню, которое медленно раскрывает элементы меню. Я использую CSSTransition от react-transition-group. У меня есть синий фон, который медленно скользит вниз, как я хочу. Но текстовые элементы появляются сразу же. Вот мой код и ящик, показывающий проблему: https://codesandbox.io/s/compassionate-dawn-zbmt5

Компонент My Navbar:

import { Link } from "react-router-dom";
import React, { useState } from "react";
import { CSSTransition } from "react-transition-group";

const Navbar = () => {
  const [showSchedDropdown, setShowSchedDropdown] = useState(false);

  return (
    <ul className = {"nav"}>
      <li
        className = {"nav-item dropdown"}
        onMouseEnter = {() => setShowSchedDropdown(true)}
        onMouseLeave = {() => setShowSchedDropdown(false)}
      >
        <button
          className = {"nav-link dropdown-toggle"}
          aria-haspopup = {"true"}
          aria-expanded = {"false"}
          onClick = {() => setShowSchedDropdown(true)}
        >
          Dropdown Menu
        </button>
        <CSSTransition
          in = {showSchedDropdown}
          timeout = {1300}
          classNames = {"hidden-menu"}
        >
          <div className = {"dropdown-menu"}>
            {showSchedDropdown && (
              <>
                <Link
                  className = {"dropdown-item"}
                  to = {"/baglines"}
                  onClick = {() => setShowSchedDropdown(false)}
                >
                  Menu Item 1
                </Link>
                <Link
                  className = {"dropdown-item"}
                  to = {"/totelines"}
                  onClick = {() => setShowSchedDropdown(false)}
                >
                  Menu Item 2
                </Link>
                <Link
                  className = {"dropdown-item"}
                  to = {"/otherlines"}
                  onClick = {() => setShowSchedDropdown(false)}
                >
                  Menu Item 3
                </Link>
              </>
            )}
          </div>
        </CSSTransition>
      </li>
    </ul>
  );
};

export default Navbar;

И CSS:

.dropdown-menu {
  display: block;
  margin-top: 0;
  padding-top: 0;
  color: #ffffff;
  background-color: rgba(#265077, 1);
  font-size: 0.9rem;
  border: none;
  transition: height 1.3s ease;

  &.hidden-menu-enter,
  &.hidden-menu-exit-done {
    height: 0;
    transition: height 1.3s ease;
  }

  &.hidden-menu-enter-active {
    height: 100px;
    transition: height 1.3s ease;
  }

  &.hidden-menu-enter-done {
    height: 100px;
  }

  &.hidden-menu-leave {
    height: 0;
    transition: height 1.3s ease;
  }

  &.hidden-menu-leave-active {
    height: 100px;
    transition: height 1.3s ease;
  }
}

1. Ваше дочернее меню воссоздается каждый раз при наведении / наведении. 2. После того, как вы отсортировали точку 1, установите overflow: hidden для элемента .dropdown-menu.

Mr T 01.04.2021 18:28

Не могли бы вы дать мне немного больше информации? Откуда вы знаете, что он воссоздается? Почему это плохо?

dmikester1 01.04.2021 18:30

Это связано с тем, что состояние обновляется каждый раз при входе / выходе мыши, и эта строка {showSchedDropdown && ( препятствует отображению вашего дочернего меню. Плохая вещь в вашем случае заключается в том, что при входе в меню нечего анимировать, следовательно, ваше дочернее меню не анимировано.

Mr T 01.04.2021 18:38

ОК, разобрался с вашими комментариями! Удален условный код showSchedDropdown и он всегда на странице с высотой 0. Новый класс меняет высоту, и это прекрасно работает! Вы можете добавить ответ, если хотите, и я приму.

dmikester1 01.04.2021 20:26
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
0
4
30
0

Другие вопросы по теме