CSS: line-clamp a controlar linhas de texto sem JavaScript desde 2010

CSSCLAMP_000.jpg

O artigo de hoje surge em parte no seguimento do artigo sobre o CSS: clamp(), porque inicialmente fiz confusão entre ambos.
Foi precisamente ao tentar mostrar o que o line-clamp faz que me apercebi de que, apesar de ambas as propriedades terem nomes semelhantes, servem propósitos completamente diferentes.

Provavelmente por causa do nome semelhante, não sou o único a confundir o clamp() com o line-clamp.
A verdade é que ambos aparecem frequentemente em artigos sobre design responsivo e interfaces modernas, o que torna a confusão ainda mais comum.

Mas, na realidade, fazem coisas bastante diferentes.
O clamp(), como mostrei no artigo que lhe dediquei, serve para limitar valores fluidos entre um mínimo e um máximo:

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

Neste exemplo, o tamanho do texto adapta-se ao ecrã através de 2vw, mas nunca ficará menor do que 16px nem maior do que 32px.

Já o line-clamp é usado para limitar a quantidade de linhas de texto visíveis:

display: -webkit-box;
-webkit-line-clamp: 3;
-webkit-box-orient: vertical;
overflow: hidden;

Ou seja, em vez de controlar o tamanho do texto, o line-clamp controla quanto espaço o texto pode ocupar dentro do elemento.

E embora possa parecer um pequeno detalhe, isso torna-se extremamente útil em:

  • cartões
  • grelhas responsivas
  • pré-visualizações de artigos
  • listas de produtos
  • caixas de texto
  • layouts modernos
  • interfaces adaptadas ao telemóvel
  • conteúdo criado pelo utilizador
  • ...etc...

Basicamente, sempre que existe texto variável e queremos evitar que um elemento fique maior do que os restantes.

Mas o melhor de tudo?
O clamp() e o line-clamp funcionam muito bem juntos.

Tão bem que hoje em dia é bastante comum combinar ambos no mesmo elemento:

.card-title {
  font-size: clamp(1rem, 2vw, 2rem);

display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
overflow: hidden;
} 

Como este exemplo demonstra, o clamp() torna o tamanho do texto responsivo, enquanto o line-clamp impede que o título ocupe linhas em excesso.

Ou seja, um controla o tamanho do texto e o outro controla o espaço que ele ocupa.

Na prática, isto ajuda bastante a manter cartões alinhados, especialmente em grelhas responsivas onde títulos maiores poderiam destruir o equilíbrio visual do layout.

A sintaxe do line-clamp é a seguinte:

-webkit-line-clamp: none | integer | initial | inherit

No entanto, se repararem bem nos exemplos acima, está incluído o prefixo do fornecedor: -webkit-line-clamp.

Isso acontece porque a implementação mais utilizada continua dependente das antigas propriedades do WebKit, funcionando apenas em conjunto com:

display: -webkit-box;
-webkit-box-orient: vertical;

Apesar destas propriedades com prefixo serem consideradas obsoletas, esta combinação faz actualmente parte da especificação e continua amplamente suportada pelos navegadores modernos.

Aliás, é um daqueles casos curiosos da Web moderna onde uma solução antiga acabou por se tornar o comportamento padrão na prática.

Na maioria dos casos, também irá querer definir overflow como hidden; caso contrário, o conteúdo poderá continuar visível apesar do truncamento.

Dependendo do navegador e do conteúdo, o corte do texto pode acontecer a meio de uma palavra e não necessariamente no final da frase.

Mas podem perguntar: então o text-overflow não faz já isso?

Bem... faz, mas apenas para texto numa única linha.

white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;

O clássico trio acima funciona muito bem para menus, botões ou títulos pequenos, mas deixa de ser suficiente quando queremos limitar múltiplas linhas de texto.

Com o line-clamp, em conjunto com -webkit-box-orient: vertical; e -webkit-line-clamp: 2;, podemos escolher exactamente em que linha o texto será cortado.

Se alguma vez tiveste de limitar o número de linhas de um elemento sem recorrer ao JavaScript, a propriedade CSS line-clamp é provavelmente o que procuras.

Mas vamos a um exemplo prático, onde podes ver o line-clamp em acção e podes até escolher onde o texto vai ser truncado:

Demonstração interactiva do line-clamp
Escolhe o número de linhas

CSS

.clamp-demo {
  display: -webkit-box;
  -webkit-line-clamp: none;
  -webkit-box-orient: vertical;
  overflow: hidden;
}

Demonstração

O CSS moderno inclui várias ferramentas pouco conhecidas que podem simplificar bastante a criação de interfaces responsivas sem necessidade de JavaScript ou bibliotecas adicionais.
Embora pareça uma pequena funcionalidade de CSS, o line-clamp pode fazer uma enorme diferença em layouts modernos.
Um único título demasiado grande consegue destruir completamente o equilíbrio visual de uma grelha responsiva.
Especialmente em dispositivos móveis, onde o espaço disponível é mais reduzido.
O line-clamp permite limitar automaticamente a quantidade de linhas visíveis num bloco de texto sem recorrer a JavaScript.
Isto é especialmente útil em cartões, pré-visualizações de artigos, interfaces responsivas e layouts modernos onde diferentes quantidades de texto poderiam facilmente destruir o alinhamento visual da página.

Se o corte acontecer imediatamente após um sinal de pontuação, as reticências [...] adicionadas pelo navegador continuam a aparecer, originando casos como ...., !... ou ?....

É uma solução simples, prática e extremamente útil para controlar conteúdo criado pelo utilizador, manter cartões alinhados, evitar que o texto destrua o layout ou simplesmente tornar interfaces mais limpas e consistentes.

E embora seja uma propriedade relativamente simples, é também um daqueles pequenos detalhes que ajudam um site a parecer mais moderno, organizado e profissional.

Porque no design responsivo, por vezes não é apenas o tamanho do texto que importa...
mas também o espaço que ele ocupa.

Compatibilidade actual

Felizmente, o suporte é bastante bom em navegadores como:

line-clamp
Chrome
✓ 6
Edge
✓ 17
Firefox
✓ 68
Opera
✓ 15
Safari
✓ 5
Chrome Android
✓ 18
Firefox Android
✓ 68
Opera Android
✓ 14
Safari iOS
✓ 4.2
Samsung Internet
✓ 1
WebView Android
✓ 4.4
WebView iOS
✓ 4.2
none
✕ Não
✕ Não
✓ 68
✕ Não
✓ 18.2
✕ Não
✓ 68
✕ Não
✓ 18.2
✕ Não
✕ Não
✓ 18.2
line-clamp
Chrome
✓ 6
Edge
✓ 17
Firefox
✓ 68
Opera
✓ 15
Safari
✓ 5
none
✕ Não
✕ Não
✓ 68
✕ Não
✓ 18.2
line-clamp
Chrome Android
✓ 18
Firefox Android
✓ 68
Opera Android
✓ 14
Safari iOS
✓ 4.2
Samsung Internet
✓ 1
WebView Android
✓ 4.4
WebView iOS
✓ 4.2
none
✕ Não
✓ 68
✕ Não
✓ 18.2
✕ Não
✕ Não
✓ 18.2

Como podem ver, o suporte do line-clamp nos navegadores modernos já é bastante sólido.
No entanto, alguns valores como none ainda podem apresentar comportamentos inconsistentes em certos browsers devido à antiga implementação baseada em -webkit-line-clamp.

Ligações úteis

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.