A Simple Web Component's folder structure may look like this:
The HTML file for the layout and the JS file to register the functionality.
customElements.define('simple-custom', ...
The reserved word customElements
is a part of the CustomElementRegistry which is an interface in the DOM.
The define function can take multiple parameters:
define(name, constructor)
define(name, constructor, options)
This use of the define function gives the custom-element a name, and it defines the implementation of the class.
customElements.define('simple-custom', class extends HTMLElement { constructor() { super(); ...
It is a class definition which extends an HTMLElement followed by a constructor which must call super() first.
Creating the HTML Content
customElements.define('simple-custom', class extends HTMLElement { constructor() { super(); const divElem = this.createHTMLContent();
createHTMLContent() { const divElem = document.createElement('div'); divElem.textContent = this.getAttribute('text'); return divElem; }
Attaching a Shadow
customElements.define('simple-custom', class extends HTMLElement { constructor() { super(); const divElem = this.createHTMLContent(); this.createShadow(divElem); }
createShadow(divElem) { const shadowRoot = this.attachShadow({ mode: 'open' }); shadowRoot.appendChild(divElem); }
And the HTML
<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>:defined demo</title> <script src="main.js" defer></script> <style> p { background: yellow; } simple-custom { background: cyan; } :defined { font-style: italic; } simple-custom:not(:defined) { display: none; } simple-custom:defined { display: block; } </style> </head> <body> <h1><code>:defined</code> demo</h1> <simple-custom text="Custom element example text"></simple-custom> <p>Standard paragraph example text</p> </body> </html>
Top comments (0)