0Pricing
HTML Academy · Aula

Estendendo elementos integrados

Personalize elementos existentes com o atributo is.

Estendendo elementos integrados é uma aula grátis de HTML Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de HTML Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de HTML Academy inclui 4 aulas no total.

Dois tipos de elementos personalizados

A especificação define elementos personalizados autônomos (que estendem HTMLElement e são usados como <my-card>) e elementos integrados personalizados (que estendem uma classe nativa específica e são usados como <button is="my-button">). Os elementos integrados personalizados herdam gratuitamente a semântica nativa.

Por que estender um elemento nativo?

Um <my-button> autônomo não recebe nenhum comportamento nativo de <button> — não é ativado com Enter ou Espaço, não participa de formulários e não fornece role="button" para tecnologias assistivas. Um botão personalizado (is="my-button") herda tudo isso automaticamente.

Estendendo a classe

Estenda a classe HTML específica em vez de HTMLElement: class MyButton extends HTMLButtonElement {}. O elemento mantém todo o comportamento nativo — envio de formulários, gerenciamento do foco e estado desativado — e o senhor adiciona seus aprimoramentos por cima.

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

Registro com a opção de extensão

customElements.define("my-button", MyButton, { extends: "button" }). O terceiro argumento informa ao registro qual tag nativa o elemento estende. Sem esse argumento, o registro gera um erro.

O atributo de identificação

Use elementos integrados personalizados com o atributo de identificação na tag existente: <button is="my-button">Click</button>. Escrever <my-button> criaria um elemento autônomo e faria o componente perder o comportamento nativo.

O Safari não oferece suporte

O Safari se recusou a implementar elementos integrados personalizados, alegando preocupações de acessibilidade. Eles funcionam no Chrome, Edge e Firefox; no Safari, o atributo is é ignorado e o elemento se comporta como um <button> comum. Use o preenchimento de compatibilidade oficial quando for necessário oferecer suporte ao Safari.

Opções de preenchimento de compatibilidade

O preenchimento de compatibilidade @ungap/custom-elements restaura o suporte a elementos integrados personalizados no Safari. Ele é pequeno e bem mantido; inclua-o quando sua equipe precisar de suporte entre navegadores sem abandonar o padrão do atributo de identificação.

Alternativa autônoma

Se for importante oferecer suporte ao Safari sem um preenchimento de compatibilidade, crie um elemento autônomo e replique manualmente o comportamento necessário: adicione role="button", tabindex="0", manipuladores de teclado para Enter e Espaço e associação a formulários por meio do recurso ElementInternals.

API de associação a formulários

Os elementos autônomos podem participar do envio de formulários definindo static formAssociated = true e usando this.attachInternals(). O objeto ElementInternals retornado fornece setFormValue e setValidity para uma integração completa com formulários.

Quando escolher cada opção

Escolha elementos integrados personalizados para componentes que se comportam principalmente como um elemento nativo, como um botão aprimorado ou um campo de entrada inteligente, e quando sua plataforma de destino for Chrome/Firefox ou o senhor aceitar usar o preenchimento de compatibilidade. Escolha elementos autônomos para componentes totalmente novos, como cartões e caixas de diálogo, que não tenham um equivalente nativo.

Armadilha: botões autônomos

O erro mais comum ao criar componentes web é criar <my-button> como um elemento autônomo. Ele não enviará formulários, não responderá a Enter ou Espaço e não será anunciado como um botão. Estenda HTMLButtonElement ou replique cuidadosamente todos os comportamentos de um botão real.

Verificação de conhecimentos

Qual é a vantagem prática de estender HTMLButtonElement, criando um elemento integrado personalizado, em vez de estender HTMLElement, criando um elemento autônomo, para um componente semelhante a um botão?

Resumo

Os elementos integrados personalizados estendem uma classe HTML específica, como uma classe de botão ou de campo de entrada, e são usados por meio do atributo de identificação, herdando todo o comportamento nativo. Registre-os com a opção { extends: "button" }. O Safari não oferece suporte nativo a eles — use um preenchimento de compatibilidade ou elementos autônomos com replicação manual do comportamento quando for necessário oferecer suporte completo entre navegadores.

Perguntas Frequentes

A aula “Estendendo elementos integrados” é grátis?

Sim — o texto completo de “Estendendo elementos integrados” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de HTML Academy, atualize para CoddyKit PRO. O curso de HTML Academy inclui 4 aulas no total.

O que vou aprender em “Estendendo elementos integrados”?

Personalize elementos existentes com o atributo is. Você pratica HTML Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar HTML Academy?

Nenhuma experiência prévia é necessária. HTML Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.

Quanto tempo leva a aula “Estendendo elementos integrados”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de HTML Academy?

Sim. Cada aula de HTML Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. Definindo elementos com customElements.define
  2. connectedCallback e disconnectedCallback
  3. Atributos observados e attributeChangedCallback
  4. Estendendo elementos integrados
← Voltar para HTML Academy