跳至主要內容

Web Component


Web Component

Web Components 是一组标准技术,用于创建可重用的自定义 HTML 元素,它们可以封装复杂的功能,并且可以在不同的页面和应用程序中使用。

Web Components 包含三个主要技术:Custom Elements、Shadow DOM 和 HTML Templates。

  1. Custom Elements

Custom Elements 允许开发者创建自定义的 HTML 元素,并在页面中使用它们。自定义元素可以封装任意的行为和功能,并且可以通过 JavaScript 进行操作和控制。

例如,以下代码定义了一个自定义元素 my-button,它继承自 HTMLButtonElement,当被单击时,会弹出一个对话框:

class MyButton extends HTMLButtonElement {
  constructor() {
    super();
    this.addEventListener('click', () => alert('Button clicked!'));
  }
}
customElements.define('my-button', MyButton, { extends: 'button' });

以上代码使用 ES6 的 class 语法定义了一个自定义元素 MyButton,它继承自 HTMLButtonElement。在构造函数中,使用 addEventListener() 方法监听 click 事件,并在事件处理函数中弹出一个对话框。最后,使用 customElements.define() 方法将自定义元素注册到文档中,名称为 my-button,继承自 button 元素。

  1. Shadow DOM

Shadow DOM 允许开发者创建封装的 DOM 树,用于隔离自定义元素的样式和行为,以便在页面中使用它们时不会受到外部样式和脚本的影响。

例如,以下代码定义了一个自定义元素 my-progress,它使用 Shadow DOM 封装了一个进度条:

class MyProgress extends HTMLElement {
  constructor() {
    super();
    const shadow = this.attachShadow({ mode: 'open' });
    const template = document.createElement('template');
    template.innerHTML = `
      <style>
        :host {
          display: block;
          width: 100%;
          height: 12px;
          border-radius: 6px;
          background-color: #eee;
        }
        #inner {
          display: block;
          width: ${this.getAttribute('value')}%;
          height: 100%;
          border-radius: 6px;
          background-color: #007aff;
        }
      </style>
      <div id="inner"></div>
    `;
    shadow.appendChild(template.content.cloneNode(true));
  }
  static get observedAttributes() {
    return ['value'];
  }
  attributeChangedCallback(name, oldValue, newValue) {
    if (name === 'value') {
      this.shadowRoot.querySelector('#inner').style.width = newValue + '%';
    }
  }
}
customElements.define('my-progress', MyProgress);

以上代码使用 ES6 的 class 语法定义了一个自定义元素 MyProgress,它继承自 HTMLElement。在构造函数中,使用 attachShadow() 方法创建一个 Shadow DOM,模式为 'open',表示可以从外部访问 Shadow DOM。然后,创建一个 HTML 模板,包含进度条的样式和 DOM 结构,并将其添加到 Shadow DOM 中。最后,使用 customElements.define() 方法将自定义元素注册到文档中,名称为 my-progress。

  1. HTML Templates

HTML Templates 允许开发者创建可重用的 HTML 模板,它们可以包含任意的 HTML、CSS 和 JavaScript 代码,并且可以在需要时进行实例化和使用。

例如,以下代码定义了一个 HTML 模板 my-template,它包含一个按钮和一个文本框:

const template = document.createElement('template');
template.innerHTML = `
  <style>
    button {
      background-color: #007aff;
      color: #fff;
      border: none;
      border-radius: 4px;
      padding: 8px 16px;
      font-size: 16px;
      cursor: pointer;
    }
    input {
      border: 1px solid #ccc;
      border-radius: 4px;
      padding: 8px;
      font-size: 16px;
    }
  </style>
  <button>Click me</button>
  <input type="text" placeholder="Enter your name">
`;
document.body.appendChild(template.content.cloneNode(true));

以上代码创建了一个 HTML 模板 template,包含一个按钮和一个文本框。在创建模板时,使用了 template 元素的 innerHTML 属性设置模板内容。然后,使用 document.body.appendChild() 方法将模板添加到文档中。

需要注意的是,HTML Templates 只定义了一个 HTML 模板,并不会自动实例化。开发者需要使用 JavaScript 代码将模板实例化,并将其添加到文档中。

上次编辑于:
贡献者: Neil