Projetos

Portfólio responsivo: adaptando sua página para celular, tablet e desktop

Aprenda a adaptar o portfólio para celular, tablet e desktop usando media queries, ajustes de menu, hero, grids, cards e espaçamentos.

Por Equipe Central Stack09/07/20269 minGuia prático
portfoliocssresponsividademedia queriesfrontendmobile firstprojetos práticosiniciante

Compartilhar

Envie este conteúdo para sua rede ou salve o link para publicar depois.

Trilha: Projeto Portfólio Profissional

Este conteúdo é a Parte 4 de 6 da trilha Projeto Portfólio Profissional. Acompanhe o hub da trilha: /projetos/criar-portfolio-profissional

Nas partes anteriores, criamos a estrutura HTML, aplicamos o visual com CSS e adicionamos interações com JavaScript. Agora vamos adaptar a página para funcionar melhor em celular, tablet e desktop.

Introdução

Responsividade é a capacidade de uma página se ajustar ao tamanho da tela sem quebrar o layout. Um portfólio pode ficar bonito no computador, mas se o menu, os cards ou os botões ficarem apertados no celular, a experiência deixa de parecer profissional.

Nesta etapa, vamos trabalhar com ajustes simples e práticos: containers flexíveis, imagens que não estouram a tela, grids que mudam de coluna e media queries para controlar o layout em telas menores.

Conferindo o viewport no HTML

Antes de mexer no CSS, confira se o HTML tem a tag viewport dentro do head. Ela avisa ao navegador que a largura da página deve acompanhar a largura real do dispositivo.

index.html
<!-- Viewport: faz o layout respeitar a largura real do celular e do tablet. -->
<meta name="viewport" content="width=device-width, initial-scale=1.0" />

Sem essa tag, o navegador pode renderizar a página como se ela estivesse em uma tela grande e apenas encolher tudo. Isso costuma deixar textos pequenos e áreas difíceis de tocar no celular.

Deixando imagens e containers flexíveis

O primeiro cuidado é impedir que imagens e blocos ultrapassem a largura da tela. Também vale manter um container central com largura máxima para o desktop e respiro lateral para telas menores.

style.css
/* Base responsiva: impede estouros laterais e mantém o conteúdo confortável. */
html {
  scroll-behavior: smooth;
}

body {
  overflow-x: hidden;
}

img {
  display: block;
  max-width: 100%;
  height: auto;
}

.container {
  width: min(1120px, calc(100% - 32px));
  margin: 0 auto;
}

A função min ajuda o container a ter um limite no computador, mas sem ultrapassar a tela no celular. O calc cria uma margem lateral simples de 16px de cada lado.

Ajustando o menu

No desktop, o menu pode ficar horizontal. Em telas menores, os links precisam ganhar uma área própria para não ficarem espremidos. Se você seguiu a Parte 3, o JavaScript já controla a classe active.

style.css
/* Menu mobile: esconde os links até o botão abrir a navegação. */
@media (max-width: 768px) {
  .hamburger {
    display: flex;
  }

  .nav-links {
    position: absolute;
    top: 72px;
    left: 16px;
    right: 16px;
    display: none;
    flex-direction: column;
    gap: 12px;
    padding: 16px;
    border: 1px solid var(--border);
    border-radius: 16px;
    background: var(--surface);
    box-shadow: var(--shadow);
  }

  .nav-links.active {
    display: flex;
  }

  .nav-links a {
    width: 100%;
    padding: 10px 12px;
  }
}

Esse bloco mantém o topo organizado em telas pequenas. O menu só aparece quando a classe active é adicionada pelo JavaScript.

Adaptando a seção inicial

A hero section normalmente usa duas colunas no desktop: texto de um lado e imagem do outro. No celular, o ideal é empilhar os blocos para preservar leitura e toque.

style.css
/* Hero em telas médias: reduz o impacto visual sem desmontar a composição. */
@media (max-width: 900px) {
  .hero {
    grid-template-columns: 1fr;
    gap: 32px;
    padding-top: 112px;
    text-align: center;
  }

  .hero-actions {
    justify-content: center;
  }

  .hero-image {
    max-width: 360px;
    margin: 0 auto;
  }
}

/* Hero no celular: textos menores, botões empilháveis e menos espaço vertical. */
@media (max-width: 560px) {
  .hero {
    min-height: auto;
    padding-top: 96px;
    padding-bottom: 48px;
  }

  .hero h1 {
    font-size: 2.25rem;
    line-height: 1.1;
  }

  .hero p {
    font-size: 1rem;
  }

  .hero-actions {
    flex-direction: column;
    align-items: stretch;
  }
}

Observe que não mudamos o HTML. A mesma estrutura continua funcionando, mas o CSS reorganiza a apresentação conforme o espaço disponível.

Adaptando grids e cards

Cards de habilidades e projetos ficam bons em três colunas no desktop, mas precisam reduzir para duas colunas no tablet e uma coluna no celular.

style.css
/* Tablet: reduz grids para duas colunas quando três colunas começam a apertar. */
@media (max-width: 900px) {
  .skills-grid,
  .projects-grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

/* Celular: cada card ocupa uma linha para leitura mais limpa. */
@media (max-width: 640px) {
  .skills-grid,
  .projects-grid,
  .about-grid {
    grid-template-columns: 1fr;
  }

  .card,
  .project-card {
    padding: 20px;
  }
}

O minmax(0, 1fr) ajuda a evitar que textos longos empurrem o grid para fora da tela. Esse detalhe é simples, mas resolve muitos layouts quebrados.

Ajustando seções, contato e rodapé

Além da hero e dos cards, revise espaçamentos gerais. Em telas menores, seções muito altas fazem o usuário rolar demais antes de chegar ao conteúdo.

style.css
/* Espaçamentos menores: deixa a página mais direta em telas pequenas. */
@media (max-width: 640px) {
  section {
    padding: 56px 0;
  }

  .section-title {
    font-size: 1.85rem;
  }

  .contact-box {
    padding: 24px;
  }

  .footer-content {
    flex-direction: column;
    gap: 12px;
    text-align: center;
  }
}

A ideia não é deixar tudo pequeno demais. O objetivo é tirar excessos de altura, manter leitura confortável e fazer botões e links continuarem fáceis de tocar.

CSS completo desta etapa

Abaixo está um bloco completo de responsividade para adicionar no final do style.css. Colocar no final ajuda essas regras a sobrescreverem os estilos de desktop quando a tela for menor.

style.css
/* Base responsiva: evita barra lateral e deixa mídias fluírem dentro da tela. */
html {
  scroll-behavior: smooth;
}

body {
  overflow-x: hidden;
}

img {
  display: block;
  max-width: 100%;
  height: auto;
}

.container {
  width: min(1120px, calc(100% - 32px));
  margin: 0 auto;
}

/* Tablet: reorganiza hero e grids quando o espaço horizontal fica menor. */
@media (max-width: 900px) {
  .hero {
    grid-template-columns: 1fr;
    gap: 32px;
    padding-top: 112px;
    text-align: center;
  }

  .hero-actions {
    justify-content: center;
  }

  .hero-image {
    max-width: 360px;
    margin: 0 auto;
  }

  .skills-grid,
  .projects-grid {
    grid-template-columns: repeat(2, minmax(0, 1fr));
  }
}

/* Menu mobile: transforma a navegação em painel vertical controlado pelo JavaScript. */
@media (max-width: 768px) {
  .hamburger {
    display: flex;
  }

  .nav-links {
    position: absolute;
    top: 72px;
    left: 16px;
    right: 16px;
    display: none;
    flex-direction: column;
    gap: 12px;
    padding: 16px;
    border: 1px solid var(--border);
    border-radius: 16px;
    background: var(--surface);
    box-shadow: var(--shadow);
  }

  .nav-links.active {
    display: flex;
  }

  .nav-links a {
    width: 100%;
    padding: 10px 12px;
  }
}

/* Celular: reduz alturas, empilha cards e mantém botões confortáveis para toque. */
@media (max-width: 640px) {
  section {
    padding: 56px 0;
  }

  .section-title {
    font-size: 1.85rem;
  }

  .skills-grid,
  .projects-grid,
  .about-grid {
    grid-template-columns: 1fr;
  }

  .card,
  .project-card,
  .contact-box {
    padding: 20px;
  }

  .footer-content {
    flex-direction: column;
    gap: 12px;
    text-align: center;
  }
}

/* Celular pequeno: simplifica a hero para leitura rápida e botões em largura total. */
@media (max-width: 560px) {
  .hero {
    min-height: auto;
    padding-top: 96px;
    padding-bottom: 48px;
  }

  .hero h1 {
    font-size: 2.25rem;
    line-height: 1.1;
  }

  .hero p {
    font-size: 1rem;
  }

  .hero-actions {
    flex-direction: column;
    align-items: stretch;
  }
}

Próximo passo da trilha

Agora o portfólio já tem estrutura, visual, interações e responsividade inicial. A próxima parte é transformar o modelo genérico em um portfólio seu, com textos, links e projetos reais.

A Parte 5 está disponível na URL /projetos/portfolio-personalizar-conteudo. Nela, vamos trocar conteúdos genéricos e inserir links de GitHub, LinkedIn, e-mail, currículo, projetos publicados e repositórios.

Fontes utilizadas