Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Web Design
  2. Typography
Webdesign

Entendendo a Pontuação Deslocada

by
Length:LongLanguages:
This post is part of a series called A-Z of Web Typography.
Taking the “Erm..” Out of Ems
A Beginner’s Guide to Pairing Fonts

Portuguese (Português) translation by Erick Patrick (you can also view the original English article)

A Pontuação Deslocada é uma ferramenta tipográfica poderosa para a criação de corpos de texto opticamente alinhados. Infelizmente, ela foi renegada pela web… até agora. Veremos o valor da pontuação deslocada e como você pode implementá-la parcialmente, usando um pouco de JavaScript e uma regra de CSS que existe há anos.

Pontuação Deslocada: O Básico

Quando Gutenberg estava criando sua Bíblia, por volta de 1400, ele desenvolveu um estilo de composição de sinais de pontuação que perdura até hoje, chamada de “Pontuação Deslocada” (também conhecida como alinhamento ótico).

O Que É Pontuação Deslocada?

Pontuação deslocada é um método de configurar os sinais de pontuação fora das margens do corpo do texto. Isso cria a aparência de bordas uniformes no texto e permite um fluxo ótico melhor.

A pontuação deslocada impacta na forma que você percebe o traçado do texto em uma página.

Onde A Pontuação Deslocada Acontece

Pontuação deslocada acontece nas margens, fora do alinhamento do resto do texto. Você pode deslocar a pontuação em textos alinhados à esquerda, direta ou justificados.

Por Que Deslocamos a Pontuação?

A teoria do porque deslocar a pontuação ser importante, é mais ou menos assim:

Os sinais de pontuação no texto só ocupam uma parte da altura das (letras) maiúsculas. Geralmente, isso não é um problema, mas, quando o sinal de pontuação é o primeiro caractere na parte reta da lateral do corpo de um texto, ele consome uma quantidade considerável de espaçamento vertical, o que pode atrapalhar o fluxo visual do corpo de texto.

A pontuação deslocada acaba com isso. Naturalmente, alguns sinais acabam na lateral de um texto. Ao invés de deixá-los ali, atrapalhando o fluxo ótico do texto, o tipógrafo alivia essa ruptura, deslocando os sinais de pontuação para as margens.

Quais Sinais de Pontuação Podem Ser Alinhados Oticamente?

Como os sinais de pontuação aliviam as rupturas causadas pelos sinais de pontuação de versaletes (small caps), tem-se que, geralmente, deve-se deslocar esses sinais de pontuação, como as aspas simples e duplas (” “ ’ ‘) e hifens (– —). Você deveria evitar deslocar pontuações de altura completa, como o ponto de exclamação (!) e o de interrogação (?).

Pontuação Deslocada: Impressa e na Web

O suporte a pontuação deslocada já existe em programas de publicação para computadores há um tempo, como no Adobe InDesign. O InDesign provê ótimas ferramentas para pontuação deslocada em corpos de texto. Claro, isso é ótimo para quem trabalha com aplicativos de publicação impressa, mas como ficam os designers para web?

O problema em se aplicar a pontuação deslocada na web é que tudo nela se baseia em caixas. As regras de estilização no CSS usam o “modelo de caixa” que envolve todos os elementos HTML em caixas. Essas caixas possuem margens, bordas, espaçamento interno e conteúdo.

Por padrão, todos os caracteres ficam dentro de uma caixa. Pontuação deslocada, por outro lado, requer que os caracteres estejam fora da caixa. Isso tem sido um grande problema para se resolver com programas, assim, a implementação desse truque da pontuação deslocada tem sido ignorada na web, pelos projetistas e pelos criadores de navegadores. Mark Boulton afirma que é uma vergonha que esse aspecto tão importante da composição tipográfica venha sendo relegado.

Pontuação Deslocada e a Especificação

Pode até surpreender você, mas a pontuação deslocada faz parte do módulo de texto do CSS3. A propriedade da pontuação deslocada, contudo, está marcada como opcional, contribuindo para a sua não implementação. Na verdade, se não for implementada, essa propriedade “corre o risco de ser removida da especificação durante o período de revisão (CR) devido a não existência de implementações (corretas)”.

Uma vez que os navegadores não implementaram essa propriedade ainda, não entraremos em maiores detalhes sobre a propriedade hanging-punctuation. Contudo, se você estiver curioso, pode ler a especificação ou a visão geral do Chris Coyer para o CSS Tricks.

Sinais de Pontuação para Deslocamento

Há um pouco de informação interessante que podemos pegar da especificação. Ela detalha quais sinais de pontuação deveriam ser deslocados:

U+002C , Vírgula
U+002E . Ponto Final
U+060C ، Vírgula Arábica
U+06D4 ۔ Ponto Final Arábico
U+3001 Vírgula Ideográfica
U+3002 Ponto Final Ideográfico
U+FF0C Vírgula de Largura Completa
U+FF0E Ponto Final de Largura Completa
U+FE50 Vírgula Pequena
U+FE51 Vírgula Pequena Ideográfica
U+FE52 Ponto Final Pequeno
U+FF61 Ponto Final Ideográfico de Meia Largura
U+FF64 Vírgula Ideográfica de Meia Largura

A especificação ainda diz que outros caracteres podem ser deslocados, se necessário, o que é bom, uma vez que essa lista não é final. Por exemplo, a especificação não menciona travessões, os quais a tipografia tradicional costuma deslocar.

Como recomendado em The Recovering Physicist, é muito provável que os idiomas ocidentais tradicionais só desloquem os seguintes sinais de pontuação:

Código do Sinal Caractere Nome Entidade HTML Categoria Unicode
U+00AB « Aspa Angular Dupla para a Esquerda « Pi
U+00BB » Aspa Angular Dupla para a Direita » Pf
U+2018 Aspa Simples a Direita ’ Pi
U+2018 Aspa Simples a Esquerda ‘ Pf
U+201C Aspas Duplas a Esquerda “ Pi
U+201D Aspas Duplas a Direita ” Pf
U+2039 Aspa Angular Simples para a Esquerda ‹ Pi
U+203A Aspa Angular Simples para a Direita › Pf
U+2010 Hífen ‐ PD
U+2013 Meia Risca – PD
U+2014 Travessão — PD

Para idiomas ocidentais, sinais de pontuação como travessão, pontos, vírgulas, dois pontos, ponto e vírgula, etc, são, geralmente, deslocados à direita da margem, uma vez que eles, normalmente, não começam parágrafos ou aparecem na margem esquerda.

Trazendo A Pontuação Deslocada Para a Web

Idealmente, você deslocaria todas os sinais de pontuação qualificados que estivessem em um parágrafo de texto, mas estamos falando da web. O suporte incompleto ao CSS dificulta a implementação do deslocamento em textos alinhados à esquerda, direita e a textos justificados.

Pode ser mais fácil aplicar a pontuação deslocada em uma única margem. Por exemplo, na margem esquerda para textos alinhados à esquerda. Elementos do tipo bloco, como as tags <blockquote>, <p>, <h1> até o <h5> que comecem com sinais de pontuação qualificados, podem usar valores negativos para text-indent para deslocar a pontuação.

É interessante notar que a pontuação deslocada usando valores negativos para text-indent só permitirá deslocar sinais no começo do parágrafo. Por conta do refluxo do texto na web por contas dos variados tamanhos de tela, você nunca saberá onde sinais de pontuação ficarão. O sinal de pontuação inicial é a única pontuação que você pode ter certeza.

Em relação a esse tipo de situação, explorar as possibilidades de deslocamento da pontuação inicial pode ainda ser valioso. É uma escolha tipográfica que você, como designer pode fazer.

Veremos nesse tutorial como deslocar uma pontuação inicial nos textos ocidentais tradicionais alinhados a esquerda. Lembre-se que o código é maleável. Você pode pegar os exemplos nesse tutorial e modificá-los para adequar-se a qualquer necessidade que tiver. Tomara que, no futuro, os navegadores tenham uma forma melhor de resolver esse problema de sinais de pontuação deslocados.

Passo 1: Visão Geral Rápida

A ideia por traz da implementação da pontuação deslocada para texto alinhado a esquerda é bem simples. Use o JavaScript para encontrar todos os elementos da DOM elegíveis, isso é, que comecem com um sinal de pontuação passível de deslocamento. Quando encontrado, aplique uma classe HTML com valor negativo de text-indent ao elemento em questão.

Passo 2: Examine O Código

Vejamos um exemplo básico de código usado em um artigo simples de blog. O texto do artigo estaria disposto em títulos, subtítulos, listas e citações, todos como elementos parentes, dessa forma:

Seu código pode e variará disso, que, no caso, você pode alterar depois para ajustar o JavaScript para encontrar os elementos DOM de acordo com seu código. Para esse tutorial, usaremos esse código.

Para deslocar a pontuação inicial dentro do bloco de texto, devemos primeiro delimitar quais sinais de pontuação podem ser deslocados, os quais analisamos anteriormente nesse tutorial. É importante lembrar que idiomas diferentes usam aspas (e pontuação) de formas bem diferentes. Por exemplo, vejam como o inglês e o galês usam aspas primárias e secundárias:

  • Inglês: Falei para o João, “O Marcos uma vez disse, ‘Se disser a verdade, não terá de lembrar de qualquer coisa.’”
  • Galês: Falei para o João, ‘O Marcos uma vez disse, “Se disser a verdade, não terá de lembrar de qualquer coisa.”’

Percebeu como são totalmente opostos? Essas diferenças são apenas o começo. Veja esses exemplos de uso de aspas primárias e secundárias em vários idiomas (você pode ver uma compilação completa na Wikipedia):

Idioma Primária Secundária
Inglês “…” ‘…’
Galês ‘…’ “…”
Croácio „…” ‚…’
Alemão „…“ ‚…‘
Grego «…» “…”
Francês «…» ‹…›

É interessante saber dessas diferenças, caso tenha de trabalhar com idiomas além do inglês ocidental. Assim saberá o que e como deslocar.

Passo 3: Preparando o CSS

Agora já temos um mínimo de código para nosso layout. Usaremos o JavaScript para analisar cada um dos objetos da DOM e encontrar aqueles que iniciam com pontuação passível de deslocamento. Para esses, aplicaremos uma classe HTML que possui uma regra de text-indent com valor negativo, que irá deslocar a pontuação para a margem esquerda.

A parte complicada começa na definição do valor para a regra text-indent. Fontes diferentes requerem valores diferentes, logo, isso requererá bastante teste e customização da sua parte. Por exemplo, uma aspa dupla inteligente (“) tem largura maior que a aspa simples inteligente (‘). Assim, se você tiver de deslocar a pontuação, o elemento da DOM que iniciar com uma aspa dupla precisará ter um valor maior para a regra text-indent que um elemento DOM começando com uma aspa simples.

Uma Nota Sobre Fontes

Não apenas o valor do text-indent será diferente dependendo do sinal de pontuação que você tiver de deslocar, também dependerá da fonte que você escolher usar. Claro, estamos falando da web, e você pode nunca ter certeza que um usuário terá uma fonte em questão. Contudo, fontes tradicionais para a web são ubíquas, enquanto as fontes não tradicionais possuem meios alternativos e garantidos de entrega aos clientes. De qualquer forma, você pode chegar bem próximo de ter certeza que todos usam a mesma fonte.

Qualquer fonte ou conjunto de fonte que usar, é interessante testar valores de text-indent com ela (e, preferivelmente, em vários tamanhos). Isso garante que suas pontuações deslocadas alinharão corretamente.

Classes de Pontuação Deslocada

Assumindo que todos os elementos de nosso artigo usam a mesma fonte, podemos configurar três classes de larguras: small (pequena), medium (média), e large (grande). Dependendo do tipo de pontuação que o parágrafo começar, nosso JavaScript aplicará uma dessas três classes ao elemento da DOM, criando, dessa forma, a pontuação deslocada!

Perceba que estamos usando valores de medida em em. Isso garante que o text-indent sempre será relativo ao valor de font-size do texto do artigo. Assim, se a fonte aumentar, você não terá de alterar os valores de text-indent.

Classes de Pontuação Deslocada: Duas Fontes

E se estiver usando duas fontes diferentes em seu layout? Nesse exemplo, os elementos de texto do corpo (<p>, <ul> e <blockquote>) usam uma fonte sem serifa (Helvetica Neue, Arial e alternativas) enquanto os títulos (<h1>, <h2> e <h3>) usam uma outra fonte sem serifa (Source Sans Pro). Os sinais de pontuação de Source Sans Pro são, pelo design, mais largos que os da Helvetica Neue e Arial. Assim, os elementos DOM configurados com Source Sans Pro (títulos) precisam de um valor uma pouco maior para text-indent que os elementos DOM configurados com Helvetica Neue (listas, parágrafos, etc).

Isso é bem simples de ajustar, bastando criar classes adicionais específicas para os títulos. Ajustaremos o JavaScript para detectar o tipo do elemento e, então, aplicar a classe apropriada.

Passo 4: Configurar Uma Função no JavaScript

Agora que já temos o HTML e o CSS que precisamos, usaremos o JavaScript para descobrir quais elementos da DOM são descendentes diretos do recipiente do nosso artigo. Checaremos, então, se esses elementos DOM começam com um sinal de pontuação que deve ser deslocado.

Para começar, criaremos uma função que conterá todo nosso código. Essa função receberá um argumento, que é o elemento DOM contendo o texto que queremos analisar em busca de pontuação a deslocar, por exemplo o recipiente do artigo de um blog.

Nota: pontuação deslocada é um dos aspectos do aprimoramento progressivo. Nesse exemplo, usaremos JavaScript nativo que não é totalmente suportado em navegadores antigos (estou olhando para você, IE). Se quisesse fazer isso funcionar em navegadores antigos, você poderia. A maioria das coisas que faremos será em relação a seleção de elementos da DOM e alterar suas classes. Você poderia usar a jQuery para isso ou poderia usar alguma função auxiliar lá do site youmightnotneedjquery.com

Passo 5: Definindo os Caracteres de Pontuação

Precisamos criar uma lista das pontuações deslocáveis. Usando os caracteres que definimos antes como referência, podemos criar um objeto JavaScript definindo nossos sinais de pontuação (a partir de seus caracteres Unicode):

Como pode ver, definimos a lista de sinais de pontuação que queremos deslocar com a definição de largura correspondente que combine com nossas classes HTML. Esse objeto nos diz qual sinal de pontuação a usar no deslocamento e quão negativo deve ser o valor do text-indent. Essa lista não está completa. A beleza é que iteraremos por toda lista, assim, você pode adicionar sinais de pontuação adicionais a essa lista, se necessário.

Passo 6: Iterando por Cada Elemento da Lista

Agora, iteraremos por todos os descendentes do elemento recipiente (passado como parâmetro para a função). Para tanto, primeiramente, prepararemos a iteração a partir de um laço for:

O próximo passo (dentro do laço for) criaremos uma variável chamada el que representará cada elemento descendente direto do recipiente que estamos iterando (obtenha os descendentes do elemento usando a propriedade .children):

Agora, passaremos nossa variável el para outra função (hangIfEligible()), que checará se o elemento começa com algum sinal de pontuação que pode ser deslocado. Se sim, outra função aplicará a classe ao elemento.

Notou o que fizemos com a tag blockquote? Uma vez que o elemento blockquote tem seus próprios elementos que podem começar com pontuação passível de deslocamento (como uma tag <p> tag), precisamos iterar sobre seus filhos também. Logo, se o elemento atual que estamos iterando é um blockquote, iteraremos sobre cada um de seus filhos e os passaremos para a função hangIfEligible(). Se não for um blockquote, simplesmente passaremos o próprio elemento à função hangIfEligible().

Se não iterarmos, especificamente, pelos filhos do blockquote, provavelmente deixaríamos de deslocar as pontuações neles.

Nosso laço for deve parecer com isso:

Passo 7: Deslocando a Pontuação

Passamos o elemento filho atual para a função hangIfEligible(). É a hora de definirmos como ela funciona:

Como pode ver, temos uma função chamada hangIfEligible() que leva um parâmetro: o elemento DOM que verificaremos se começa em pontuação.

Obtendo o Texto do Elemento

Agora, criaremos as variáveis que precisamos. Primeiro, precisaremos pegar o texto de dentro do elemento DOM. Para tanto, usaremos a propriedade innerText do JavaScript. Como isso não funciona no Firefox, também usaremos a propriedade textContent, que funciona.

Preparando o Nome da Classe HTML

Como nosso exemplo usa duas fontes diferentes (uma para títulos e outra para o corpo do texto), precisaremos de duas classes diferentes para os dois tipos de elementos.

Se você se lembra, nossas classes HTML que controlam os valores negativos de text-indent seguem o padrão indent- para nomeação, e o de largura para sinais de pontuação (small, medium, ou large). Se o elemento é um título, adicionaremos header- entre eles. Assim, a classe para sinais de pontuação pequenos é a indent-small no texto normal, e indent-header-small para títulos.

Em nosso JavaScript, criaremos uma variável para nossa classe HTML e anexaremos header- depois se a tag atual é um título.

Verificando Se o Elemento Começa com Pontuação

Verificaremos e veremos se o texto em nosso elemento começa com um dos sinais de pontuação definidos anteriormente. Para tanto, iteraremos sobre cada valor em nossa variável marks onde definimos os sinais de pontuação que queremos deslocar. E, então, usaremos a propriedade indexOf do JavaScript para verificar e ver se o primeiro caractere do elemento de texto combina com nossos sinais de pontuação.

Explicando o indexOf: O indexOf do JavaScript verifica uma cadeia de caracteres onde cada caractere é um elemento de um vetor. Por exemplo, var text = 'A String' seria o equivalente a ['A', ' ', 'S', 't', 'r', 'i', 'n', 'g']. A propriedade indexOf leva como parâmetro um caractere e busca o vetor completo em busca daquele caractere. Se ele encontra, retorna a posição do primeiro elemento encontrado no vetor. Assim, em nosso caso, buscamos por algum sinal de pontuação. Se for encontrado na primeira posição do vetor (índice 0) então, nosso texto começa com uma pontuação deslocável.

Adicionando uma Classe

Tudo que temos de fazer agora é adicionar a classe ao elemento se o primeiro caractere do seu texto combina com um dos sinais de pontuação.

Em nosso exemplo, se o elemento começa com um sinal de pontuação qualificado, precisaremos verificar se o elemento atual é um título (uma vez que nossos títulos precisam de classes HTML diferenciadas). Logo, na parte que adicionamos esse comentário // se combinar, codifique aqui, substituiremos pelo trecho a seguir:

Viu o que fizemos? Se o elemento for qualquer tipo de título, adicionaremos header- ao nome da classe. A classe HTML que será adicionada a nossa DOM é construída dessa forma:

  • indent- por padrão
  • header- anexado se o elemento atual é um título
  • small, medium, ou large são adicionados dependendo da largura do sinal de pontuação atual

Todo o Código Junto

All of that code together would look like this:

Passo 8: Execute a Função Assim Que a Página Carregar

Tudo que temos de fazer agora é executar a função quando a página carregar. Você pode fazer isso com algumas poucas linhas de código:

Viu o que fizemos? Invoque a função hangPunctuation e passe o elemento DOM do texto o qual você quer descolar a pontuação.

Note que adicionamos a classe ao elemento recipiente. Você pode usar essa classe para deslocar listas <ul>, também. Simplesmente adicione um CSS como: .hang-punctuation ul {margin:0; padding:0: list-style-position: outside;}

O Código Final

E é isso! Finalizamos! Eis o código final:

É bom lembrar que essa solução não é completa. Provavelmente, requererá alguns ajustes para cada projeto que for usada, porque cada projeto diferente nas escolhas de fontes, estrutura de código, etc. Entretanto, se estiver estruturando um texto longo, essa solução pode ajudar a adicionar um pouco de refinamento tipográfico ao seu layout.

Leitura Suplementar:

Uma Abordagem Alternativa

Desde a publicação desse artigo, outros aparecerão com suas ideias. Dê uma olhada nos comentários e verá a técnica inspiradora de Gunnar Bittersmann. O Lane Olson até combinou essa técnica com meu JavaScript para criar uma demonstração no Codepen.

Seja o primeiro a saber sobre novas traduções–siga @tutsplus_pt no Twitter!

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.