É possível criar e usar tags HTML diretamente
(maurycyz.com)- No HTML, mesmo usando nomes de tags não reconhecidos, o navegador os trata como elementos genéricos
- No CSS, é possível usar esse nome de tag como seletor para definir estilos e controlar a exibição
- Usar nomes com hífen (
-) ajuda a evitar conflitos com futuros padrões do HTML - Em vez de
<div>ou<span>, usar tags personalizadas com significado melhora a legibilidade do código - Mesmo em estruturas aninhadas complexas, fica mais fácil entender a estrutura só pelo nome das tags, o que facilita a manutenção
Como usar tags HTML personalizadas
-
O navegador renderiza tags desconhecidas como elementos de bloco genéricos
- Esse é um comportamento normal definido pelo padrão HTML, e é possível controlá-las visualmente com CSS
- Por exemplo, você pode definir uma tag como
<cool-thing>e estilizar no CSS comcool-thing { ... }
-
Se o nome da tag incluir hífen (
-), não haverá risco de conflito caso novos elementos sejam adicionados ao padrão HTML no futuro- Ex.:
<main-article>,<quote-body>
- Ex.:
Melhorando a legibilidade e a estrutura
- Em vez de
<div>ou<span>, usar tags com nomes significativos torna o código mais fácil de entender- Por exemplo, em vez de
<div class="article-header">, você pode usar<article-header>
- Por exemplo, em vez de
- Em estruturas aninhadas com
<div>, é difícil identificar onde cada tag de fechamento corresponde, mas com nomes de tags explícitos a estrutura fica mais clara- Se dentro de
<main-article>houver elementos como<article-header>e<article-quote>, a estrutura do DOM fica intuitiva de entender
- Se dentro de
Exemplo de código
- Forma tradicional
<div class="cool-thing"> Hello, World! </div> - Usando tag personalizada
<cool-thing> Hello, World! </cool-thing>- No CSS, você pode aplicar estilos como
cool-thing { display: block; font-weight: bold; text-align: center; ... }
- No CSS, você pode aplicar estilos como
Conclusão
- Ao aproveitar a flexibilidade permitida pelo padrão HTML para definir tags,
é possível escrever uma marcação estrutural com alta legibilidade - Porém, se já existir uma tag semântica apropriada definida, o ideal é priorizar o uso da tag existente
1 comentários
Comentários do Hacker News
Enfatiza que
<tag-name>não é uma tag não reconhecidaApresenta seu post no blog e explica que
<tagname>é tratado como HTMLUnknownElement até que o WHATWG o adicione como novo elemento, mas<tag-name>é um HTMLElement válido, útil para layout e estilizaçãoSe for atualizado com a JavaScript Custom Elements API, torna-se um elemento customizado definido
Esse é o comportamento padrão em todos os navegadores, e o W3C HTML Validator também reconhece elementos customizados com hífen como HTMLElement
No entanto, a regra
[hidden]{display:none}da folha de estilos UA padrão não é herdada, então é preciso defini-la manualmenteComo
<DIV>édisplay:blockpor padrão graças à folha de estilos UA, em elementos customizados também é preciso definir a propriedadedisplaymanualmenteÉ possível distinguir elementos definidos e não definidos com os seletores CSS
:definede:not(:defined)O Declarative Shadow DOM (
<template shadowrootmode="open">) também cria da mesma forma elementos customizados não definidoshiddené um atributo de apresentação HTML (presentation attribute)A folha de estilos UA se aplica igualmente aos elementos customizados, e a regra
[hidden]não existehiddené um exemplo de atributo que em si é interpretado como estilo, comoalign="right"-), o que teria permitido integrar namespaces XML de forma naturalMenciona que seria até possível converter dois-pontos em hífens no nginx ou no apache
Termina em tom nostálgico, dizendo que “não dá para voltar para 1999”
Aponta que a estrutura aninhada de
<div>no código de exemplo é excessivaSugere que seria mais adequado usar tags semânticas como
<article>,<header>e<blockquote>Classes podem ser múltiplas e não têm ordem, mas elementos customizados aninhados impõem ordem, o que dificulta expressar a mesma coisa
Diz que isso fazia sentido em 1996, mas não hoje
Compartilha a experiência de ter usado elementos customizados por 3 a 4 anos
A ideia é inteligente, mas complicada na prática
Usar tags customizadas demais prejudica a legibilidade e dificulta distinguir entre elementos de bloco e inline
Como abordagem equilibrada, mantém as tags padrão e usa tags customizadas apenas para elementos em forma de componente, como
<x-card>e<x-hero>Os subcomponentes são diferenciados com o atributo
slot, como em<div slot="hero-blurb">Prefere limitar classes a modificações e customização, e representar a estrutura com slots
Apresenta o Good.HTML, que criou, explicando que suporta autohook, interpolação baseada em template literals e estrutura ordenada de componentes
Acrescenta que também implementou elementos customizados self-closing como
< !app-header />usando um truque com nós de comentárioslotem CSS, basta usar algo comodiv[slot="hero-blurb"]Por padrão, tags customizadas funcionam como
<span>Se necessário, é possível definir comportamento com a Custom Element API
Acredita que, para a maioria dos usuários, a combinação de HTML + elementos customizados teria sido melhor do que SPA
Compartilha um exemplo do Hypalink que criou e aponta a subvalorização dos Web Components
Apresenta uma tag customizada chamada
<yes-script>para fazer o oposto de<noscript>Quando o JS está desativado, ela pode ocultar determinada área
Compartilha o link do projeto
@media (scripting)do CSS permite obter o mesmo efeito só com CSS puroAnexa um link para a documentação do MDN
Compartilha a experiência de ter recriado manualmente a antiga tag
<blink>, removida dos navegadoresImplementou com jQuery e manipulação de visibility, e diz que se surpreendeu ao descobrir que o navegador aceitava tags arbitrárias
Como o código tinha umas 10 linhas, não chegou a publicá-lo, mas supõe que deve haver muitas tentativas parecidas
<blink>, e que apenas Firefox e Opera deram suporte até 2013<blink>só com CSSAfirma que, se usar o seletor
blinkem vez de.blink, ele será aplicado diretamente à tag<blink>carrega significado demais para ser oferecido como simples elemento HTML, e por isso vê com bons olhos o seu desaparecimentoObserva que exemplos como
<main-article>e<article-header>podem ser substituídos por tags HTML reaisUsar
<article>,<header>e<blockquote>seria mais apropriadoTags customizadas são renderizadas como inline por padrão, como
<span>, mas basta definir um valor padrão dedisplaycom CSSNo passado isso era evitado por causa de problemas com namespaces, mas quando o padrão passou a permitir hífen (
-), o risco de conflito desapareceuTambém funcionam normalmente em seletores CSS e podem ser acessadas com
querySelectorDá a entender que HTML moderno por si só já é expressivo o bastante, sem precisar de frameworks como Vue
Isso foi projetado para que, em uma futura atualização, a cadeia de protótipos possa ser estendida naturalmente
Para definir um estilo padrão para todos os elementos customizados, basta fazer assim
Lembra que o IE antigo não reconhecia tags HTML5, então resolveu isso com um script que criou por volta de 2010
Bastava criar a tag uma vez com JS para que o IE passasse a reconhecê-la, e depois era possível removê-la sem problemas
Diz que foi assim que percebeu que também era possível renderizar tags arbitrárias
Compartilha junto um post antigo do blog