Evite armadilhas que derrubam a experiência no celular. Veja problemas típicos e correções rápidas em HTML/CSS/JS focadas em velocidade, legibilidade e toques precisos.Nesse artigo você verá:
- Viewport e zoom quebrados
- Alvos de toque pequenos
- Tipografia e linhas longas
- Espaços e ritmo inconsistente
- Navegação confusa e menus
- Imagens pesadas e sem responsividade
- Formulários difíceis de usar
- Gestos, estados e acessibilidade
- Performance e bloqueios
- FAQ
Erro: Viewport e zoom quebrados
Layout “vaza” ou fica minúsculo. Usuário precisa dar zoom o tempo todo.
Como corrigir
<!-- Use meta viewport correto. Evite desativar zoom -->
<meta name="viewport" content="width=device-width, initial-scale=1">
/* Evite larguras fixas em px para containers críticos */
.container{ max-width: 100%; width: min(92vw, 72ch); margin-inline:auto; }
Erro: Alvos de toque pequenos
Botões e links com área de toque reduzida causam toques errados.
Como corrigir
.btn, .link-touch{ min-height:44px; min-width:44px; padding:12px 16px; }
.btn:focus-visible, .link-touch:focus-visible{ outline:2px solid #93c5fd; outline-offset:3px; }
<button class="btn" aria-label="Abrir menu">Menu</button>
Erro: Tipografia pequena e linhas longas
Texto cansativo e difícil de ler em telas estreitas.
Como corrigir
:root{ --maxw: 68ch; }
body{ font: 16px/1.65 system-ui, -apple-system, Segoe UI, Roboto, sans-serif; color:#111827; }
p{ max-width: var(--maxw); margin: 0 0 12px; }
h1{ font-size:clamp(1.6rem, 5vw, 2.2rem); line-height:1.2; }
Erro: Espaços e ritmo inconsistente
Seções apertadas ou sobrando espaço sem lógica.
Como corrigir
:root{
--s-1:8px; --s-2:12px; --s-3:16px; --s-4:20px; --s-5:24px; --s-6:32px;
}
.section{ padding-block: var(--s-6); }
.stack > * + *{ margin-block-start: var(--s-3); }
Erro: Navegação confusa e menus pesados
Hambúrguer sem rótulo. Overlay que “trava” a rolagem.
Como corrigir
<button class="btn menu-toggle" aria-expanded="false" aria-controls="menu" aria-label="Abrir navegação">Menu</button>
<nav id="menu" hidden>...</nav>
const t=document.querySelector('.menu-toggle'), m=document.getElementById('menu');
t.addEventListener('click', ()=>{
const open = t.getAttribute('aria-expanded')==='true';
t.setAttribute('aria-expanded', String(!open));
m.hidden = open;
document.body.style.overflow = open ? '' : 'hidden'; // evita rolagem do fundo
});
Erro: Imagens pesadas e sem responsividade
PageSpeed despenca. Consumo de dados aumenta.
Como corrigir
<picture>
<source srcset="banner-800.webp 800w, banner-1200.webp 1200w" type="image/webp">
<img src="banner-1200.jpg" alt="Painel do serviço" width="1200" height="600"
loading="lazy" decoding="async" sizes="(max-width:600px) 92vw, 1200px">
</picture>
img{ max-width:100%; height:auto; border-radius:12px; }
Erro: Formulários difíceis de usar
Teclados errados, rótulos ausentes, botões minúsculos.
Como corrigir
<label for="tel">Telefone</label>
<input id="tel" name="tel" inputmode="tel" autocomplete="tel" placeholder="(11) 99999-9999">
<label for="email">Email</label>
<input id="email" type="email" inputmode="email" autocomplete="email" placeholder="voce@exemplo.com">
<button class="btn" type="submit">Enviar</button>
input, select, textarea{ font-size:16px; padding:12px; border-radius:10px; border:1px solid #e5e7eb; width:100%; }
label{ display:block; margin:10px 0 6px; font-weight:600; }
Erro: Gestos obscuros e falta de estados
Componentes sem foco/hover/ativo. Gestos que o usuário não descobre.
Como corrigir
.btn{ transition: transform .12s ease, filter .12s ease; }
.btn:hover{ filter:brightness(.95); }
.btn:active{ transform:translateY(1px); }
.btn:focus-visible{ outline:2px solid #93c5fd; outline-offset:3px; }
Evite depender de “swipe oculto”. Mostre setas, dicas ou microcopy.
Erro: Scripts bloqueando a renderização
JS pesado no head. CSS gigante sem divisão crítica.
Como corrigir
<!-- Carregue JS de forma não bloqueante -->
<script src="app.js" defer></script>
<!-- CSS crítico inline (pequeno) + restante por arquivo -->
<link rel="preload" href="fonts/Inter.woff2" as="font" type="font/woff2" crossorigin>
// Evite trabalho desnecessário no scroll
let ticking=false;
window.addEventListener('scroll', ()=>{
if(!ticking){
window.requestAnimationFrame(()=>{ /* faça algo leve */ ticking=false; });
ticking=true;
}
});
Checklist rápido de erros
- Sem meta viewport correto.
- Toque < 44×44px.
- Fonte < 16px e linhas longas.
- Sem contraste e foco visível.
- Imagens sem
srcset/sizese semloading="lazy". - Menu sem ARIA e sem rótulo.
- Inputs sem
inputmodeeautocomplete. - JS bloqueando primeira pintura.
Perguntas Frequentes (FAQ)
Qual o tamanho mínimo de alvo de toque?
Recomende 44×44px. Isso reduz erros e aumenta conforto. Qual a fonte ideal no mobile?
Comece em 16px. Ajuste com clamp e line-height entre 1.5 e 1.8. Posso desativar o zoom no mobile?
Não é recomendado. Acessibilidade exige permitir zoom. Imagens WebP resolvem tudo?
Não. Use também srcset, sizes e lazy load. Devo usar ícones sem texto no menu?
Evite. Adicione rótulo ou aria-label claro.Tags:
- Mobile First
- UX
- UI
- Acessibilidade
- Viewport
- Tipografia
- Alvo de Toque
- Menus Mobile
- Imagens Responsivas
- Formulários
- Performance Web
- Lazy Load
- Srcset
- ARIA
- Design Responsivo
“É necessário construir frases curtas. Toda otimização dividirá em, no mínimo, duas frases.”









