Introdução
Neste laboratório, aprenderemos como criar um botão com uma animação de efeito ripple (ondulação) usando React. O objetivo deste laboratório é ajudá-lo a entender como usar React hooks, como useState() e useEffect(), para gerenciar o estado do botão e acionar a animação. Ao final deste laboratório, você será capaz de criar botões interativos e visualmente atraentes para suas aplicações React.
Botão com Efeito Ripple (Ondulação)
index.htmlescript.jsjá foram fornecidos na VM. Em geral, você só precisa adicionar código ascript.jsestyle.css.
Este código renderiza um componente de botão que cria um efeito de ondulação quando clicado. Veja como funciona:
- O hook
useState()é usado para criar duas variáveis de estado:coordseisRippling. A variávelcoordsarmazena as coordenadas do ponteiro, enquantoisRipplingarmazena o estado da animação do botão. - Um hook
useEffect()é usado para alterar o valor deisRipplingtoda vez que a variável de estadocoordsmuda. Isso inicia a animação do efeito de ondulação. setTimeout()é usado no hook anterior para limpar a animação após a conclusão da reprodução.- Outro hook
useEffect()é usado para redefinircoordssempre que a variável de estadoisRipplingforfalse. - O evento
onClické tratado atualizando a variável de estadocoordse chamando a função de callback passada.
Aqui está o código para o componente RippleButton:
const RippleButton = ({ children, onClick }) => {
const [coords, setCoords] = React.useState({ x: -1, y: -1 });
const [isRippling, setIsRippling] = React.useState(false);
React.useEffect(() => {
if (coords.x !== -1 && coords.y !== -1) {
setIsRippling(true);
setTimeout(() => setIsRippling(false), 300);
} else setIsRippling(false);
}, [coords]);
React.useEffect(() => {
if (!isRippling) setCoords({ x: -1, y: -1 });
}, [isRippling]);
return (
<button
className="ripple-button"
onClick={(e) => {
const rect = e.target.getBoundingClientRect();
setCoords({ x: e.clientX - rect.left, y: e.clientY - rect.top });
onClick && onClick(e);
}}
>
{isRippling && (
<span
className="ripple"
style={{
left: coords.x,
top: coords.y
}}
/>
)}
<span className="content">{children}</span>
</button>
);
};
Você pode usar este componente assim:
ReactDOM.createRoot(document.getElementById("root")).render(
<RippleButton onClick={(e) => console.log(e)}>Click me</RippleButton>
);
E aqui está o CSS para o componente RippleButton:
.ripple-button {
border-radius: 4px;
border: none;
margin: 8px;
padding: 14px 24px;
background: #1976d2;
color: #fff;
overflow: hidden;
position: relative;
cursor: pointer;
}
.ripple-button > .ripple {
width: 20px;
height: 20px;
position: absolute;
background: #63a4ff;
display: block;
content: "";
border-radius: 9999px;
opacity: 1;
animation: 0.9s ease 1 forwards ripple-effect;
}
@keyframes ripple-effect {
0% {
transform: scale(1);
opacity: 1;
}
50% {
transform: scale(10);
opacity: 0.375;
}
100% {
transform: scale(35);
opacity: 0;
}
}
.ripple-button > .content {
position: relative;
z-index: 2;
}
Por favor, clique em 'Go Live' no canto inferior direito para executar o serviço web na porta 8080. Em seguida, você pode atualizar a aba Web 8080 para visualizar a página web.
Resumo
Parabéns! Você concluiu o laboratório Button With Ripple Effect. Você pode praticar mais laboratórios no LabEx para aprimorar suas habilidades.