0Pricing
HTML Academy · Lección

Extender elementos integrados

Personalice elementos existentes con el atributo is

Extender elementos integrados es una lección gratuita de HTML Academy en CoddyKit. Esta es la lección 4 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de HTML Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de HTML Academy incluye 4 lecciones en total.

Dos tipos de elementos personalizados

La especificación define elementos personalizados autónomos (que extienden HTMLElement y se usan como <my-card>) y elementos integrados personalizados (que extienden una clase integrada específica y se usan como <button is="my-button">). Los elementos integrados personalizados heredan gratuitamente la semántica del elemento integrado.

¿Por qué extender un elemento integrado?

<my-button> autónomo no obtiene ninguno de los comportamientos integrados de <button>: no se activa con Intro o Espacio, no participa en formularios ni tiene role="button" para las tecnologías de asistencia. Un botón personalizado (is="my-button") hereda todo eso automáticamente.

Extensión de la clase

Extienda la clase HTML específica en lugar de HTMLElement: class MyButton extends HTMLButtonElement {}. El elemento conserva todo el comportamiento integrado —envío de formularios, gestión del foco y estado deshabilitado— y usted puede añadir sus mejoras.

class MyButton extends HTMLButtonElement {
  connectedCallback() {
    this.style.fontWeight = "bold";
  }
}

Registro con la opción extends

customElements.define("my-button", MyButton, { extends: "button" }). El tercer argumento indica al registro qué etiqueta integrada extiende el elemento. Sin él, el registro genera una excepción.

El atributo is

Use elementos integrados personalizados con el atributo is en la etiqueta existente: <button is="my-button">Click</button>. Escribir <my-button> en su lugar crearía un elemento autónomo y perdería el comportamiento integrado.

Safari no lo admite

Safari se ha negado a implementar los elementos integrados personalizados por motivos relacionados con la accesibilidad. Funcionan en Chrome, Edge y Firefox; en Safari, el atributo is se ignora y el elemento se comporta como un <button> normal. Use el polyfill oficial cuando necesite compatibilidad con Safari.

Opciones de polyfill

El polyfill @ungap/custom-elements restablece la compatibilidad con los elementos integrados personalizados en Safari. Es pequeño y recibe un buen mantenimiento; inclúyalo cuando su equipo necesite compatibilidad entre navegadores sin abandonar el patrón del atributo is.

Alternativa autónoma

Si necesita admitir Safari sin un polyfill, cree un elemento autónomo y replique manualmente el comportamiento necesario: añada role="button", tabindex="0", manejadores de teclado para Enter y Space, y asociación con formularios mediante la API ElementInternals.

API de asociación con formularios

Los elementos autónomos pueden participar en el envío de formularios estableciendo static formAssociated = true y usando this.attachInternals(). El objeto ElementInternals devuelto proporciona setFormValue y setValidity para una integración completa con formularios.

Cuándo elegir cada opción

Elija elementos integrados personalizados para componentes que se comporten principalmente como un elemento integrado (un botón mejorado o un campo de entrada inteligente) y cuando la plataforma de destino sea Chrome/Firefox o acepte usar el polyfill. Elija elementos autónomos para componentes completamente nuevos (tarjetas o cuadros de diálogo) que no tengan un equivalente integrado.

Error: botones autónomos

El error más común al crear componentes web es crear <my-button> como un elemento autónomo. No enviará formularios, no responderá a Intro ni a Espacio y no se anunciará como botón. Extienda HTMLButtonElement o replique cuidadosamente todos los comportamientos de un botón real.

Comprobación de conocimientos

¿Cuál es la ventaja práctica de extender HTMLButtonElement (elemento integrado personalizado) en lugar de extender HTMLElement (elemento autónomo) para un componente similar a un botón?

Resumen

Los elementos integrados personalizados extienden una clase HTML específica (HTMLButtonElement, HTMLInputElement) y se usan mediante el atributo is, por lo que heredan todo el comportamiento nativo. Regístrelos con la opción { extends: "button" }. Safari no los admite de forma nativa: use un polyfill o elementos autónomos con una réplica manual del comportamiento cuando necesite compatibilidad completa entre navegadores.

Preguntas frecuentes

¿La lección «Extender elementos integrados» es gratis?

Sí — el texto completo de «Extender elementos integrados» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de HTML Academy, actualiza a CoddyKit PRO. El curso de HTML Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Extender elementos integrados»?

Personalice elementos existentes con el atributo is Practicas HTML Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar HTML Academy?

No se requiere experiencia previa. HTML Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 4 de 4.

¿Cuánto tiempo toma la lección «Extender elementos integrados»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de HTML Academy?

Sí. Cada lección de HTML Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Definir elementos con customElements.define
  2. Los callbacks connectedCallback y disconnectedCallback
  3. Atributos observados y attributeChangedCallback
  4. Extender elementos integrados
← Volver a HTML Academy