Inhaltsverzeichnis
Warum Shadow DOM verwenden?
Unser Beispiel
Shadow DOM verstehen
Was ist Shadow DOM?
Verwenden Sie
In unserem Beispiel verwenden wir customElements.define(), um ein neues benutzerdefiniertes Element zu erstellen. Wie im vorherigen Tutorial erwähnt, sollten neue Elemente „-“ im Namen enthalten.
第 4 步:向 Shadow DOM 添加样式
步骤 5. 在自定义组件中定义 HTML 元素
第 6 步:在 Shadow DOM 中使用槽
第 7 步:填充插槽
第 8 步:实现逻辑和交互性
第 9 步.定义生命周期方法
第 10 步。使用新组件!
结论
Heim Web-Frontend HTML-Tutorial Verbessern Sie HTML mit benutzerdefinierten Tags und Shadow DOM

Verbessern Sie HTML mit benutzerdefinierten Tags und Shadow DOM

Aug 29, 2023 am 09:37 AM

使用自定义标签和 Shadow DOM 增强 HTML

In meinem vorherigen Beitrag habe ich die Grundlagen der Erstellung benutzerdefinierter Etiketten erklärt. Tatsächlich beseitigen benutzerdefinierte Tags einen Teil der Sprödigkeit beim Erstellen großartiger Webanwendungen. Das Streben nach Kontrolle hört jedoch nicht auf und herkömmliche benutzerdefinierte Tags reichen nicht aus, um leistungsstarke Anwendungen zu erstellen. Beispielsweise kann sich die Anzahl der Stilselektoren in Ihrem Code durch das Hinzufügen benutzerdefinierter Tags erhöhen. Dies ist nur einer von vielen Faktoren, die zu Leistungsproblemen führen können.

Eine Möglichkeit, dieses Problem zu lösen, ist Shadow DOM.

Shadow DOM funktioniert durch die Einführung bereichsbezogener Stile. Es sind keine besonderen Namenskonventionen oder Tools erforderlich. Mit Shadow DOM ist die Bündelung von CSS mit Markup einfach. Darüber hinaus ermöglicht uns diese Funktion, alle Details zur Implementierung in einfachem JavaScript auszublenden.

Warum Shadow DOM verwenden?

Shadow DOM bietet die folgenden Lösungen:

  • Unabhängige Elemente im DOM zulassen. Abfragen wie document.querySelector geben keine verwaisten Elemente zurück.
  • Bereichsbezogenes CSS zulassen. Scoped CSS stellt sicher, dass alle Stilregeln innerhalb der Seite bleiben. Es bedeutet auch einfachere CSS-Selektoren ohne Namenskonflikte und viele gängige Klassen.

Unser Beispiel

Um Shadow DOM zu demonstrieren, verwenden wir eine einfache Komponente namens tuts-tabs. Alle Verweise in diesem Artikel verweisen auf diesen Code. Um Shadow DOM zu erleben, schauen Sie sich die Demo unten an:

Shadow DOM verstehen

Was ist Shadow DOM?

Bevor Sie mit dem Codieren mit Shadow DOM beginnen, müssen Sie das reguläre DOM verstehen.

HTML ist das Rückgrat Ihrer Website. In nur wenigen Minuten können Sie eine Seite erstellen. Wenn Sie die Seite in Ihrem Browser öffnen, kommt das DOM ins Spiel. Sobald der Browser die Seite lädt, beginnt er mit der Analyse des HTML-Codes in ein Datenmodell. Das Datenmodell ist eine Baumstruktur, in der die Knoten Elemente in HTML darstellen. Das Datenmodell lässt sich leicht mit Code ändern und manipulieren.

Der Nachteil besteht darin, dass ganze Webseiten oder sogar komplexe Webanwendungen als eine einzige Datenstruktur behandelt werden. Das ist nicht einfach zu debuggen! Beispielsweise kann sich ein auf eine Komponente angewendeter CSS-Stil letztendlich auf eine andere Komponente an anderer Stelle in der Anwendung auswirken.

Verwenden Sie iframes, wenn Sie einen Teil Ihrer Schnittstelle vom Rest isolieren möchten. Iframes sind jedoch umfangreich und äußerst restriktiv.

Aus diesem Grund wurde Shadow DOM eingeführt. Es handelt sich um eine leistungsstarke Funktion moderner Browser, die es Webentwicklern ermöglicht, Teilbäume verschiedener Elemente in das DOM einzubinden. Diese Unterbäume des DOM haben keinen Einfluss auf den Hauptdokumentbaum. Technisch gesehen werden sie „Schattenbäume“ genannt. Ein Schattenbaum hat eine

Schattenwurzel

, die an ein übergeordnetes Element im DOM angehängt ist. Dieser Elternteil wird „Shadow Host“ genannt. Wenn Sie beispielsweise in einen Browser mit WebKit-Unterstützung einbinden, wird dieser in einen Slider umgewandelt. Warum? Dies ist ein Schieberegler, da eines der Unterbaum-DOM-Elemente „Scope“ versteht, um sein Erscheinungsbild zu ändern und eine Schieberegler-ähnliche Funktionalität einzuführen. Dies ist ein Vorteil, den Shadow DOM für Tabs bietet.

Wow, das sind viele Theorien. Jetzt möchten Sie vielleicht etwas Code schreiben, um zu sehen, wie Shadow DOM implementiert wird.

<input type="range">Schritt-für-Schritt-Anleitung zur Verwendung von Shadow DOM

Schritt 1: Schatten-DOM-Element erstellen

Verwenden Sie

, um Shadow-DOM-Elemente zu erstellen.

In unserem Beispiel

sehen Sie den Code, der zum Erstellen eines Shadow-DOM-Elements verwendet wird. element.attachShadow()

 let shadowRoot = this.attachShadow({mode: 'open'});
Nach dem Login kopieren

Schritt 2. Inhalte zu Shadow Root hinzufügen

tuts-tabAls nächstes verwenden wir

, um Inhalte zum Schattenstamm hinzuzufügen. Beachten Sie, dass dies nicht die einzige Möglichkeit ist, das Shadow-DOM zu füllen. Es gibt viele APIs, die Ihnen beim Befüllen des Shadow DOM helfen.

shadowRoot.innerHTML = ``
Nach dem Login kopieren

Schritt 3: Benutzerdefinierte Elemente mit Shadow DOM verbinden

.innerHTMLDas Verbinden benutzerdefinierter Elemente mit Shadow DOM ist sehr einfach. Bedenken Sie, dass Sie durch die Kombination benutzerdefinierter Elemente mit Shadow DOM gekapselte Komponenten mit CSS, JavaScript und HTML erstellen können. Daher erstellen Sie eine völlig neue Webkomponente, die in Ihrer Anwendung wiederverwendet werden kann.

In unserem Beispiel verwenden wir customElements.define(), um ein neues benutzerdefiniertes Element zu erstellen. Wie im vorherigen Tutorial erwähnt, sollten neue Elemente „-“ im Namen enthalten.

Die Komponente erweitert HTMLElement.

当我们扩展 HTMLElement 时,在构造函数中调用 super() 非常重要。另外,构造函数是需要创建 shadowRoot 的地方。

customElements.define('tuts-tabs', class extends HTMLElement {
    constructor() {
    super(); // always call super() first in the constructor.

    // Attach a shadow root to <tuts-tabs>.
    const shadowRoot = this.attachShadow({mode: 'open'});
    ...
});
Nach dem Login kopieren

创建 shadowRoot 后,您可以为其创建 CSS 规则。 CSS 规则可以包含在 <style> 标记中,并且这些样式的范围仅限于 tuts-tab

customElements.define('tuts-tabs', class extends HTMLElement {
    constructor() {
    super(); 
    const shadowRoot = this.attachShadow({mode: 'open'});
    shadowRoot.innerHTML = `
         <!-- styles are scoped to tuts-tabs! -->
         <style>#tabs { ... }</style>
    `;
    }
    ...
});
Nach dem Login kopieren

第 4 步:向 Shadow DOM 添加样式

tuts-tab相关的CSS可以写在<style>标签内。请记住,此处声明的所有样式都将作用于 tuts-tab Web 组件。 作用域 CSS 是 Shadow DOM 的一项有用功能,它具有以下属性:

  • CSS 选择器不会影响 Shadow DOM 之外的组件。
  • Shadow DOM 中的元素不受其外部选择器的影响。
  • 样式的范围仅限于宿主元素。

如果你想在 Shadow DOM 中选择自定义元素,你可以使用 :host 伪类。当 :host 伪类用于普通 DOM 结构时,它不会产生任何影响。但在 Shadow DOM 内部,它会产生很大的差异。您将在 tuts-tab 组件中找到以下 :host 样式。它决定显示和字体样式。这只是一个简单的示例,展示如何将 :host 合并到 Shadow DOM 中。

:host 的一个问题是它的特殊性。如果父页面有 :host,它将具有更高的特异性。父样式内的所有样式都会获胜。这是从外部覆盖自定义元素内部样式的一种方法。

 :host {
  display: inline-block;
  width: 650px;
  font-family: 'Roboto Slab';
  contain: content;
}
Nach dem Login kopieren

随着 CSS 变得更简单,Shadow DOM 的整体效率也会提高。

下面定义的所有样式都是影子根的本地样式。

shadowRoot.innerHTML = `
<style>
:host {
  display: inline-block;
  width: 650px;
  font-family: 'Roboto Slab';
  contain: content;
}
#panels {
  box-shadow: 0 2px 2px rgba(0, 0, 0, .3);
  background: white;
  border-radius: 3px;
  padding: 16px;
  height: 250px;
  overflow: auto;
}
#tabs slot {
  display: inline-flex; /* Safari bug. Treats <slot> as a parent */
}
...
</style>
Nach dem Login kopieren

同样,您可以自由地在 Shadow DOM 中引入样式表。当您在 Shadow DOM 内链接样式表时,它们的作用域将位于 Shadow 树内。这是一个简单的例子来帮助您理解这个概念。

shadowRoot.innerHTML = `
<style>
:host {
  display: inline-block;
  width: 650px;
  font-family: 'Roboto Slab';
  contain: content;
}
#panels {
  box-shadow: 0 2px 2px rgba(0, 0, 0, .3);
  background: white;
  border-radius: 3px;
  padding: 16px;
  height: 250px;
  overflow: auto;
}
...
</style>
<link rel="stylesheet" href="styles.css">
...
Nach dem Login kopieren

步骤 5. 在自定义组件中定义 HTML 元素

接下来,我们可以定义 tuts-tab 的 HTML 元素。

在简单的选项卡结构中,应该有可单击的标题和反映所选标题内容的面板。这显然意味着我们的自定义元素应该有一个带有标题的 div 和一个用于面板的 div 。 HTML 组件将定义如下:

customElements.define('tuts-tabs', class extends HTMLElement {
    constructor() {
    super(); const shadowRoot = this.attachShadow({mode: 'open'});
    shadowRoot.innerHTML = `
        <style>#tabs { ... }</style>
        
        ....
        
        // Our HTML elements for tuts-tab
        <div id="tabs">...</div>
        <div id="panels">...</div>
        ...
    `;
    }
    ...
});
Nach dem Login kopieren

在面板的 div 中,您会遇到一个有趣的标签,名为 <slot>。我们的下一步是了解有关插槽的更多信息。

第 6 步:在 Shadow DOM 中使用槽

Slot 在 Shadow DOM API 中起着至关重要的作用。插槽充当自定义组件内的占位符。这些组件可以由您自己的标记填充。槽声明分为三种不同类型:

  1. 您可以拥有零个插槽的组件。
  2. 您可以创建一个包含后备内容或空内容的槽位。
  3. 您可以使用整个 DOM 树创建槽。

在我们的 tuts-tabs 中,我们有一个用于选项卡标题的命名槽,以及另一个用于面板的槽。命名槽会创建您可以通过名称引用的孔。

customElements.define('tuts-tabs', class extends HTMLElement {
    constructor() {
    super(); const shadowRoot = this.attachShadow({mode: 'open'});
    shadowRoot.innerHTML = `
        <style>#tabs { ... }</style>
        
        ....
        
        // Our HTML elements for tuts-tab
        <div id="tabs">
            <slot id="tabsSlot" name="title"></slot>
         </div>
        <div id="panels">
            <slot id="panelsSlot"></slot>
        </div>
        ...
    `;
    }
    ...
});
Nach dem Login kopieren

第 7 步:填充插槽

现在,是时候填充插槽了。在之前的教程中,我们了解了定义自定义元素的四种不同方法,并且 tuts-tabs 使用其中两种方法来构建选项卡:connectedCallbackdisconnectedCallback

connectedCallback 中,我们将填充步骤 6 中定义的槽。我们的 connectedCallback 将定义如下。我们使用 querySelector 来识别 tabsSlotpanelsSlot。当然,这并不是识别 HTML 中插槽的唯一方法。

识别槽后,您需要为其分配节点。在 tuts-tab 中,我们使用以下 tabsSlot.assignedNodes 来标识选项卡的数量。

connectedCallback() {
    ...
    const tabsSlot = this.shadowRoot.querySelector('#tabsSlot');
    const panelsSlot = this.shadowRoot.querySelector('#panelsSlot');

    this.tabs = tabsSlot.assignedNodes({flatten: true});
    this.panels = panelsSlot.assignedNodes({flatten: true}).filter(el => {
      return el.nodeType === Node.ELEMENT_NODE;
    });
    ...
  }
Nach dem Login kopieren

此外,connectedCallback 是我们注册所有事件监听器的地方。每当用户单击选项卡标题时,面板的内容都需要更改。可以在 connectedCallback 函数中注册用于实现此目的的事件侦听器。

第 8 步:实现逻辑和交互性

我们不会深入探讨如何实现选项卡及其功能的逻辑。但是,请记住,我们的自定义 tuts-tab 组件中实现了以下方法,用于在选项卡之间切换:

  1. onTitleClick 该方法捕获选项卡标题上的点击事件。它有助于在选项卡面板内切换内容。
  2. selectTab该函数负责隐藏面板和显示右侧面板。此外,它还负责突出显示所选的选项卡。
  3. findFirstSelected此方法用于在第一次加载时选择选项卡。
  4. selected这是一个用于获取所选选项卡的 getter 和 setter。

第 9 步.定义生命周期方法

继续,不要忘记定义 disconnectedCallback。这是自定义元素中的生命周期方法。当自定义元素从视图中销毁时,会触发此回调。这是在应用程序中删除操作侦听器和重置控件的最佳位置之一。但是,回调的范围仅限于自定义元素。在我们的例子中,它将是 tuts-tab

第 10 步。使用新组件!

最后一步是在 HTML 中使用 tuts-tab 。我们可以很容易地在 HTML 标记中插入 tuts-tab 。这是一个简单的例子来演示其用法。

<tuts-tabs background>
  <button slot="title">Tab 1</button>
  <button slot="title" selected>Tab 2</button>
  <button slot="title">Tab 3</button>
  <section>content panel 1</section>
  <section>content panel 2</section>
  <section>content panel 3</section>
</tuts-tabs>
Nach dem Login kopieren

结论

我们开始了!我们已经完成了一个重要教程,在该教程中我们创建并使用了自定义元素。该过程很简单,并且在开发网页时被证明非常有用。我希望您尝试创建自定义元素并与我们分享您的经验。

Das obige ist der detaillierte Inhalt vonVerbessern Sie HTML mit benutzerdefinierten Tags und Shadow DOM. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Repo: Wie man Teamkollegen wiederbelebt
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
1 Monate vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Schwierigkeiten bei der Aktualisierung der Zwischenspeicherung offizieller Konto -Webseiten: Wie vermeiden Sie den alten Cache, der sich auf die Benutzererfahrung nach der Versionsaktualisierung auswirkt? Schwierigkeiten bei der Aktualisierung der Zwischenspeicherung offizieller Konto -Webseiten: Wie vermeiden Sie den alten Cache, der sich auf die Benutzererfahrung nach der Versionsaktualisierung auswirkt? Mar 04, 2025 pm 12:32 PM

Das offizielle Konto -Webseite aktualisiert Cache, dieses Ding ist einfach und einfach und es ist kompliziert genug, um einen Topf davon zu trinken. Sie haben hart gearbeitet, um den offiziellen Account -Artikel zu aktualisieren, aber der Benutzer hat die alte Version immer noch geöffnet. Schauen wir uns in diesem Artikel die Wendungen und Wendungen und wie man dieses Problem anmutig ansehen. Nach dem Lesen können Sie sich leicht mit verschiedenen Caching -Problemen befassen, sodass Ihre Benutzer immer den frischesten Inhalt erleben können. Sprechen wir zuerst über die Grundlagen. Um es unverblümt auszudrücken, speichert der Browser oder Server einige statische Ressourcen (wie Bilder, CSS, JS) oder Seiteninhalte, um die Zugriffsgeschwindigkeit zu verbessern. Wenn Sie das nächste Mal darauf zugreifen, können Sie ihn direkt aus dem Cache abrufen, ohne ihn erneut herunterzuladen, und es ist natürlich schnell. Aber dieses Ding ist auch ein zweischneidiges Schwert. Die neue Version ist online,

Wie füge ich PNG -Bildern auf Webseiten effizient Schlaganfalleffekte hinzu? Wie füge ich PNG -Bildern auf Webseiten effizient Schlaganfalleffekte hinzu? Mar 04, 2025 pm 02:39 PM

Dieser Artikel zeigt einen effizienten PNG -Grenzzusatz zu Webseiten mithilfe von CSS. Es wird argumentiert, dass CSS im Vergleich zu JavaScript oder Bibliotheken eine überlegene Leistung bietet, um zu beschreiben, wie die Randbreite, Stil und Farbe für subtile oder herausragende Effekte angepasst werden können

Wie verwende ich HTML5 -Formularvalidierungsattribute, um die Benutzereingabe zu validieren? Wie verwende ich HTML5 -Formularvalidierungsattribute, um die Benutzereingabe zu validieren? Mar 17, 2025 pm 12:27 PM

In dem Artikel werden unter Verwendung von HTML5 -Formularvalidierungsattributen wie Erforderlich, Muster, Min, MAX und Längengrenzen erörtert, um die Benutzereingabe direkt im Browser zu validieren.

Was ist der Zweck des & lt; datalist & gt; Element? Was ist der Zweck des & lt; datalist & gt; Element? Mar 21, 2025 pm 12:33 PM

Der Artikel erörtert den HTML & lt; Datalist & gt; Element, das die Formulare verbessert, indem automatische Vorschläge bereitgestellt, die Benutzererfahrung verbessert und Fehler reduziert werden.Character Count: 159

Was ist der Zweck des & lt; Fortschritts & gt; Element? Was ist der Zweck des & lt; Fortschritts & gt; Element? Mar 21, 2025 pm 12:34 PM

Der Artikel erörtert den HTML & lt; Progress & gt; Element, Absicht, Styling und Unterschiede vom & lt; Meter & gt; Element. Das Hauptaugenmerk liegt auf der Verwendung & lt; Fortschritt & gt; Für Aufgabenabschluss und & lt; Meter & gt; für stati

Was sind die besten Praktiken für die Kompatibilität des Cross-Browsers in HTML5? Was sind die besten Praktiken für die Kompatibilität des Cross-Browsers in HTML5? Mar 17, 2025 pm 12:20 PM

In Artikel werden Best Practices zur Gewährleistung der HTML5-Cross-Browser-Kompatibilität erörtert und sich auf die Erkennung von Merkmalen, die progressive Verbesserung und die Testmethoden konzentriert.

Was ist der Zweck des & lt; Meter & gt; Element? Was ist der Zweck des & lt; Meter & gt; Element? Mar 21, 2025 pm 12:35 PM

Der Artikel erörtert das HTML & lt; Meter & gt; Element, verwendet zur Anzeige von Skalar- oder Bruchwerten innerhalb eines Bereichs und seine gemeinsamen Anwendungen in der Webentwicklung. Es differenziert & lt; Meter & gt; von & lt; Fortschritt & gt; und Ex

Was ist der Zweck des & lt; iframe & gt; Etikett? Was sind die Sicherheitsüberlegungen bei der Verwendung? Was ist der Zweck des & lt; iframe & gt; Etikett? Was sind die Sicherheitsüberlegungen bei der Verwendung? Mar 20, 2025 pm 06:05 PM

Der Artikel erörtert das & lt; iframe & gt; Der Zweck von Tag, externe Inhalte in Webseiten, seine gemeinsamen Verwendungen, Sicherheitsrisiken und Alternativen wie Objekt -Tags und APIs einzubetten.

See all articles