Пока я пытаюсь добавить ссылку на свою страницу «О нас» в NAVBAR, а затем добавляю, что в app.jsx домашняя страница смешивается с ней, и почему-то это немного беспорядочно

Когда я пытаюсь добавить ссылку на страницу «О нас» на панель навигации и включить ее в app.jsx, домашняя страница в конечном итоге становится запутанной и немного беспорядочной. В частности, когда я не добавляю ссылки на панель навигации, все работает отлично. Однако когда я пытаюсь включить, например, ссылку «О нас» в раздел «Главная» панели навигации, я сталкиваюсь с проблемой, когда стили страницы «О нас» совпадают со стилями домашней страницы.

NAVBAR Изображение, пожалуйста, обратитесь к этому изображению для справки.

Изображение главной страницы Посмотрите на это изображение Это сайт, который я хочу, когда добавляю страницу «О нас» на панель навигации.

но когда я добавляю или маршрутизирую страницу о нас в App.jsx, моя домашняя страница искажается вот так

Искаженное изображение главной страницы Вот как выглядит iamge, когда я добавляю раздел «О нас» в маршрут.

Вот код для обоих

Навбар.jsx

import React, { useEffect, useState } from 'react';
import './Navbar.css'; // Import the CSS file
import gsap from 'gsap'; // Make sure gsap is installed and imported
import { Link, useLocation } from 'react-router-dom';

const Navbar = () => {
  const location = useLocation();
  const [menu, setMenu] = useState(location.pathname);

  useEffect(() => {
    const nav = document.querySelector('nav');

    const handleMouseEnter = () => {
      let tl = gsap.timeline();
      
      tl.to("#nav-bottom", {
        height: "21vh",
        duration: 0.5
      })
      .to(".nav-part2 h5", {
        display: "block",
        duration: 0.1
      })
      .to(".nav-part2 h5 span", {
        y: 0,
        stagger: {
          amount: 0.5
        }
      });
    };

    const handleMouseLeave = () => {
      let tl = gsap.timeline();
      
      tl.to(".nav-part2 h5 span", {
        y: 25,
        stagger: {
          amount: 0.2
        }
      })
      .to(".nav-part2 h5", {
        display: "none",
        duration: 0.1
      })
      .to("#nav-bottom", {
        height: 0,
        duration: 0.2
      });
    };

    nav.addEventListener('mouseenter', handleMouseEnter);
    nav.addEventListener('mouseleave', handleMouseLeave);

    return () => {
      nav.removeEventListener('mouseenter', handleMouseEnter);
      nav.removeEventListener('mouseleave', handleMouseLeave);
    };
  }, []);

  useEffect(() => {
    setMenu(location.pathname);
  }, [location]);

  return (
    <nav>
      <h1><span className = "color3">CRAVE</span>Cart.</h1>
      <div className = "nav-part2">
        <div className = "nav-elem">
          <h4>Our Story</h4>
          <h5><span>Our Story</span></h5>
        </div>
        <div className = "nav-elem">
          <h4><Link to = "/" className = {menu === '/' ? 'active' : ''} onClick = {() => setMenu('/')}>Home</Link></h4>
          <h5><span><Link to = "/about" className = {menu === '/about' ? 'active' : ''} onClick = {() => setMenu('/about')}>About Us</Link></span></h5>
          <h5><span>How It Works</span></h5>
          <h5><span>Blog</span></h5>
        </div>
        <div className = "nav-elem">
          <h4>Mess</h4>
          <h5><span>Daily Specials</span></h5>
          <h5><span>Weekly Menu</span></h5>
          <h5><span>Meal Plans</span></h5>
          <h5><span>Student Discounts</span></h5>
        </div>
        <div className = "nav-elem">
          <h4>Track Order</h4>
          <h5><span>Order Status</span></h5>
          <h5><span>Delivery Timeline</span></h5>
          <h5><span>Recent Orders</span></h5>
          <h5><span>Track with Map</span></h5>
        </div>
        <div className = "nav-elem">
          <h4>Contact Us</h4>
          <h5><span>Customer Service</span></h5>
          <h5><span>Feedback</span></h5>
          <h5><span>FAQs</span></h5>
        </div>
        <div className = "nav-elem">
          <h4>About Agency</h4>
          <h5><span>Our Team</span></h5>
        </div>
      </div>
        
      <button>
        Login
        <svg fill = "none" viewBox = "0 0 20 20">
          <path fill = "#fff" d = "M2.5 14.375V17.5h3.125l9.217-9.217-3.125-3.125L2.5 14.375Zm14.758-8.508a.83.83 0 0 0 0-1.175l-1.95-1.95a.83.83 0 0 0-1.175 0l-1.525 1.525 3.125 3.125 1.525-1.525Z"></path>
        </svg>
      </button>
      <div id = "nav-bottom"></div>
    </nav>
  );
};

export default Navbar;

Приложение.jsx

import React from 'react';
import Navbar from './components/Navbar/Navbar';
import Home from './pages/Home/Home';
import { Routes, Route } from 'react-router-dom';


function App() {
  return (
    <div className = "App">
      <Navbar />
      <Routes>
        <Route path='/home' element = {<Home />} />
        <Route path='/' element = {<Home />} /> {/* Optional: Route for the home page */}
        
      </Routes>
    </div>
  );
}

export default App;

когда я добавляю параметр «Маршрут» на свою страницу «О нас», он перекрывается на главной странице.

Код AboutUs.jsx

import React, { useEffect } from 'react';
import LocomotiveScroll from 'locomotive-scroll'; // Import Locomotive Scroll
import gsap from 'gsap'; // Import GSAP
import './AboutUs.css'; // Make sure your CSS file path is correct

const AboutUs = () => {
  useEffect(() => {
    // Initialize Locomotive Scroll
    const scroll = new LocomotiveScroll({
      el: document.querySelector('#main'),
      smooth: true,
    });

    // GSAP Animation Timeline
    const tl = gsap.timeline();

    tl.to('#page1', {
      y: '100vh',
      scale: 0.6,
      duration: 0,
    })
      .to('#page1', {
        y: '30vh',
        duration: 1,
        delay: 1,
      })
      .to('#page1', {
        y: '0vh',
        rotate: 360,
        scale: 1,
        duration: 0.7,
      });

    // Clean up Locomotive Scroll on component unmount
    return () => {
      scroll.destroy();
    };
  }, []);

  useEffect(() => {
    // Scrolling text animation for page5
    const container = document.getElementById('page5');
    const scrollingText = container.querySelector('.scrolling-text');
    const containerWidth = container.offsetWidth;
    const textWidth = scrollingText.scrollWidth;

    const animate = () => {
      let startPos = containerWidth;

      const step = () => {
        startPos -= 1; // Adjust the value to control the speed
        if (startPos <= -textWidth) {
          startPos = containerWidth;
        }
        scrollingText.style.transform = `translateX(${startPos}px)`;
        requestAnimationFrame(step);
      };
      step();
    };

    animate();
  }, []);

  return (
    <div id = "main">
      <div id = "page1">
        <div id = "nav">
          <h5>CarveCart</h5>
          <h2>About Us</h2>
          <i className = "ri-menu-3-line"></i>
        </div>
        <div id = "elems">
          <div id = "elem1">
            <div id = "image-div">
              <img
                src = "https://t3.ftcdn.net/jpg/02/52/38/80/360_F_252388016_KjPnB9vglSCuUJAumCDNbmMzGdzPAucK.jpg"
                alt = "CarveCart"
              />
            </div>
            <h4>
              CARVECART <span>NEW</span>
            </h4>
            <p>
              CarveCart is an innovative food delivery platform, built on the
              powerful MERN stack. Our app streamlines the process of ordering
              from a wide selection of restaurants, with a focus on providing a
              seamless user experience for food lovers everywhere.
            </p>
          </div>
          <div id = "elem2">
            <h2>OUR TEAM</h2>
            <h3>
              Arya Joshi & Ananya Chitale
              <br />
              talented developers —
              <br />
              behind CarveCart.
            </h3>
            <h6>Tip! Drag sideways to navigate</h6>
          </div>
          <div id = "elem3">
            <div id = "image-div">
              <img
                src = "https://www.asokart.com/wp-content/uploads/2019/01/6-Nataraja-600x805.jpg"
                alt = "Visionaries"
              />
            </div>
            <h4>
              The visionaries behind CarveCart <span>NEW</span>
            </h4>
            <p>
              Arya and Ananya are the sole visionaries behind CarveCart, having
              designed and developed every core feature using cutting-edge
              technologies like React, MongoDB, Express, and Node.js. Their
              combined expertise has shaped the app into a seamless and
              intuitive platform for food delivery.
            </p>
          </div>
        </div>
        <h1>CraveCart.</h1>
      </div>

      <div id = "page4">
        <div id = "page4-left">
          <img
            src = "https://uploads-ssl.webflow.com/5f2429f172d117fcee10e819/605c679f33f67d3dd00b04b4_avatar-3.jpeg"
            alt = "Founders"
          />
        </div>
        <div id = "page4-right">
          <p>
            CRAVECart is here to make your food delivery experience effortless
            and enjoyable. Offering a wide range of dishes from local favorites
            to gourmet meals, we prioritize quality and convenience in every
            order.
            <br />
            Founded by Ananya Chitale and Arya Joshi, CRAVECart is dedicated to
            bringing you exceptional service with just a few clicks. Enjoy
            delicious meals delivered straight to your door!
          </p>
        </div>
      </div>

      <div id = "page5">
        <div className = "scrolling-text">
          <h1>
            Let's create something together <span>Email me</span>
          </h1>
          <h1>
            Let's create something together <span>Email me</span>
          </h1>
          <h1>
            Let's create something together <span>Email me</span>
          </h1>
          {/* Duplicate content to ensure continuous scrolling */}
          <h1>
            Let's create something together <span>Email me</span>
          </h1>
          <h1>
            Let's create something together <span>Email me</span>
          </h1>
          <h1>
            Let's create something together <span>Email me</span>
          </h1>
        </div>
      </div>

      
    </div>
  );
};

export default AboutUs;

Home.jsx

import React, { useEffect } from 'react';
import './Header.css'; // Ensure this contains the necessary CSS
import gsap from 'gsap';
import { ScrollTrigger } from 'gsap/ScrollTrigger';

const Header = () => {
  // Register ScrollTrigger
  useEffect(() => {
    gsap.registerPlugin(ScrollTrigger);

    const loadingAnimation = () => {
      const tl = gsap.timeline();

      tl.from("#page1", {
        opacity: 0,
        duration: 0.2,
        delay: 0.2,
      })
      .from("#page1", {
        transform: "scaleX(0.7) scaleY(0.2) translateY(80%)",
        borderRadius: "150px",
        duration: 2,
        ease: "expo.out",
      })
      .from("nav", {
        opacity: 0,
        duration: 0.5,
        delay: -1,
      })
      .to("nav", {
        opacity: 1, // Ensure navbar becomes visible
        duration: 0.5
      })
      .from("#page1 h1, #page1 p, #page1 div", {
        opacity: 0,
        duration: 0.5,
        stagger: 0.2,
      });
    };

    // Call the animation function when the component mounts
    loadingAnimation();
  }, []);

  return (
    <div id = "main">
      <nav className = "visible">
        {/* Your nav content goes here */}
      </nav>
      
      <div id = "page1">
        <h1>
          <span className = "color">Fast</span> cravings,{" "}
        </h1>
        <h1>
          D
          <span>
            <svg className = "c-bttn__morph" fill = "none" viewBox = "0 0 131 136">
              <path
                className = "g-path"
                data-morph = "end"
                fill = "#fff"
                d = "M48 77.457v7.224h7.224l21.307-21.306-7.224-7.225L48 77.457Zm34.118-19.67a1.919 1.919 0 0 0 0-2.716l-4.508-4.508a1.919 1.919 0 0 0-2.716 0l-3.526 3.526 7.224 7.224 3.526-3.525Z"
              ></path>
            </svg>
          </span>
          ne with <span className = "color2">ease.</span>
        </h1>
        <p>
          Delivering deliciousness to your doorstep with speed and simplicity.{" "}
          <br /> seamless dining with our cutting-edge technology
          <br />
        </p>
      </div>
      <div id = "page2"></div>
    </div>
  );
};

export default Header;

Вот ссылка codeandBox. Проверьте App.jsx, чтобы внести изменения:

https://codesandbox.io/p/live/8355c488-0788-48ab-ab64-93934edc4cd8

Вы спрашиваете о какой-то проблеме со ссылкой на панели навигации или о какой-то странице «о нас», которую вы нам не показываете? Пожалуйста, отредактируйте , чтобы уточнить, в чем заключается конкретная проблема, и включите полный и точный минимально воспроизводимый пример соответствующего кода, с которым вы работаете.

Drew Reese 19.08.2024 05:53

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

Arya Joshi 19.08.2024 08:20

Похоже, проблема с CSS, IMO. Изображения полезны для иллюстрации проблемы, но минимальный воспроизводимый пример по-прежнему желателен, чтобы мы могли видеть, что делает код. React-Router не имеет ничего общего со стилем.

Drew Reese 19.08.2024 08:22

Хорошо, я добавлю оба кода Navbar, а также код домашней страницы.

Arya Joshi 19.08.2024 08:23

Кстати, вы также можете попробовать создать работающую демо-версию CodeSandbox, воспроизводящую проблему, которую мы могли бы проверить вживую. Не забудьте включить или объяснить точные этапы воспроизведения, если они необходимы.

Drew Reese 19.08.2024 08:25

Если проблема по-прежнему не возникает, сообщите мне, я добавлю ссылку на песочницу.

Arya Joshi 19.08.2024 08:31

Я думаю, что песочница будет полезна.

Drew Reese 19.08.2024 08:33

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

Arya Joshi 19.08.2024 09:10

Вы сохранили свои файлы? Эта ссылка открывает то, что кажется базовым проектом Vite.

Drew Reese 19.08.2024 09:13

Я не понял, можете ли вы показать мне, как вносить изменения в саму песочницу? Я дал вам разрешения на ее редактирование.

Arya Joshi 19.08.2024 09:39

Это похоже на любую другую среду IDE, в которой вы просто сохраняете изменения. Я думаю, что в наши дни они даже автоматически сохраняют файлы по умолчанию в CodeSandbox. В правом верхнем углу есть кнопка «Поделиться», которая копирует короткий URL-адрес в буфер обмена для удобного обмена.

Drew Reese 19.08.2024 18:19

Я дал ссылку, проверьте пожалуйста

Arya Joshi 20.08.2024 05:35

Код песочницы по-прежнему выглядит как код/страница Vite по умолчанию. Есть только основной App компонент с некоторым count состоянием и кнопкой в ​​пользовательском интерфейсе. Вы не смогли отредактировать его, включив в него пример кода из поста?

Drew Reese 20.08.2024 05:37

Извините за ошибку с моей стороны, пожалуйста, посмотрите новую ссылку сейчас. Спасибо.

Arya Joshi 20.08.2024 05:42
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
2
14
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ довольно прост.

<div className = "nav-elem">
          <h4><Link to = "/" className = {menu === '/' ? 'active' : ''} onClick = {() => setMenu('/')}>Home</Link></h4>
          <h5><span><Link to = "/about" className = {menu === '/about' ? 'active' : ''} onClick = {() => setMenu('/about')}>About Us</Link></span></h5>
          <h5><span>How It Works</span></h5>
          <h5><span>Blog</span></h5>
        </div>

Здесь вы перейдете к /about, нажав «О нас», но вы не добавили маршрут в App.jsx. Итак, App.jsx должен быть таким.

import React from 'react';
import Navbar from './components/Navbar/Navbar';
import Home from './pages/Home/Home';
import AboutUs from './pages/AboutUs/AboutUs'; // Import the About Us component
import { Routes, Route } from 'react-router-dom';

function App() {
  return (
    <div className = "App">
      <Navbar />
      <Routes>
        <Route path='/' element = {<Home />} /> {/* Home page */}
        <Route path='/home' element = {<Home />} /> {/* Optional: Duplicate home route */}
        <Route path='/about' element = {<AboutUs />} /> {/* About Us page */}
      </Routes>
    </div>
  );
}

export default App;

Я попробовал это, но после добавления команды Route в app.jsx она перекрывается с домом, искажая мою страницу Hime.

Arya Joshi 19.08.2024 05:29

*Ошибка опечатки на главной странице.

Arya Joshi 19.08.2024 05:36
Ответ принят как подходящий

Проблема

Проблема здесь в «загрязненном» глобальном стиле CSS. Когда маршрут <Route path='/about' element = {<AboutUs />} /> добавляется к маршрутам, компонент AboutUs импортируется, включая его файл AboutUs.css, который загружается в DOM и применяется. Многие из ваших различных файлов CSS определяют правила, ориентированные на одни и те же селекторы CSS, поэтому стили AboutUs CSS переопределяют различные элементы вашей навигационной панели и заголовка и, вероятно, другие перенаправленные компоненты.

Сравните, например, применяемые правила элемента h1:

Без маршрута AboutUs и CSS

С включенным маршрутом AboutUs и CSS

Обратите внимание, что правило AboutUs.css#page1 h1 применяется, даже если путь URL-адреса по-прежнему равен "/" и компонент Home отображается.

О нас.css

#page1 h1 {
  font-size: 300px;
  letter-spacing: -25px;
  font-weight: 100;
  font-family: canopee;
  background-color: #1c1c19;
  color: #c4bcb3;
  line-height: 600px;
  width: 97%;
  margin-left: 0%;
}

Решение

CSS применяется глобально, поэтому решение состоит в том, чтобы ограничить область действия ваших правил CSS с помощью селекторов. Обычно это достигается путем заключения определенной страницы или раздела/области/и т. д. в класс или какой-либо уникальный идентификатор.

Пример:

О нас.jsx

Укажите имя класса CSS "about-us" одному из корневых элементов компонента, который обертывает содержимое компонента страницы.

import React, { useEffect } from "react";
import LocomotiveScroll from "locomotive-scroll";
import gsap from "gsap";
import "./AboutUs.css";

const AboutUs = () => {
  ...

  return (
    <div className = "about-us" id = "main-content"> // <-- "about-us" CSS classname
      ...
    </div>
  );
};

export default AboutUs;

О нас.css

Здесь я показываю только одно правило, то есть все элементы h1, которые являются потомками любых элементов с именем класса CSS "about-us", но это будет сделано для любых правил CSS, которые вы хотите применить, и ограничиваться содержимым страницы «О программе».

.about-us h1 {
  font-size: 300px;
  letter-spacing: -25px;
  font-weight: 100;
  font-family: canopee;
  background-color: #1c1c19;
  color: #c4bcb3;
  line-height: 600px;
  width: 97%;
  margin-left: 0%;
}

Здесь вы можете видеть, что AboutUs.css загружен, но CSS элемента h1 на домашней странице не загрязнен CSS страницы «О нас».

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