Se pueden crear y usar etiquetas HTML directamente
(maurycyz.com)- En HTML, incluso si se usan nombres de etiquetas no reconocidos, el navegador los trata como elementos genéricos
- Si ese nombre de etiqueta se especifica como selector en CSS, es posible aplicar estilos y controlar su visualización
- Usar nombres que incluyan un guion (-) ayuda a evitar conflictos con futuros estándares de HTML
- En lugar de
<div>o<span>, usar etiquetas personalizadas con significado mejora la legibilidad del código - Incluso en estructuras anidadas complejas, es más fácil entender la estructura solo con los nombres de las etiquetas, lo que facilita el mantenimiento
Uso de etiquetas HTML personalizadas
-
El navegador renderiza las etiquetas desconocidas como elementos de bloque genéricos
- Este es un comportamiento normal especificado en el estándar HTML, y se pueden controlar visualmente si se les aplican estilos en CSS
- Por ejemplo, se puede definir una etiqueta como
<cool-thing>y darle estilo en CSS concool-thing { ... }
-
Si el nombre de la etiqueta incluye un guion (-), no habrá riesgo de conflicto con posibles adiciones futuras al estándar HTML
- Ej.:
<main-article>,<quote-body>
- Ej.:
Mejora de legibilidad y estructura
- Si se usan etiquetas con nombres significativos en lugar de
<div>o<span>, el código se vuelve más fácil de entender- Por ejemplo, se puede usar
<article-header>en lugar de<div class="article-header">
- Por ejemplo, se puede usar
- En estructuras anidadas de
<div>, puede ser difícil ubicar qué etiqueta de cierre corresponde a qué parte, pero con nombres de etiqueta explícitos la estructura queda clara- Si dentro de
<main-article>se organiza con<article-header>,<article-quote>, etc., la estructura del DOM se entiende de forma intuitiva
- Si dentro de
Código de ejemplo
- Forma tradicional
<div class="cool-thing"> Hello, World! </div> - Forma con etiqueta personalizada
<cool-thing> Hello, World! </cool-thing>- En CSS, se puede aplicar estilo con algo como
cool-thing { display: block; font-weight: bold; text-align: center; ... }
- En CSS, se puede aplicar estilo con algo como
Conclusión
- Si se aprovecha la flexibilidad para definir etiquetas que permite el estándar HTML,
se puede escribir un marcado estructurado con alta legibilidad - Aun así, si ya existe una etiqueta semántica adecuada definida, debe priorizarse el uso de esa etiqueta existente
1 comentarios
Comentarios de Hacker News
Se enfatiza que
<tag-name>no es una etiqueta no reconocidaPresenta su publicación de blog y explica que, hasta que WHATWG agregue
<tagname>como nuevo elemento, este se trata como HTMLUnknownElement, mientras que<tag-name>es un HTMLElement válido, útil para maquetación y estilosSi se actualiza con la JavaScript Custom Elements API, se convierte en un elemento personalizado definido
Es un comportamiento estándar en todos los navegadores, y el W3C HTML Validator también reconoce los elementos personalizados con guion como HTMLElement
Sin embargo, la regla
[hidden]{display:none}de la hoja de estilos UA predeterminada no se hereda, así que hay que declararla manualmenteComo
<DIV>tienedisplay:blockpor defecto gracias a la hoja de estilos UA, en los elementos personalizados hay que establecer la propiedaddisplaydirectamenteLos selectores
:definedy:not(:defined)de CSS permiten distinguir entre elementos definidos y no definidosDeclarative Shadow DOM (
<template shadowrootmode="open">) también crea elementos personalizados no definidos de la misma formahiddenes un atributo de presentación HTML (presentation attribute)La hoja de estilos UA se aplica igual a los elementos personalizados, y la regla
[hidden]no existehiddenes un ejemplo de atributo que se interpreta como estilo, comoalign="right"-), porque habría permitido integrar de forma natural los espacios de nombres XMLMenciona que también habría sido posible convertir dos puntos en guiones en nginx o apache
Cierra con un tono nostálgico: “no podemos volver a 1999”
Señala que la estructura anidada de
<div>en el código de ejemplo es excesivaPropone que sería más apropiado usar etiquetas semánticas como
<article>,<header>y<blockquote>class, una etiqueta personalizada solo puede tener un nombreLas clases pueden ser varias y no tienen orden, pero los elementos personalizados anidados fuerzan un orden, así que es difícil expresar lo mismo
Considera que eso tenía sentido en 1996, pero ya no ahora
Comparte su experiencia usando elementos personalizados durante 3 o 4 años
La idea es ingeniosa, pero complicada en la práctica
Usar demasiadas etiquetas personalizadas reduce la legibilidad y dificulta distinguir entre bloques e inline
Como enfoque equilibrado, deja las etiquetas base tal como están y usa etiquetas personalizadas solo para elementos tipo componente como
<x-card>o<x-hero>Los subcomponentes se distinguen con el atributo
slot, como en<div slot="hero-blurb">Prefiere limitar las clases a modificaciones o personalización, y expresar la estructura mediante slots
Presenta Good.HTML, que creó él mismo, y explica que soporta autohook, interpolación basada en template literals y estructura de componentes ordenada
Añade que también implementó elementos personalizados self-closing como
< !app-header />mediante un truco con nodos de comentariosloten CSS, habría que usar algo comodiv[slot="hero-blurb"]Por defecto, las etiquetas personalizadas se comportan como
<span>Si hace falta, se puede definir su comportamiento con la Custom Element API
Cree que, para la mayoría de usuarios, la combinación de HTML + elementos personalizados habría sido mejor que una SPA
Comparte un ejemplo de Hypalink que creó él mismo y señala la subvaloración de Web Components
Presenta una etiqueta personalizada llamada
<yes-script>que implementa lo contrario de<noscript>Permite ocultar cierta área cuando JS está desactivado
Comparte el enlace del proyecto
@media (scripting)de CSS se puede lograr el mismo efecto solo con CSS puroAdjunta un enlace a la documentación de MDN
Comparte que en el pasado recreó por su cuenta la etiqueta eliminada
<blink>La implementó con jQuery y manipulando visibility, y dice que le sorprendió que el navegador permitiera etiquetas arbitrarias
No publicó el código porque eran apenas unas 10 líneas, aunque supone que hubo muchos intentos parecidos
<blink>, y que solo Firefox y Opera la soportaron hasta 2013<blink>también puede lograrse solo con CSSAñade que, si se usa el selector
blinken lugar de.blink, se aplica directamente a la etiqueta<blink>tiene demasiado peso semántico como para ofrecerse como un simple elemento HTML, y dice alegrarse de que haya desaparecidoSeñala que ejemplos como
<main-article>y<article-header>pueden sustituirse por etiquetas HTML realesSería más apropiado usar
<article>,<header>y<blockquote>Los elementos personalizados por defecto se renderizan inline como
<span>, pero basta con definir una propiedaddisplaypredeterminada con CSSAntes se evitaban por problemas de espacios de nombres, pero al permitir el estándar el guion (
-), el riesgo de conflicto desaparecióTambién funcionan sin problema en selectores CSS y se puede acceder a ellos con
querySelectorSiente que incluso sin frameworks como Vue, el HTML moderno ya es suficientemente expresivo
Esto está diseñado para que, al actualizarse en el futuro, la cadena de prototipos se extienda de forma natural
Para asignar estilos predeterminados a todos los elementos personalizados, basta con hacer algo así
Recuerda que el IE antiguo no reconocía las etiquetas HTML5, así que lo resolvió con un script que hizo alrededor de 2010
Si se creaba una vez la etiqueta con JS, IE pasaba a reconocerla, y luego ya no importaba borrarla
Dice que así se dio cuenta de que también se podían renderizar etiquetas arbitrarias
Comparte una entrada de blog de esa época