Emmet: Prefixos de Fornecedor e Correspondência Difusa

A Aula 11 ensinou os fundamentos dos atalhos CSS — escrevendo margin: 10px 20px; e outras propriedades comuns em uma linha. Mas a era CSS3 introduziu dois grandes pontos de dor que permanecem não resolvidos: compatibilidade entre navegadores (onde border-radius precisa dos prefixos -webkit- e -moz- escritos simultaneamente) e nomes de propriedade difíceis de lembrar (overflow: hidden; é muito longo para digitar). Esta aula resolve ambos: prefixos de fornecedor permitem expandir regras de compatibilidade webkit/moz com um pressionamento de tecla, e a correspondência difusa permite escrever bdrs e ter isso inferido inteligentemente como border-radius.

1. O Que Você Vai Aprender


2. A História Real de Uma Desenvolvedora Front-End

(1) Ponto de Dor: Prefixos entre Navegadores CSS3 + Nomes de Propriedade Longos

Alice estava construindo cartões com cantos arredondados para uma landing page de e-commerce. Ela queria que todos os navegadores modernos suportassem border-radius para cantos arredondados. O problema: navegadores de 2015 ainda precisavam de prefixos —

CSS
-webkit-border-radius: 8px;
-moz-border-radius: 8px;
border-radius: 8px;

Três linhas apenas para lidar com uma propriedade border-radius. O design dela tinha 6 cantos arredondados (o próprio cartão, botões, imagens, emblemas, avatares e rodapé do cartão). A 3 linhas cada = 18 linhas de pura cópia e colagem. Pior: propriedades CSS3 diferentes têm requisitos de compatibilidade de prefixo diferentes — box-shadow precisa de 4 linhas (webkit, moz, ms, o), enquanto transform só precisa de 2. Alice continuava confundindo qual propriedade precisava de quantos prefixos.

Ainda pior eram os nomes longos de propriedades CSS3: overflow: hidden; era necessário com frequência, e Alice tinha que digitar o overflow completo (8 letras) toda vez; text-decoration: none; era ainda mais longo (15 caracteres só para o nome da propriedade). Ela podia escrever essas duas propriedades 50 vezes por dia, digitando-as completas a cada vez — totalizando 1.150 pressionamentos de tecla. Alice pensou: os prefixos de compatibilidade CSS3 não podem ser expandidos com um pressionamento de tecla? Nomes de propriedade longos não podem usar abreviações curtas?

(2) Como os Prefixos de Fornecedor + Correspondência Difusa do Emmet Resolvem Isso

A solução do Emmet tem duas partes:

Mecanismo de prefixo de fornecedor: Adicione - antes de uma abreviação CSS e o Emmet expande automaticamente em 3 linhas de regras compatíveis webkit/moz/padrão. A abreviação de canto arredondado da Alice -bdrs8 expande em 3 linhas de uma vez:

CSS
-webkit-border-radius: 8px;
-moz-border-radius: 8px;
border-radius: 8px;

6 cantos arredondados passam de 18 linhas para 6 abreviações — um aumento de velocidade de 3x.

Mecanismo de correspondência difusa: Emmet usa um dicionário de snippets CSS predefinido + algoritmo de pesquisa difusa para fazer correspondência inteligente entre abreviações curtas e nomes de propriedades longos. bdrs não está diretamente no dicionário, mas Emmet usa "pesquisa difusa de nome de trecho predefinido" para encontrar a correspondência mais próxima: border-radius; ov-h usa separação de hífen para correspondência inteligente overflow: hidden;; tdn usa uma combinação de letras iniciais para corresponder a text-decoration: none;. As 50 entradas de nomes de propriedades de Alice passaram de 1.150 pressionamentos de tecla para cerca de 200 (comprimento médio da abreviação de 4 caracteres) — um aumento de velocidade de 5x.

(3) Benefícios

Prefixos de fornecedor + correspondência difusa são os dois aceleradores principais do Emmet na era CSS3. O primeiro resolve o trabalho repetitivo de "compatibilidade entre navegadores", enquanto o segundo resolve a carga cognitiva de "não conseguir lembrar nomes de propriedade longos". Uma vez dominados, Alice consegue escrever estilos de cartão em 90 segundos (antes eram 8 minutos), reduzir o código de compatibilidade CSS3 para cantos arredondados de 18 linhas para 6 e melhorar a velocidade de entrada de nomes de propriedade longos em 5x. Após esta aula, você será capaz de escrever cantos arredondados compatíveis com webkit/moz com -bdrs8 em uma linha e expandir text-decoration: none; a partir de tdn em uma linha.


3. Mecanismo de Prefixo de Fornecedor: Prefixo - Dispara Expansão de 3 Linhas

Novas propriedades CSS3 (cantos arredondados, sombras, gradientes, transformações) exigem escrever prefixos de fornecedor para diferentes motores de navegador. O Emmet torna essa tarefa repetitiva uma operação de um pressionamento de tecla.

(1) Fundamentos de Prefixo de Fornecedor

Adicione um prefixo - antes de uma abreviação CSS e o Emmet expande automaticamente em 3 linhas de regras compatíveis incluindo webkit + moz + padrão.

Abreviação Expansão Caso de Uso
-bdrs -webkit-border-radius: ;
-moz-border-radius: ;
border-radius: ;
Cantos arredondados compatível 3 linhas
-bxs -webkit-box-shadow: ;
-moz-box-shadow: ;
box-shadow: ;
Sombra compatível 3 linhas
-trf -webkit-transform: ;
-moz-transform: ;
transform: ;
Transformação compatível 3 linhas
-bdrs8 -webkit-border-radius: 8px;
-moz-border-radius: 8px;
border-radius: 8px;
Cantos arredondados com valor

Ponto Chave: O Emmet inclui por padrão webkit (Chrome, Safari, novo Opera) + moz (Firefox) + padrão — 3 linhas no total. Isso é baseado na configuração do catálogo de fornecedores CSS (css.{vendor}Properties) — border-radius existe tanto no catálogo webkit quanto no moz, então ambos os prefixos são adicionados. Para obter apenas uma versão de prefixo específica, use a sintaxe de prefixo explícito na seção (3).

(2) Como o Auto-Prefixo Funciona

O mecanismo de prefixo de fornecedor do Emmet é baseado na configuração css.autoInsertVendorPrefixes (ativada por padrão). Quando ativada, todas as propriedades CSS3 conhecidas (nos catálogos de fornecedores) expandem automaticamente para regras compatíveis de 3 linhas — o prefixo - não é necessário para a prefixação:

Abreviação (com -) Abreviação (sem -) Expansão Observações
-bdrs8 bdrs8 -webkit-border-radius: 8px;
-moz-border-radius: 8px;
border-radius: 8px;
Ambos equivalentes quando a configuração está ativada
-bxs bxs -webkit-box-shadow: ;
-moz-box-shadow: ;
box-shadow: ;
Comportamento de auto-prefixo

Dica: Este é um design de conveniência — os desenvolvedores não precisam memorizar "quais propriedades precisam de prefixos". bdrs8 e -bdrs8 produzem a mesma expansão. No entanto, adicionar - explicitamente é mais claro e mais portátil (ainda funciona se a configuração de auto-prefixo estiver desativada).

(3) Especificação de Prefixo Explícito: -w-m- Gera Apenas os Prefixos Especificados

Para gerar apenas prefixos específicos (ex.: apenas webkit + moz, sem ms + o), use a sintaxe explícita -{letra}-{letra}-...:

Abreviação Expansão Caso de Uso
-w-m-bdrs8 -webkit-border-radius: 8px;
-moz-border-radius: 8px;
border-radius: 8px;
Apenas webkit + moz
-wm-trf -webkit-transform: ;
-moz-transform: ;
transform: ;
Apenas webkit + moz
-w-bdrs8 -webkit-border-radius: 8px;
border-radius: 8px;
Apenas webkit

(4) Referência Rápida de Letras de Prefixo

O Emmet fornece abreviações de prefixo de uma letra para especificação explícita mais curta:

Letra Prefixo Completo Navegador
w -webkit- Chrome, Safari, novo Opera
m -moz- Firefox
s -ms- Edge antigo, IE
o -o- Opera antigo (obsoleto; novo Opera usa webkit)

Múltiplos prefixos são unidos com -: w-m, w-m-s-o (webkit + moz + ms + o).


4. Correspondência Difusa: Inferência Inteligente para Abreviações Desconhecidas

CSS tem mais de 200 nomes de propriedade — memorizar todos é irrealista. O Emmet usa correspondência difusa para permitir que você escreva abreviações curtas que são inferidas em nomes de propriedade longos.

(1) Princípio da Correspondência Difusa

O Emmet mantém um dicionário de snippets CSS predefinido (snippets.json). Quando o usuário digita uma abreviação não definida diretamente no dicionário, o Emmet usa um algoritmo de busca difusa para encontrar o nome de snippet mais próximo.

TEXT 📖 Somente leitura
Usuário digita "bdrs"
  → Procura "bdrs" em snippets.json → não encontrado
  → Lança busca difusa → compara com todos os nomes de snippet
  → Calcula pontuações de similaridade
  → "border-radius" tem a maior pontuação (b-d-r-s corresponde a 1-2 caracteres cada de border-radius)
  → Gera a propriedade "border-radius"

(2) Referência Rápida Prática de Correspondência Difusa

Os pares de correspondência difusa "abreviação curta → propriedade longa" mais comuns no Emmet:

Abreviação Expansão Processo de Correspondência Difusa
bdrs border-radius: ; b-d-r-s → border-radius
bdt border-top: ; b-d-t → border-top (definido diretamente)
bdb border-bottom: ; b-d-b → border-bottom
ov-h overflow: hidden; ov-h → overflow: hidden
ovh overflow: hidden; ovh → overflow: hidden (sem hífen)
oh overflow: hidden; oh → overflow: hidden (ultra-curto)
tdn text-decoration: none; t-d-n → text-decoration: none
pos-a position: absolute; pos-a → position: absolute
bxz-cb box-sizing: content-box; bxz-cb → box-sizing: content-box
c color: ; c → color (definido diretamente)

Ponto Chave: A correspondência difusa opera em nomes de snippet predefinidos, não em nomes de propriedade CSS diretamente. Isso significa que a mesma abreviação pode ter múltiplos candidatos — o Emmet escolhe aquele com a maior pontuação de similaridade. oh poderia corresponder a overflow: hidden ou outline: hidden, mas o Emmet seleciona com base na prioridade.

(3) Atalho de Propriedade Hifenizada

CSS tem muitas propriedades de múltiplas palavras hifenizadas (border-top, border-bottom, text-decoration). As regras de atalho do Emmet para propriedades hifenizadas:

Abreviação Expansão Observações
bdt border-top: ; Propriedade hifenizada pega primeiras letras
bdb border-bottom: ; Igual ao acima
bdl border-left: ; Igual ao acima
bdr border-right: ; Igual ao acima
tdn text-decoration: none; Limpar decoração de texto
tdl text-decoration: line-through; Decoração de texto tachado
tt-u text-transform: uppercase; Transformação de texto maiúsculas
bd-1-s-#ccc border: 1px solid #ccc; Atalho de borda completo

Dica: A sintaxe de múltiplos valores para propriedades hifenizadas usa - como separador (ex.: bdt-1-s-solid). Mas cuidado para distinguir isso do atalho de múltiplos valores — bdt é a propriedade (border-top), -1 é o valor (1px), -s é o valor (solid), então o resultado final é border-top: 1px solid;. # é o separador de cor, e #ccc é o valor da cor — a mesma abreviação pode misturar perfeitamente propriedade + múltiplos valores + cor.


5. Exemplos Práticos

Os 4 exemplos a seguir cobrem os cenários principais de prefixos de fornecedor + correspondência difusa + propriedades hifenizadas.

▶ Exemplo: Prefixo de Fornecedor Único -webkit-bdrs10 (Dificuldade: ★)

O prefixo de fornecedor mais comum — escreva compatibilidade webkit + moz + padrão em uma linha.

Abreviação:

CSS
-webkit-bdrs10

Expansão:

CSS
-webkit-border-radius: 10px;
-moz-border-radius: 10px;
border-radius: 10px;

Saída:

TEXT 📖 Somente leitura
Explicação: `-webkit-bdrs10` consiste em 3 segmentos: ① `-webkit-` é o marcador de prefixo de fornecedor explícito, acionando o Emmet para expandir uma versão webkit; ② `bdrs` é correspondido difusamente a `border-radius` (via correspondência de maior similaridade no dicionário snippets.json); ③ `10` é o valor, adicionando automaticamente a unidade px. O Emmet gera 3 linhas de regras de compatibilidade: versão webkit, versão moz e versão padrão w3c. Como `border-radius` existe em ambos os catálogos de fornecedores do Emmet (css.webkitProperties, css.mozProperties), mesmo sem escrever explicitamente `-webkit-`, `bdrs10` geraria automaticamente 3 linhas de compatibilidade. A notação explícita `-webkit-` tem a vantagem de intenção mais clara e funcionalidade contínua após mudanças de configuração.

▶ Exemplo: Múltiplos Prefixos de Fornecedor -w-m-bdrs10 (Dificuldade: ★★)

Especifique explicitamente apenas os prefixos webkit + moz — evitando prefixos legados ms/o desnecessários.

Abreviação:

CSS
-w-m-bdrs10

Expansão:

CSS
-webkit-border-radius: 10px;
-moz-border-radius: 10px;
border-radius: 10px;

Saída:

TEXT 📖 Somente leitura
Explicação: Em `-w-m-bdrs10`, `-` é o gatilho de prefixo de fornecedor, `w-m` é a lista de prefixos explícitos (w = webkit, m = moz) e `bdrs10` é a propriedade + valor. Vendo `-w-m-`, o Emmet gera **apenas os dois prefixos especificados + padrão**, sem ms (IE/Edge antigo) e o (Opera antigo). Este modo de "especificação explícita" é útil para: (a) controlar precisamente o número de prefixos de saída; (b) evitar prefixos de navegador obsoletos (como o); (c) aderir a padrões de codificação da equipe que exigem apenas webkit + moz. A diferença chave de `-webkit-bdrs10` é: `-w-m-bdrs10` para **propriedades desconhecidas** gera apenas 2 prefixos + padrão; enquanto `-webkit-bdrs10` para **propriedades conhecidas** gera todos os prefixos do catálogo, e para **propriedades desconhecidas** gera todos os 4 prefixos.

▶ Exemplo: Correspondência Difusa bdrs tdn ov-h (Dificuldade: ★★)

Três correspondências difusas comuns de propriedades longas — demonstrando a capacidade de inferência inteligente do Emmet.

Abreviação (3 expansões independentes):

CSS
bdrs8

Expansão:

CSS
border-radius: 8px;

Abreviação:

CSS
tdn

Expansão:

CSS
text-decoration: none;

Abreviação:

CSS
ov-h

Expansão:

CSS
overflow: hidden;

Saída:

TEXT 📖 Somente leitura
Explicação: Três abreviações independentes mostram três formas de correspondência difusa. Em `bdrs8`, `bdrs` é correspondido difusamente a `border-radius` e 8 adiciona px automaticamente → `border-radius: 8px;`. Este é um padrão típico de "abreviação de primeiras letras" (primeiros 2 caracteres de "border" e "radius"). Em `tdn`, `t-d-n` é a abreviação para `text-decoration: none` (primeiras letras de text + decoration + none) → `text-decoration: none;`. Este é um **alias exato predefinido** no dicionário do Emmet, não correspondência difusa — o snippets.json do Emmet contém a entrada precisa `"tdn": "text-decoration: none|;"`. Em `ov-h`, o hífen atua como separador de valor, separando `ov` (overflow) de `h` (hidden) → `overflow: hidden;`. Esta é outra forma de correspondência difusa: o hífen torna a estrutura da abreviação mais clara. A correspondência difusa do Emmet opera em **nomes de snippet predefinidos**, não em **todos os nomes de propriedade CSS** — então, ocasionalmente, propriedades obscuras podem não ser encontradas.

▶ Exemplo: Atalho de Propriedade Hifenizada bdt-1-s-solid bd-1-s-#ccc (Dificuldade: ★★)

Sintaxe de múltiplos valores para propriedades hifenizadas — demonstrando que hífens em abreviações separam tanto propriedades quanto valores.

Abreviação:

CSS
bdt-1-s-solid

Expansão:

CSS
border-top: 1px solid;

Abreviação:

CSS
bd-1-s-#ccc

Expansão:

CSS
border: 1px solid #ccc;

Saída:

TEXT 📖 Somente leitura
Explicação: Duas abreviações mostram a sintaxe de múltiplos valores para propriedades hifenizadas. Em `bdt-1-s-solid`, `bdt` é o atalho de propriedade hifenizada para `border-top` (primeiras letras de border + top), `-1` é o valor 1 (adiciona px automaticamente), `-s` é o alias para solid (s = solid) e `-solid` é um valor explícito. O Emmet analisa inteligentemente: `bdt` é o nome da propriedade; tudo após `-` é um valor (1px, solid), produzindo `border-top: 1px solid;`. Em `bd-1-s-#ccc`, `bd` é o atalho para `border` (definido diretamente), `-1` é 1px, `-s` é solid e `-#ccc` é a cor (`#` é o separador de cor; o Emmet reconhece automaticamente o limite do valor). A saída final é `border: 1px solid #ccc;`. Ambos os exemplos demonstram o atalho misto "propriedade hifenizada + múltiplos valores + cor" — esta é a sintaxe CSS de borda completa mais comum.

6. Exemplo Completo: Estilo de Cartão CSS3 em Uma Linha

Combine prefixos de fornecedor, correspondência difusa e propriedades hifenizadas para escrever um estilo completo de cartão CSS3 (com compatibilidade com navegadores legados).

▶ Exemplo: Estilo Compatível de Cartão CSS3 (Dificuldade: ★★)

Abreviação:

CSS
-w-m-bdrs8 +bxs0-2-4-#0003 -bgs#fff w200 h200 m10-20 p16

Expansão:

CSS
-webkit-border-radius: 8px;
-moz-border-radius: 8px;
border-radius: 8px;
-webkit-box-shadow: 0 2px 4px #00000033;
-moz-box-shadow: 0 2px 4px #00000033;
box-shadow: 0 2px 4px #00000033;
background: #fff;
width: 200px;
height: 200px;
margin: 10px 20px;
padding: 16px;

Saída:

TEXT 📖 Somente leitura
Explicação: Este exemplo combina todos os mecanismos principais desta aula. `-w-m-bdrs8` especifica explicitamente os prefixos webkit + moz para expandir cantos arredondados (3 linhas); `+bxs0-2-4-#0003` é a abreviação de `box-shadow` — `bxs` corresponde difusamente a box-shadow, `0-2-4` é o deslocamento e raio de desfoque de 3 valores (adiciona px automaticamente), e `#0003` é preto com alfa 03 (o Emmet expande automaticamente a cor de 4 caracteres `#0003` para 8 caracteres `#00000033`). Abreviação `-bgs#fff`: `bgs` é o atalho para background, `#fff` é um fundo branco. Nota: `-bgs` é uma abreviação de prefixo de fornecedor (`-` dispara webkit/moz), mas background não é uma propriedade nova do CSS3, então as versões webkit/moz não serão realmente geradas (porque background não está nos catálogos de fornecedores). O `-` aqui é usado para clareza de intenção. Finalmente, `w200 h200 m10-20 p16` são as dimensões e espaçamentos básicos. Esta única linha cobre um estilo completo de cartão CSS3, de 12 linhas de CSS escritas à mão para 1 abreviação Emmet.

❓ Perguntas Frequentes

P: -bdrs8 e bdrs8 produzem exatamente a mesma expansão? Devo sempre escrever -? R: Quando css.autoInsertVendorPrefixes está ativado (padrão), são idênticos — ambos expandem para 3 linhas de regras compatíveis. Quando a configuração está desativada, -bdrs8 ainda expande para 3 linhas, mas bdrs8 expande para apenas 1 linha (a versão padrão). Recomenda-se sempre escrever o prefixo - para intenção mais clara e melhor compatibilidade entre ambientes.

P: Por que a correspondência difusa pode corresponder bdrs a border-radius, mas não radius? R: A correspondência difusa opera em nomes de snippet predefinidos, não em todos os nomes de propriedade CSS. bdrs pode corresponder porque o snippets.json do Emmet define explicitamente "bdrs": "border-radius:|;" como um alias exato. radius não está na lista predefinida, então a busca difusa não encontra correspondência próxima. Se você usa radius com frequência, pode personalizar o snippets.json adicionando "radius": "border-radius:|;", tornando radius também expansível.

P: Qual é a diferença entre -webkit-bdrs10 e -w-bdrs10? R: -webkit-bdrs10 especifica explicitamente o prefixo webkit; -w-bdrs10 é a forma abreviada (w = webkit). Os dois são equivalentes na análise do Emmet. No entanto, em -webkit-bdrs10, -webkit- faz parte do nome da propriedade, e o Emmet procura o snippet para webkit-bdrs como um todo; em -w-bdrs10, -w- é uma lista de prefixos explícita, e o Emmet analisa no modo "lista de prefixos + propriedade". Ambos produzem o mesmo resultado, mas a semântica difere — -webkit-bdrs enfatiza "versão compatível com webkit", enquanto -w-bdrs enfatiza "especificar o prefixo w". Recomenda-se usar -w-bdrs (mais curto e mais alinhado com a convenção de prefixo de uma letra do Emmet).

P: Abreviações de prefixo de fornecedor podem receber !important? Por exemplo, -bdrs8!? R: Sim. O sufixo !important funciona independentemente do mecanismo de prefixo de fornecedor. -bdrs8! expande para 3 linhas com !important em cada uma. No entanto, na prática, adicionar !important a prefixos de fornecedor não é recomendado — as próprias regras de compatibilidade já são incomuns, e adicionar !important dificulta a depuração de prioridade. Se precisar usar, aplique apenas à versão padrão final (border-radius: 8px !important;) em vez das versões webkit/moz.


📖 Resumo


📝 Exercícios

  1. Básico (Dificuldade: ★): Em um arquivo .css, digite as 3 abreviações -bdrs8, -bxs, -trf uma por uma, pressione Tab e registre os resultados da expansão. Depois reescreva-as sem - (como bdrs8, bxs, trf) e compare as 6 expansões (nota: com css.autoInsertVendorPrefixes ativado por padrão, ambas devem ser idênticas).

  2. Intermediário (Dificuldade: ★★): Escreva uma linha Emmet para o estilo CSS3 completo e compatível de uma div. Requisitos: (a) cantos arredondados 8px (compatível com webkit + moz); (b) sombra 0 2px 4px rgba(0,0,0,0.3) (usando cor de 4 caracteres #0003); (c) largura 200px, altura 200px; (d) margin 10px-20px (2 valores). Registre a expansão e verifique se todas as linhas de compatibilidade incluem os prefixos -webkit- e -moz-.

  3. Desafio (Dificuldade: ★★★): Escreva um estilo CSS completo de "sombra de cartão + transição hover" com pelo menos 5 propriedades: (a) estilo padrão com cantos arredondados + sombra + padding (3 propriedades); (b) transition (dispare expansão compatível com -trs ou use o atalho trs); (c) pelo menos 2 usos de correspondência difusa (ex.: bdrs, tdn, ov-h); (d) pelo menos 1 propriedade com !important. Verifique a expansão e escreva um relatório resumido de benefícios de velocidade "Prefixos de Fornecedor + Correspondência Difusa" (quanto tempo leva escrever à mão vs. Emmet para cada um).

Web-Tutorial.com

Equipe Técnica Web-Tutorial

Uma plataforma de tutoriais mantida por diversos desenvolvedores. Cada tutorial é escrito e revisado por profissionais da área correspondente. Trabalhamos para manter nosso conteúdo preciso e confiável — se encontrar algum problema, avise-nos.

100%