Is it possible to change the class of my header so that it will change its color when the background changes? I have a header and some sections. The header is fixed and when it foreaxmple reaches a section with a different backgroundcolor, I want to change the headers color for better readability, but I don't know how to do that. I've searched the web for it but I couldn't eally find something.
this is what I got so far: (see this JSFIDDLE )
class Div extends React.Component{
constructor() {
super()
this.state = {
headerClass: 'white'
}
}
changeColor() {
// something like
this.setState({ headerClass: 'black'})
}
render(){
return(
<div>
<div id="header">
<h1 className={`${this.state.headerClass}`}>
This is the header
</h1>
</div>
<div id="section_1" className="section">
This is section 1
</div>
<div id="section_2" className="section">
This is section 2
</div>
<div id="section_3" className="section">
This is section 3
</div>
<div id="section_4" className="section">
This is section 4
</div>
<div id="section_5" className="section">
This is section 5
</div>
</div>
)
}
}
the CSS:
#main {
height: 2000px;
position: relative;
}
#section_1 {
background: grey;
}
.section {
height: 400px;
background: white;
padding: 30px 0;
}
#header {
height: 50px;
background: transparent;
position: fixed;
width: 100%;
left: 0;
top: 0;
right: 0;
z-index: 1
}
h1 {
color: white;
}
So, are there any hints?
To create the rendering of the background color change of the navbar you will have to create a useEffect where you will pass the changeBackground function and an event listener that will be on scroll and passing the changeBackground function, like so.
To get scroll position with React, we can add a scroll listener to window . to create the scrollPosition state with the useState hook. Then we add the handleScroll function that takes the scroll position with the window.
To handle the onScroll event in React: Set the onScroll prop on an element or add an event listener on the window object. Provide an event handler function. Access relevant properties on the event or window objects.
Try this:
import React from 'react'
export default class Div extends React.Component{
state = {
color: 'white'
}
listenScrollEvent = e => {
if (window.scrollY > 400) {
this.setState({color: 'black'})
} else {
this.setState({color: 'white'})
}
}
componentDidMount() {
window.addEventListener('scroll', this.listenScrollEvent)
}
render() {
return(
<div>
<div id="header">
<h1 style={{color: this.state.color}}>
This is the header
</h1>
</div>
<div id="section_1" className="section">
This is section 1
</div>
<div id="section_2" className="section">
This is section 2
</div>
<div id="section_3" className="section">
This is section 3
</div>
<div id="section_4" className="section">
This is section 4
</div>
<div id="section_5" className="section">
This is section 5
</div>
</div>
)
}
}
Basically we just use window.scrollY
to know where has the user scrolled to.
You could do this with React Hooks. This is what I did below.
Here is a Code SandBox to see all files. It has body.js and styles.css to help show changes on scroll. Below is the Header Component and its css file. Hope this Helps! (https://codesandbox.io/s/header-change-color-onscrolly-2z3vt)
// Header Component
import React, { useState, useEffect } from 'react'
import "./Header.css"
function Header2() {
const [header, setHeader] = useState("header")
const listenScrollEvent = (event) => {
if (window.scrollY < 73) {
return setHeader("header")
} else if (window.scrollY > 70) {
return setHeader("header2")
}
}
useEffect(() => {
window.addEventListener('scroll', listenScrollEvent);
return () =>
window.removeEventListener('scroll', listenScrollEvent);
}, []);
return (
<header className={header}>
<div className="logo">Logo</div>
<ul className="links">
<li className="link-item">home</li>
<li className="link-item">about</li>
<li className="link-item">join</li>
</ul>
</header>
);
}
export default Header2;
css file.
// Styles header.css
.header {
position: absolute;
top: 0;
left: 0;
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
height: 120px;
background-color: #fff;
color: #333;
transform: translateY(0);
transition: transform 0.6s ease;
}
.header2 {
position: fixed;
top: 0;
left: 0;
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
height: 86px;
background-color: gray;
color: rosybrown;
transform: translateY(10);
transition: transform 6s ease;
animation: myanimation 3s;
}
@keyframes myanimation {
0% {
background-color: transparent;
color: transparent;
}
35% {
background-color: gray;
color: rosybrown;
}
100% {
background-color: gray;
color: rosybrown;
}
}
.logo {
margin: 0 24px;
font-size: 28px;
color: #f59596;
}
.links {
padding: 0;
margin: 0 24px;
}
.link-item {
display: inline-block;
margin: 0 12px;
cursor: pointer;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With