--- title: Web Components slug: Web/Web_Components translation_of: Web/Web_Components ---
{{DefaultAPISidebar("Web Components")}}

Web Components é uma suíte de diferentes tecnologias que permite a criação de elementos customizados reutilizáveis — com a funcionalidade separada do resto do seu código — e que podem ser utilizados em suas aplicações web.

Conceitos e uso

Como desenvolvedores, sabemos que é uma boa ideia reutilizar o código o máximo que pudermos. Tradicionalmente, isso não tem sido fácil quando o assunto são estruturas de marcação customizadas — pense no complexo HTML (e estilo e script associados) que, às vezes, deve ser escrito para renderizar controles UI customizados e em como utilizá-los repetidas vezes pode tornar sua página uma bagunça se você não tomar cuidado.

Web Components buscam resolver esses problemas — são formados por três tecnologias principais, que podem ser usadas em conjunto para criar elementos customizados versáteis, com funcionalidade encapsulada, que podem ser reutilizados onde você quiser sem preocupação com conflito de código.

A abordagem básica para se implementar um componente web geralmente se parece com isso:

  1. Crie uma classe na qual você especifica a funcionalidade do seu componente web, usando a sintaxe de classe do ECMAScript 2015 (veja Classes para mais informações). 
  2. Registre seus elemento customizado através do método {{domxref("CustomElementRegistry.define()")}}, passando o nome do elemento a ser definido, a classe ou função na qual sua funcionalidade foi especificada, e opcionalmente, de qual elemento ele herda suas propriedades.
  3. Se necessário, incorpore um shadow DOM ao elemento customizado usando o método {{domxref("Element.attachShadow()")}}. Adicione elementos filhos, listeners, etc., ao shadow DOM usando métodos normais de DOM.
  4. Se necessário, defina um template HTML usando {{htmlelement("template")}} e {{htmlelement("slot")}}. Novamente, use os métodos normais de DOM methods para clonar o template e inclui-la ao shadow DOM.
  5. Use seu elemento customizado onde você preferir em sua página, da mesma forma que usaria qualquer outro elemento HTML.

Tutoriais

Usando elementos customizados
Um guia que mostra como usar os recursos de elementos customizados para criar componentes web simples, além de como analisar o ciclo de vida das funções de retorno e outros recursos mais avançados.
Usando shadow DOM
Um guia que analisa os fundamentos do shadow DOM, mostrando como incorporá-lo a um elemento, adicioná-lo à árvore do shadow DOM, estilizá-lo, etc.
Usando templates e slots
Um guia que mostra como definir uma estrutura HTML reutilzável através dos elementos {{htmlelement("template")}} e {{htmlelement("slot")}}, e como utilizar essa estrutura dentro de elementos web.

Referência

Elementos customizados

{{domxref("CustomElementRegistry")}}
Contém funcionalidade relacionada a elementos personalizados, principalmente o método {{domxref("CustomElementRegistry.define()")}} usado para registrar novos elementos personalizados, para que possam ser usados ​​em seu documento.
{{domxref("Window.customElements")}}
Retorna uma referência ao objeto CustomElementRegistry.
Callbacks do ciclo de vida
Funções callback especiais definidas dentro da definição de classe de elemento customizado, afetando seu comportamento:
Extensões para criação de elementos built-in customizados
CSS pseudo-classes
Pseudo-classes relacionadas especificamente a elementos customizados:
CSS pseudo-elementos
Pseudo-elementos relacionados especificamente a elementos customizados:

Shadow DOM

{{domxref("ShadowRoot")}}
Representa o nó raíz de uma sub-árvore DOM fantasma.
{{domxref("DocumentOrShadowRoot")}}
Um mixin que define funcionalidades que ficam disponíveis através do documento e das raízes fantasma.
Extensões {{domxref("Element")}}
Extensões à interface Element relacionado ao shadow DOM:
Adições relevantes {{domxref("Node")}}
Adicionais à interface Node pertinentes ao shadow DOM:
Extensões {{domxref("Event")}} 
Extensões para a interface de Event relacionado a shadow DOM:

Templates HTML

{{htmlelement("template")}}
Contém um fragmento HTML que não é renderizado quando um documento que o contém é inicialmente carregado, mas pode ser exibido em tempo de execução usando JavaScript, geralmente utilizado como base de estruturas de elementos customizados. A interface DOM associada é {{domxref("HTMLTemplateElement")}}.
{{htmlelement("slot")}}
Um placeholder dentro de um web component que você pode preencher com seu texto de marcação, permitindo criar árvores DOM separadas e apresentar delas juntas. A interface DOM associada é a {{domxref("HTMLSlotElement")}}.
O atributo HTML global slot
Atribui um slot em uma árvore shadow DOM a um elemento.
{{domxref("Slotable")}}
Um mixin implementado por ambos os nós {{domxref("Element")}} e{{domxref("Text")}} definindo funcionalidades que permitem tornar-se conteúdo de um elemento {{htmlelement("slot")}}. O mixin define um atributo, {{domxref("Slotable.assignedSlot")}}, o qual retorna uma referência do slot em que o nó está sendo inserido.
Extensões {{domxref("Element")}}
Extensões para a interface de Element relacionado a slots:
Pseudo-elementos CSS
Pseudo-elementos relacionados especificamente a slots:
O evento {{event("slotchange")}}
Disparado em uma instância {{domxref("HTMLSlotElement")}} (elemento {{htmlelement("slot")}}) quando há mudança no nó(s) contido naquele slot.

Exemplos

Estamos construindo alguns exemplos em nosso repo do GitHub web-components-examples.
Mais exemplos serão adicionados com o passar do tempo.

Especificações

Especificação Status Comentário
{{SpecName("HTML WHATWG","scripting.html#the-template-element","<template> element")}} {{Spec2("HTML WHATWG")}} Definição de {{HTMLElement("template")}}.
{{SpecName("HTML WHATWG","custom-elements.html#custom-elements","custom elements")}} {{Spec2("HTML WHATWG")}} Definição de Elementos HTML Customizados.
{{SpecName("DOM WHATWG","#shadow-trees","shadow trees")}} {{Spec2("DOM WHATWG")}} Definição de Shadow DOM.
{{SpecName("HTML Imports", "", "")}} {{Spec2("HTML Imports")}} Definição inicial de HTML Imports.
{{SpecName("Shadow DOM", "", "")}} {{Spec2("Shadow DOM")}} Definição inicial de Shadow DOM.

Compatibilidade com navegadores

Em geral:

Para obter informações detalhadas sobre o suporte de funções específicas nos navegadores, você deve consultar as páginas de referência listadas abaixo.

Veja também