I currently have my nav set up how i’d like, I would just like the logo image to shrink from 91px to 60px when the user scrolls down the page, and then grow back to 91px when they’re at the top. I’ve seen some questions online but none of them seem to work or be specific enough for the solution I want. Any help would be really appreciated. Updated my code with my attempt from this codesandpit from this question – Resize Header onscroll React
When I scroll down I get this error –
TypeError: headerEl is null
import React, { Component } from "react"; import logo from "../images/sdrlogo.jpeg"; import { FaAlignRight } from "react-icons/fa"; import { Link } from "react-router-dom"; export default class Navbar extends Component { state = { isOpen: false, } handleToggle = () => { this.setState({ isOpen: !this.state.isOpen }); } componentDidMount() { window.addEventListener("scroll", this.resizeHeaderOnScroll); } resizeHeaderOnScroll() { const distanceY = window.pageYOffset || document.documentElement.scrollTop, shrinkOn = 200, headerEl = document.getElementById("js-header"); if (distanceY > shrinkOn) { headerEl.classList.add("smaller"); } else { headerEl.classList.remove("smaller"); } } render() { return <nav className="navbar"> <div class="nav-center"> <div class="nav-header"> <Link to="/"> <img className="logo" src={logo} alt="Derby Golf Centre" /> </Link> <button type="button" className="nav-btn" onClick={this.handleToggle}> <FaAlignRight className="nav-icon" /> </button> </div> <ul className={this.state.isOpen ? "nav-links show-nav" : "nav-links"}> <li> <Link to="/">Home</Link> </li> <li> <Link to="/lesson">Book a Lesson</Link> </li> <li> <Link to="/opening-times">Opening Times</Link> </li> <li> <Link to="/contact">Contact</Link> </li> <li> <Link to="/driving-range">Driving Range</Link> </li> </ul> </div> </nav>; } }
Advertisement
Answer
So, I took some time and went through the code. I missed the CSS file on codesandbox, I’ve amended my code and using getElementbyID, I change the logo from a class to an ID and then used that. In the CSS I created a class called logoShrink and added transitions to both.
.logoShrink { height: 60px !important; transition: 0.5s; }
if anyone is bothered, code is below!
import React, { Component } from "react"; import logo from "../images/sdrlogo.jpeg"; import { FaAlignRight } from "react-icons/fa"; import { Link } from "react-router-dom"; export default class Navbar extends Component { state = { isOpen: false, } handleToggle = () => { this.setState({ isOpen: !this.state.isOpen }); } componentDidMount() { window.addEventListener("scroll", this.resizeHeaderOnScroll); } resizeHeaderOnScroll() { const distanceY = window.pageYOffset || document.documentElement.scrollTop, shrinkOn = 100, headerEl = document.getElementById("logo"); if (distanceY > shrinkOn) { headerEl.classList.add("logoShrink"); } else { headerEl.classList.remove("logoShrink"); } } render() { return <nav className="navbar"> <div class="nav-center"> <div class="nav-header"> <Link to="/"> <img id="logo" src={logo} alt="Derby Golf Centre" /> </Link> <button type="button" className="nav-btn" onClick={this.handleToggle}> <FaAlignRight className="nav-icon" /> </button> </div> <ul className={this.state.isOpen ? "nav-links show-nav" : "nav-links"}> <li> <Link to="/">Home</Link> </li> <li> <Link to="/lesson">Book a Lesson</Link> </li> <li> <Link to="/opening-times">Opening Times</Link> </li> <li> <Link to="/contact">Contact</Link> </li> <li> <Link to="/driving-range">Driving Range</Link> </li> </ul> </div> </nav>; } }