Animações de Scroll em React

Adicionando pequenos detalhes que fazem diferença!

As animações de scroll permite que seus componentes apareçam na página enquanto você desliza para baixo. Este artigo mostra como fazer isso com React e CSS3!

Image for post

Exemplo de uma animação de scroll

Para este exemplo, teremos um componente App, Header e About.

Primeiro, vamos criar o nosso componente Header.

***src/Header/index.js***
-----------------------
import React from 'react';
import './styles.css';
const Header = () => (
<div className="header">
<h1>Title</h1>
</div>
)
export default Header;

Adicionar alguns estilos:

***src/Header/styles.css***
-------------------------
.header {
display: flex;
justify-content: center;
align-items: center;
height: 100vh;
width: 100vw;
}
.header h1 {
font-size: 30px;
color: white;
}

Irado! O componente Header está pronto! Vamos para o próximo, que será o componente App:

***src/App/index.js***
--------------------
import React, { Component } from 'react';
import Header from '../Header';
class App extends Component {
constructor() {
super();
this.state = {
className: ''
}
}
render() {
return(
<div>
<Header />
</div>
)
}
}
export default App;

O nosso componente App está apenas renderizando nosso componente Header. Abaixo do Header, criaremos o componente About que contém um texto. O texto será deslocado a partir da esquerda quando nos deslizarmos para área abaixo deste componente.

Há algumas coisas que precisamos fazer para que isso aconteça:

  • Nosso estado precisa manter o nome da classe da imagem e do texto do componente About
  • Se o usuário percorrer uma certa quantidade de pixels, defina o estado para outro nome de classe.
  • Criar uma função que manipule a ação de scroll
***src/App/index.js***
--------------------
import React, { Component } from 'react';
import Header from '../Header';
class App extends Component {
constructor() {
super();
this.state = {
className: 'hidden'
}
}
handleScroll() {
if (document.documentElement.scrollTop > 430) {
this.setState({
className: 'show'
})
}
}

componentDidMount() {
window.onscroll = () => this.handleScroll()
}
render() {
return(
<div>
<Header />
</div>
)
}
}
export default App;

Se você não tem certeza de quantos pixels depois você quer que ele apareça, verifique utilizando:

console.log(document.documentElement.scrollTop);

Toda vez que nos realizarmos o scroll, a função handleScroll é invocada. No entanto, apenas se tivéssemos percorrido 430 pixels, a função handleScroll definirá o estado como show, ao invés de hide.

Vamos criar o componente About.

***src/About/index.js***
-----------------------
import React, { Component } from 'react';
import './styles.css';
class About extends Component {
render() {
return(
<div className="about-wrapper">
<div className="about-text">
<div className={this.props.className}>
<h3>Title</h3>
<p>This is a text that will appear.</p>
</div>
</div>
</div>
)
}
}
export default About;

Se o usuário não percorrer 430 pixels, o nome da classe da div que contém o texto será hide. Uma vez que o usuário percorreu 430 pixels, o className será show. Isso é importante uma vez que chegamos ao CSS. Mas primeiro, vamos importar o componente About no componente da nossa aplicação.

***src/App/index.js***
--------------------
import React, { Component } from 'react';
import About from '../About';
import Header from '../Header';
class App extends Component {
constructor() {
super();
this.state = {
className: 'hidden'
}
}
handleScroll() {
if (document.documentElement.scrollTop > 430) {
this.setState({
className: 'show'
})
}
}
componentDidMount() {
window.onscroll = () => this.handleScroll()
}
render() {
return(
<div>
<Header />
<About className={this.state.className} />
</div>
)
}
}
export default App;

E adicionar alguns estilos para About:

***src/About/styles.css***
------------------------
.about-wrapper {
height: 30em;
width: 100vw;
}
.about-text {
position: relative;
width: 30em;
height: 20em;
}
.show {
position: absolute;
left: -30em;
width: 30em;
height: 20em;
-webkit-animation: slide-in 1s forwards;
animation: slide-in 1s forwards;
}
@-webkit-keyframes slide-in {
100% { left: 0 }
}
@keyframes slide-in {
100% { left: 0 }
}

E PRONTO!!1 🚀 🎉

Image for post
Ahoooy! E não é que funciona?

Agora, ao deslizar pela página, o texto será mostrado a partir da esquerda. Ainda não adicionei nenhum estilo aos componentes, por isso não parece muito bom, mas a funcionalidade está lá!

Se você deseja que eles apareçam da direita, parte superior ou inferior, basta alterar os próximos valores:

.show {
left/right/top/bottom: -30em
}
@-webkit-keyframes slide-in {
100% { left/right/top/bottom: 0 }
}
@keyframes slide-in {
100% { left/right/top/bottom: 0 }
}

Créditos

Written by

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store