Skip to content

front-school/22001-scroll-ao-clicar

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

[React] Como navegar para uma seção do site ao clicar em um botão

Para navegar para uma seção específica da sua página web ao clicar em um botão, você só precisa seguir 3 simples passos.

Primeiramente, defina um identificador único para a seção onde você quer navegar quando clicar em um botão.

No caso, vamos definir um id para a seção "Seja um aluno" do nosso site.

export default function BeStudent () {
	return <div className={styles.BeStudent} id={'be-a-student'}>
		{...}
	</div>
}

Podemos definir uma constante para esse identificador e exportar junto com o componente, para garantir que sabemos onde ele está sendo usado futuramente.

export const BE_A_STUDENT_ID = 'be-a-student';

export default function BeStudent () {
	return <div className={styles.BeStudent} id={BE_A_STUDENT_ID}>
		{...}
	</div>
}

Em seguida, no botão que desejamos adicionar essa função, precisamos adicionar um evento de clique, e fazer a referência para uma nova função.

export default function MainSlider () {
	function handleCTAClick () {

	}

	return <div className={styles.MainSlider}>
		{...}
		<Button onClick={handleCTAClick}>
			Seja um aluno
		</Button>
	</div>
}

Por fim, vamos adicionar a instrução para fazer a janela "scrollar" (ou rolar) para o um ponto específico.

Para essa instrução, vamos usar o método scrollTo, disponível na variável global window de todos os navegadores.

Precisamos passar dois parâmetros para ele: top e behavior.

Por enquanto, vamos passar os valores 500 para top, e 'smooth' para behavior.

export default function MainSlider () {
	function handleCTAClick () {
		window.scrollTo({
			top: 500,
			behavior: 'smooth',
		})
	}

	return <div className={styles.MainSlider}>
		{...}
		<Button onClick={handleCTAClick}>
			Seja um aluno
		</Button>
	</div>
}

Note que ao clicar no botão, a tela descerá um pouquinho.

Na verdade, esse pouquinho é exatamente 500 pixels.

Caso a sua tela tenha subido ao invés de descer, significa que o seu botão está localizado abaixo da linha de 500 pixels da página.

Ou seja, essa função faz o rolamento da página para o topo de definirmos.

Então, no nosso caso, podemos usar o topo do nosso elemento "Seja um aluno” como parâmetro.


O primeiro passo é recuperar o elemento, usando um seletor por query, por exemplo.

import { BE_A_STUDENT_ID } from './BeStudent'

export default function MainSlider () {
	function handleCTAClick () {
		const beStudentBlock = document.querySelector(BE_A_STUDENT_ID);
		window.scrollTo({
			top: 500,
			behavior: 'smooth',
		})
	}

	return <div className={styles.MainSlider}>
		{...}
		<Button onClick={handleCTAClick}>
			Seja um aluno
		</Button>
	</div>
}

Como esse elemento pode não existir, precisamos verificar se ele de fato existe antes de tentar buscar qualquer valor dentro dele, para evitar erros em runtime.

E usamos a propriedade offsetTop como referência. Essa propriedade diz exatamente qual a distância em pixels do início do elemento até o início da página.

import { BE_A_STUDENT_ID } from './BeStudent'

export default function MainSlider () {
	function handleCTAClick () {
		const beStudentBlock = document.querySelector(BE_A_STUDENT_ID);

		if (beStudentBlock) {
			window.scrollTo({
				top: beStudentBlock.offsetTop,
				behavior: 'smooth',
			})
		}
	}

	return <div className={styles.MainSlider}>
		{...}
		<Button onClick={handleCTAClick}>
			Seja um aluno
		</Button>
	</div>
}

Caso você esteja usando TypeScript, ele vai acusar um erro sobre a tipagem do elemento. Isso acontece, pois ele não sabe exatamente qual o tipo de elemento a sua query vai retornar.

E, caso ela retorne um SVG, por exemplo, não existirá a propriedade offsetTop gerando um erro no seu código.

Para evitar esse erro, basta você verificar também se o elemento é uma instância de um HTMLElement.

import { BE_A_STUDENT_ID } from './BeStudent'

export default function MainSlider () {
	function handleCTAClick () {
		const beStudentBlock = document.querySelector(BE_A_STUDENT_ID);

		if (beStudentBlock && (beStudentBlock instanceof HTMLElement)) {
			window.scrollTo({
				top: beStudentBlock.offsetTop,
				behavior: 'smooth',
			})
		}
	}

	return <div className={styles.MainSlider}>
		{...}
		<Button onClick={handleCTAClick}>
			Seja um aluno
		</Button>
	</div>
}

E pronto, tudo funcionando perfeitamente.


  • YouTube Se você gostou da aula, peço que você expresse isso clicando no joinha e também comentando, pois isso ajuda muito. E se você quer receber dicas de front-end como esta, recomendo que se inscreva no canal e ative o sininho, assim você ficará por dentro de todos os vídeos aqui da front school.
  • Postagem Se você gostou do artigo ou se ele te ajudou de alguma maneira, comente e/ou compartilhe com algum amigo. Disseminar o conhecimento sobre front-end é a nossa missão aqui na front school, e com seu apoio podemos alcançar todo o país.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published