Eu queria testar até onde conseguiria chegar criando uma landing page moderna sem depender de um framework. Em vez de simplesmente pegar um template pronto, montei o projeto utilizando HTML, CSS e JavaScript puro.
O resultado acabou reunindo bastante coisa em uma Ășnica pĂĄgina: menu responsivo, seção Hero, cards, estatĂsticas, animaçÔes durante o scroll, contador animado, navegação suave e outras interaçÔes.
Neste artigo, vou mostrar como construĂ essas partes e explicar o cĂłdigo por trĂĄs delas. A ideia nĂŁo Ă© apenas entregar uma landing page pronta, mas permitir que vocĂȘ entenda como cada parte funciona e consiga modificar o projeto depois.
1. Antes de começar: o que vamos construir
Antes de escrever o primeiro cĂłdigo, Ă© importante entender o que estamos tentando construir.
A pĂĄgina que montei foi pensada como uma landing page de apresentação de uma empresa fictĂcia chamada TechFlow. Ela possui um cabeçalho com navegação, uma ĂĄrea principal de destaque, estatĂsticas, apresentação de recursos, depoimentos, uma chamada para ação e um rodapĂ©.
A estrutura pode parecer grande quando olhamos para o resultado final, mas ela é formada por blocos independentes. Essa foi uma das primeiras decisÔes que tomei durante o desenvolvimento, porque trabalhar por seçÔes torna muito mais fåcil alterar a pågina depois.
Outra decisĂŁo importante foi nĂŁo utilizar um framework para resolver essas partes. Queria justamente entender quanto conseguiria fazer apenas com as tecnologias bĂĄsicas da web.
Jå que estamos falando de projetos para web e tecnologia, o celular também faz parte da rotina de muita gente que trabalha ou estuda usando a internet.
Clique na imagem para conferir o produto, as avaliaçÔes e o preço atual.
2. Começando pela estrutura HTML
O primeiro passo foi criar a estrutura HTML da pĂĄgina. Aqui procurei evitar aquele modelo em que todos os elementos ficam misturados em um Ășnico bloco enorme.
A pĂĄgina foi dividida em seçÔes com responsabilidades diferentes. O cabeçalho fica separado da ĂĄrea Hero, que por sua vez fica separado das estatĂsticas, recursos, depoimentos, CTA e rodapĂ©.
Um exemplo simples dessa organização é utilizar elementos como <header>, <section> e <footer> para deixar mais claro o papel de cada parte.
Isso nĂŁo muda apenas a aparĂȘncia do cĂłdigo. TambĂ©m facilita bastante a manutenção. Se depois eu quiser modificar somente a ĂĄrea de depoimentos, consigo localizar aquele bloco sem precisar procurar a informação no meio de centenas de linhas.
No meu projeto, inclusive, deixei comentårios identificando as principais åreas, como MENU, HERO, DEPOIMENTOS, CTA e FOOTER. à uma coisa simples, mas ajuda bastante quando o arquivo começa a crescer.
3. Criando uma identidade visual com variĂĄveis CSS
Depois de estruturar o HTML, comecei a trabalhar no CSS. Uma das escolhas que considero mais Ășteis no projeto foi criar variĂĄveis para as principais caracterĂsticas visuais.
Em vez de repetir a mesma cor em dezenas de lugares, posso definir valores no :root e reutilizĂĄ-los no restante do CSS.
:root {
--primary: #6366f1;
--secondary: #8b5cf6;
--text: #1e293b;
--text-light: #64748b;
--bg-light: #f8fafc;
--white: #ffffff;
--border: #e2e8f0;
--shadow: 0 10px 40px rgba(0,0,0,0.08);
} A vantagem disso aparece quando precisamos mudar a identidade visual. Se eu decidir trocar o roxo utilizado como cor principal, por exemplo, posso alterar a variåvel e vårios componentes da pågina acompanham a mudança.
Para um projeto pequeno isso pode parecer exagero, mas é justamente esse tipo de organização que evita retrabalho quando a pågina cresce.
Para quem passa bastante tempo usando o smartphone, pequenos acessórios também podem fazer parte da rotina. Se quiser conferir uma opção, veja abaixo.
Clique na imagem para acessar a oferta e conferir as informaçÔes disponĂveis na Shopee.
4. Montando o Hero da landing page
O Hero é aquela primeira grande årea que o visitante encontra ao entrar na pågina. Por isso, foi uma das partes em que mais trabalhei a composição visual.
No projeto, utilizei uma estrutura em duas colunas para colocar o conteĂșdo textual de um lado e uma ĂĄrea visual do outro.
.hero-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: 4rem;
align-items: center;
}
O ponto importante aqui Ă© o display: grid. Com grid-template-columns: 1fr 1fr, o espaço disponĂvel Ă© dividido em duas partes proporcionais.
Isso permite manter o texto e a parte visual lado a lado no desktop. Mais tarde, nas regras responsivas, essa estrutura Ă© alterada para funcionar melhor em telas menores.
TambĂ©m coloquei botĂ”es de ação e elementos visuais no Hero para que a primeira tela nĂŁo parecesse apenas um tĂtulo acompanhado de um parĂĄgrafo.
5. Criando efeitos visuais sem biblioteca
Uma das coisas que eu queria testar era até onde conseguiria levar as animaçÔes apenas com CSS.
Foi aà que entraram os @keyframes. Eles permitem definir diferentes estados de uma animação e depois aplicå-la a um elemento.
@keyframes float {
0%, 100% {
transform: translateY(0);
}
50% {
transform: translateY(-10px);
}
} Nesse caso, o elemento começa em sua posição normal, sobe alguns pixels no meio da animação e depois retorna. Repetindo o ciclo, conseguimos aquele movimento de flutuação.
O interessante Ă© que isso acontece no navegador sem precisar de JavaScript para controlar cada movimento.
Também criei uma animação semelhante para determinados cartÔes visuais da pågina. São detalhes pequenos, mas ajudam a deixar a interface menos eståtica.
E jĂĄ que o celular estĂĄ sempre presente quando consumimos conteĂșdo de tecnologia, vale conferir tambĂ©m opçÔes de proteção para o aparelho.
Clique na imagem para conferir os detalhes, avaliaçÔes e o preço atual.
6. Criando os cards de recursos
A seção de recursos foi criada usando cards. Cada card possui um Ăcone, um tĂtulo e uma descrição.
O CSS utiliza Grid para organizar esses elementos e também adiciona um pequeno efeito quando o usuårio passa o mouse sobre um card.
Um detalhe que gostei de utilizar foi uma linha no topo do card que inicialmente fica recolhida e aumenta durante o :hover. O efeito é feito com transformação no eixo X.
.recurso-card::before {
content: '';
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 4px;
background: var(--gradient);
transform: scaleX(0);
transition: transform 0.3s ease;
}
.recurso-card:hover::before {
transform: scaleX(1);
}
O conceito aqui Ă© simples: scaleX(0) praticamente esconde a linha porque sua largura visual Ă© reduzida no eixo horizontal. Quando o mouse passa pelo card, ela vai para scaleX(1) e aparece.
Ă um bom exemplo de como podemos conseguir efeitos interessantes sem precisar adicionar uma biblioteca inteira ao projeto.
7. Fazendo o menu funcionar no celular
Depois da parte visual, chegou a hora de adicionar comportamento com JavaScript.
O menu mobile é um bom exemplo porque não precisamos de uma solução complicada. Primeiro recuperamos os elementos do HTML.
const menuToggle = document.getElementById('menuToggle');
const navLinks = document.getElementById('navLinks'); Depois, adicionamos um evento de clique ao botĂŁo.
menuToggle.addEventListener('click', () => {
menuToggle.classList.toggle('active');
navLinks.classList.toggle('active');
});
O ponto principal aqui Ă© o classList.toggle(). Em vez de escrever uma lĂłgica enorme para verificar se o menu estĂĄ aberto ou fechado, podemos simplesmente adicionar a classe quando ela nĂŁo existe e removĂȘ-la quando jĂĄ existe.
O CSS fica responsĂĄvel por determinar visualmente o que acontece quando essas classes aparecem.
Também fiz o menu fechar automaticamente quando o usuårio clica em um dos links. Isso evita que o menu continue aberto depois que a pessoa jå escolheu uma seção da pågina.
8. Alterando o header durante o scroll
Outra interação que coloquei foi uma mudança no comportamento do cabeçalho quando o visitante começa a rolar a pågina.
Para detectar isso, utilizei o evento scroll do navegador.
window.addEventListener('scroll', () => {
const currentScroll = window.pageYOffset;
if (currentScroll > 50) {
header.classList.add('scrolled');
} else {
header.classList.remove('scrolled');
}
});
A lĂłgica Ă© simples: enquanto o usuĂĄrio estĂĄ no inĂcio da pĂĄgina, o header permanece em seu estado original. Depois que o scroll passa de 50 pixels, adiciono a classe scrolled.
O CSS pode entĂŁo utilizar essa classe para modificar sombra, fundo ou outras caracterĂsticas do cabeçalho.
Esse Ă© um bom exemplo de divisĂŁo de responsabilidades: JavaScript detecta o comportamento e CSS decide como o elemento deve ficar visualmente.
Se vocĂȘ tambĂ©m costuma usar o celular durante bastante tempo do dia, aqui estĂĄ mais uma opção que pode valer uma olhada.
Clique na imagem para acessar a oferta e conferir as informaçÔes atuais na Shopee.
9. Fazendo os elementos aparecerem durante o scroll
Uma das partes mais interessantes do JavaScript utilizado no projeto foi o IntersectionObserver.
Ele permite observar elementos da pĂĄgina e descobrir quando eles entram na ĂĄrea visĂvel do navegador.
Primeiro, seleciono todos os elementos que receberam a classe animate-on-scroll.
const animateElements =
document.querySelectorAll('.animate-on-scroll');
Depois crio o observador:
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('visible');
}
});
}, {
threshold: 0.1,
rootMargin: '0px 0px -50px 0px'
});
Quando o elemento passa a estar visĂvel, adiciono a classe visible. O CSS Ă© quem define a animação associada a essa classe.
Isso cria um efeito bastante comum em sites modernos: os blocos nĂŁo aparecem todos de uma vez. Conforme o visitante percorre a pĂĄgina, os elementos vĂŁo surgindo.
O mais interessante é que não precisei ficar verificando a posição de cada elemento manualmente durante todo o scroll.
10. Criando o efeito de rolagem suave
Também quis evitar aquela sensação de que o navegador simplesmente pula de uma seção para outra quando o usuårio clica no menu.
Para isso, o projeto identifica links que começam com # e intercepta o clique.
window.scrollTo({
top: offsetTop,
behavior: 'smooth'
});
O detalhe importante é behavior: 'smooth'. Ele faz com que a navegação até a seção aconteça gradualmente em vez de ocorrer como um salto instantùneo.
TambĂ©m considerei um deslocamento de 80 pixels para evitar que o conteĂșdo fique escondido atrĂĄs do cabeçalho.
11. Criando contadores animados com JavaScript
Essa foi uma das partes em que mais vale a pena parar para entender o cĂłdigo.
A landing page possui nĂșmeros na ĂĄrea de estatĂsticas. Em vez de simplesmente mostrar o valor final, criei uma função que começa em zero e vai aumentando o nĂșmero atĂ© chegar ao objetivo.
A função recebe o elemento, o valor final e a duração da animação:
function animateCounter(element, target, duration = 2000) {
const start = 0;
const startTime = performance.now();
function updateCounter(currentTime) {
const elapsed = currentTime - startTime;
const progress = Math.min(elapsed / duration, 1);
const ease = 1 - Math.pow(1 - progress, 3);
const current = start + (target - start) * ease;
// Atualização do valor...
if (progress < 1) {
requestAnimationFrame(updateCounter);
}
}
requestAnimationFrame(updateCounter);
}
O performance.now() fornece uma referĂȘncia de tempo de alta precisĂŁo. Com ela, consigo calcular quanto tempo jĂĄ passou desde o inĂcio da animação.
Depois calculo o progresso dividindo o tempo decorrido pela duração desejada. O Math.min() impede que o valor ultrapasse 1.
Existe ainda um cĂĄlculo chamado de easing:
const ease = 1 - Math.pow(1 - progress, 3);
Ele faz com que a animação não tenha uma velocidade completamente linear. O movimento começa e termina de maneira mais suave, deixando o contador visualmente mais agradåvel.
Por fim, o requestAnimationFrame() solicita que o navegador execute a próxima atualização da animação no momento apropriado para renderização.
O resultado Ă© aquele efeito em que os nĂșmeros parecem estar sendo contados atĂ© chegar ao valor final.
Se vocĂȘ chegou atĂ© aqui porque gosta de tecnologia e tambĂ©m passa bastante tempo no smartphone, confira esta outra opção.
Clique na imagem para consultar o produto e verificar preço, avaliaçÔes e condiçÔes atuais.
12. Tornando a pĂĄgina responsiva
Uma das partes que nĂŁo pode ser deixada para depois Ă© a responsividade.
A pågina precisa funcionar em uma tela grande, mas também precisa se adaptar quando o visitante estiver usando um notebook menor, tablet ou smartphone.
Para isso, utilizei media queries no CSS. Em determinados pontos de largura, a estrutura muda.
@media (max-width: 768px) {
.hero-grid {
grid-template-columns: 1fr;
}
} No desktop, o Hero possui duas colunas. Quando a tela fica menor, essas colunas deixam de ficar lado a lado e passam para uma Ășnica coluna.
O mesmo conceito é aplicado a outras åreas da pågina. Grids são reorganizados, botÔes podem ocupar mais espaço e o menu de navegação muda de comportamento.
Essa parte foi especialmente importante durante os testes porque uma coisa Ă© olhar para o cĂłdigo e outra Ă© realmente abrir a pĂĄgina em diferentes tamanhos de tela.
13. O que eu aprendi construindo esse projeto
Foi justamente durante a construção que percebi como pequenos detalhes podem mudar bastante o resultado final.
No começo, é tentador colocar vårios efeitos porque eles parecem interessantes isoladamente. Porém, quando tudo começa a se movimentar ao mesmo tempo, a interface pode ficar visualmente cansativa.
Por isso, precisei encontrar um equilĂbrio entre animação e simplicidade.
TambĂ©m ficou evidente para mim a importĂąncia de separar as responsabilidades. HTML organiza o conteĂșdo, CSS cuida principalmente da apresentação e JavaScript entra quando precisamos de comportamento e interação.
Outra coisa que considero importante Ă© testar enquanto desenvolvemos. Foi assim que consegui perceber detalhes de responsividade e ajustar alguns comportamentos que nĂŁo eram tĂŁo evidentes olhando apenas para o cĂłdigo.
14. Baixe o projeto completo
Se vocĂȘ quiser estudar a landing page sem precisar reconstruir tudo do zero, deixei o projeto completo disponĂvel para download.
Minha sugestão é abrir o arquivo primeiro e navegar pela pågina. Depois, comece a alterar pequenas coisas: troque as cores, modifique os textos, remova uma animação, crie um novo card ou altere o comportamento do menu.
à fazendo esse tipo de alteração que o código deixa de ser apenas um exemplo pronto e começa a realmente ensinar alguma coisa.
Quer estudar o cĂłdigo completo?
Baixe o projeto que usei neste tutorial e comece a modificar a landing page para criar sua prĂłpria versĂŁo.
Baixar o projeto completoConclusĂŁo
Criar esta landing page foi uma forma prĂĄtica de testar o que Ă© possĂvel fazer apenas com HTML, CSS e JavaScript.
O resultado nĂŁo depende de um framework para funcionar. A estrutura HTML organiza o conteĂșdo, o CSS cria a identidade visual e a responsividade, enquanto o JavaScript adiciona comportamentos como menu mobile, navegação suave, animaçÔes durante o scroll e contadores.
E essa Ă© justamente a parte que considero mais interessante no projeto: depois que vocĂȘ entende como cada componente funciona, fica muito mais fĂĄcil deixar de depender de templates prontos.
VocĂȘ pode pegar a mesma ideia e transformar completamente o resultado. Trocar a identidade visual, mudar as seçÔes, criar novos componentes, conectar um formulĂĄrio ou adaptar a pĂĄgina para um produto real.
Agora Ă© sua vez
Se vocĂȘ baixou o projeto, nĂŁo pare no download. Abra o cĂłdigo e tente modificar alguma coisa antes de simplesmente copiar a pĂĄgina.
Se este tutorial ajudou vocĂȘ a entender alguma parte do desenvolvimento frontend, compartilhe com outro desenvolvedor ou estudante que esteja aprendendo HTML, CSS e JavaScript.
Quer colaborar com o NerdCult?
Se vocĂȘ tambĂ©m desenvolve projetos, testa tecnologias ou possui uma experiĂȘncia prĂĄtica que pode ajudar outros desenvolvedores, envie sua sugestĂŁo. O NerdCult estĂĄ aberto a ideias, experiĂȘncias e colaboraçÔes que possam gerar conteĂșdo realmente Ăștil para quem acompanha tecnologia e programação.
Este artigo pode conter links de afiliados. Caso vocĂȘ realize uma compra atravĂ©s de um desses links, o NerdCult poderĂĄ receber uma comissĂŁo, sem custo adicional para vocĂȘ.
ComentĂĄrios (0)
Nenhum comentĂĄrio ainda. Seja o primeiro a comentar!
Adicionar ComentĂĄrio