CSS: clamp() um pequeno passo silencioso no CSS, mas um grande salto para o design responsivo

CSSCLAMP_000.jpg

Durante muitos anos, tornar um blogue responsivo significava andar constantemente a lutar com media queries, tamanhos fixos e infinitos ajustes para diferentes resoluções.
Funcionava… mas rapidamente o CSS transformava-se numa pequena dor de cabeça que só aumentava à medida que mais coisas se acrescentavam.

Entretanto, o CSS moderno começou lentamente a mudar, a evoluir e a ficar mais inteligente, e uma das funcionalidades mais interessantes que apareceu nos últimos anos foi o clamp().

À primeira vista parece apenas mais uma função do CSS.
Na prática, tornou-se uma das ferramentas mais úteis para criar modelos fluidos, modernos e adaptáveis sem complicações desnecessárias.

Afinal, o que é o clamp()?

O clamp() permite definir um valor flexível dentro de limites mínimos e máximos.
A sintaxe é bastante simples:

clamp(valor_mínimo, valor_preferido, valor_máximo)

Por exemplo, para ter uma fonte de tamanho adaptável:

  font-size: clamp(16px, 2vw, 32px);
  

Isto significa que:

  • o texto nunca ficará abaixo de 16px (valor mínimo)
  • aumenta de forma responsiva usando 2vw (significa que o tamanho da fonte se ajusta automaticamente com base em 2% da largura do ecrã)
  • mas nunca ultrapassa 32px (valor máximo)

Porque o clamp() foi quase como uma pequena revolução?

Antes do clamp(), o método mais comum para atingir o mesmo resultado era algo do género:

h1 {
  font-size: 48px;
}

@media (max-width: 768px) {
  h1 {
    font-size: 24px;
  }
}
  

Nada de errado com isto.
Aliás, durante anos foi exactamente assim que a maioria da malta fez.
O problema era que:

  • o CSS crescia rapidamente
  • havia demasiadas media queries
  • as mudanças podiam parecer bruscas
  • pequenos ajustes tornavam-se irritantes

Com clamp(), a transição passou a ser gradual e automática.

Tipografia fluída, ou a prática de tornar o texto adaptável:

Um dos usos mais populares do clamp() é na tipografia.
Por exemplo:

h1 {
  font-size: clamp(2rem, 5vw, 5rem);
}
  

Neste caso:

  • em telemóveis o título mantém-se legível
  • em tablets cresce naturalmente
  • em monitores grandes ganha mais impacto visual
  • mas sem exageros absurdos

E isto é algo importante.
Hoje em dia existem ecrãs gigantescos onde um título sem limites pode tornar-se ridiculamente enorme.

Adeus a muitos ajustes manuais

O clamp() também funciona muito bem em:

  • margens
  • paddings
  • larguras
  • espaçamentos
  • grelhas
  • botões
  • imagens

Por exemplo:

.container {
  width: clamp(300px, 80vw, 1200px);
}
  

Aqui os elementos com a class="container" adaptam-se ao tamanho do ecrã mas evita extremos desconfortáveis.

O CSS cresceu e tornou-se mais elegante

Uma das coisas que acho mais interessantes no CSS moderno, e que há muito esperava, é que muitas funcionalidades começaram finalmente a reduzir a dependência do JavaScript para pequenos ajustes visuais.
Durante anos, os mais simples efeitos “inteligentes” exigiam:

  • scripts
  • cálculos
  • bibliotecas externas
  • soluções improvisadas

Hoje, com o próprio CSS já se consegue resolver muita coisa sem depender de outros códigos.
O clamp() faz parte dessa evolução silenciosa.

O trio moderno: min(), max() e clamp()

O clamp() pertence a uma pequena família de funções muito úteis.

  1. min()
    Escolhe o menor valor:

    width: min(90vw, 800px);
      
  2. max()
    Escolhe o maior:

    width: max(300px, 50vw);
      
  3. clamp()
    Combina ambos:

    width: clamp(300px, 50vw, 800px);
      

Compatibilidade actual

Felizmente, o suporte é bastante bom em navegadores como:

clamp()
Chrome
79
Edge
79
Firefox
75
Opera
66
Safari
13.1
Chrome Android
141
Firefox Android
143
Opera Android
80
Safari iOS
13.4
Samsung Internet
12
WebView Android
141
WebView iOS
13.4
clamp()
Edge
79
Firefox
75
Opera
66
Safari
13.1
clamp()
Chrome Android
141
Firefox Android
143
Opera Android
80
Safari iOS
13.4
Samsung Internet
12
WebView Android
141
WebView iOS
13.4

O que significa que actualmente já pode ser usado com relativa tranquilidade em projectos normais.

Uma das melhores partes: menos complicação

Talvez a maior vantagem do clamp() seja a simplificação do código.
E isso conta muito.

Quem mexe em CSS há muitos anos sabe bem como certas folhas de estilo acabam lentamente se transformando em autênticos monstros cheios de excepções, correcções e remendos acumulados ao longo do tempo.
O clamp() não resolve tudo… mas ajuda bastante.

Um exemplo prático

DEMONSTRAÇÃO:

<h1 class="titulo_artigo">Um teste responsivo básico</h1>
        
<div class="conteudo_artigo">
  <p>
    Lorem ipsum dolor sit amet, consectetur adipiscing elit. In orci orci, eleifend id risus nec, mattis rutrum velit. Suspendisse fringilla egestas erat eu convallis. <br>
    Phasellus eu velit ut magna dapibus elementum cursus at ligula.<br>
    Ut tempus varius nibh, nec auctor sapien iaculis sit amet.
  </p>
  
  <p>
    Fusce iaculis,libero quis elementum viverra, nulla ante accumsan lectus, sit amet convallis lacus ipsum vel est. <br>
    Curabitur et urna non est consectetur pulvinar vel id risus. Ut vestibulum, sem in semper aliquet, felis arcu euismod sapien, ac imperdiet massa nisl quis sem. <br>
    Vestibulum ac elementum felis, in tempor velit.<br>
    Pellentesque purus ex, mattis at ornare quis, porta condimentum mi. Donec vestibulum ligula vel nulla blandit, quis euismod nulla vestibulum.<br>
    Suspendisse potenti. Nunc neque mauris, tempor sed facilisis at, ultrices eget nulla. Pellentesque convallis ante nec augue porttitor, id tempus ante luctus.
  </p>
</div>
.titulo_artigo {
  letter-spacing: 2px;  
  line-height: 1.15;
  font-size: clamp(1.08rem, 2.5vw, 2.18rem);
  margin-bottom: clamp(1rem, 1.5vw, 2rem);
}
.conteudo_artigo p {
  line-height: 1.5;
  font-size: clamp(0.51rem, 0.95rem + 0.3vw, 1.1rem);
}
 
     /* ESTE EXEMPLO NÃO TEM JAVASCRIPT */
 
Resultado

Um teste responsivo básico

Lorem ipsum dolor sit amet, consectetur adipiscing elit. In orci orci, eleifend id risus nec, mattis rutrum velit. Suspendisse fringilla egestas erat eu convallis.
Phasellus eu velit ut magna dapibus elementum cursus at ligula.
Ut tempus varius nibh, nec auctor sapien iaculis sit amet.

Fusce iaculis,libero quis elementum viverra, nulla ante accumsan lectus, sit amet convallis lacus ipsum vel est.
Curabitur et urna non est consectetur pulvinar vel id risus. Ut vestibulum, sem in semper aliquet, felis arcu euismod sapien, ac imperdiet massa nisl quis sem.
Vestibulum ac elementum felis, in tempor velit.
Pellentesque purus ex, mattis at ornare quis, porta condimentum mi. Donec vestibulum ligula vel nulla blandit, quis euismod nulla vestibulum.
Suspendisse potenti. Nunc neque mauris, tempor sed facilisis at, ultrices eget nulla. Pellentesque convallis ante nec augue porttitor, id tempus ante luctus.

Com apenas algumas linhas já é possível criar uma experiência muito mais fluída entre telemóveis, tablets e computadores.

Considerações finais

O mais curioso no clamp() é que não parece uma funcionalidade “espectacular”.
Não tem animações impressionantes, nem efeitos visuais chamativos.

Mas é exactamente o tipo de melhoria que torna o desenvolvimento web mais limpo, mais lógico e menos frustrante.
E talvez seja por isso que tanta gente passou a adoptá-lo rapidamente.

Por vezes, as melhores evoluções são precisamente aquelas que simplificam o que antes era desnecessariamente complicado.

E por hoje é tudo. 8)

Até Breve. :-F

Comentários

Malta, comentem, tanto críticas como elogios serão bem-vindos. E eu respondo, não prometo quando mas respondo.

Mas antes de comentarem, leiam as minhas Regras dos Comentários.

Se quiserem deixar o link para o vosso sitio, utilizar alguns estilos ou até inserir videos ou imagens nos comentários DEVEM mesmo ler as indicações nas Regras dos Comentários.

Caso prefiras comentar numa nova janela, ou se o formulário abaixo estiver nos dias ruins, podes clicar aqui.