Maison> interface Web> tutoriel HTML> le corps du texte

Améliorez le HTML avec des balises personnalisées et Shadow DOM

WBOY
Libérer: 2023-08-29 09:37:07
original
940 Les gens l'ont consulté

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

Dans mon article précédent, j'ai expliqué les bases de la création d'étiquettes personnalisées. En fait, les balises personnalisées éliminent une partie de la fragilité lors de la création d’applications Web de qualité. Cependant, la recherche du contrôle ne s’arrête pas et les balises personnalisées traditionnelles ne suffisent pas à créer des applications riches en performances. Par exemple, le nombre de sélecteurs de style dans votre code peut augmenter avec l'ajout de balises personnalisées. Ce n’est qu’un des nombreux facteurs pouvant entraîner des problèmes de performances.

Une façon de résoudre ce problème consiste à utiliser Shadow DOM.

Shadow DOM fonctionne en introduisant des styles étendus. Il ne nécessite aucune convention ou outil de dénomination particulier. Avec Shadow DOM, regrouper CSS avec du balisage est facile. De plus, cette fonctionnalité nous permet de masquer tous les détails sur l'implémentation en simple JavaScript.

Pourquoi utiliser Shadow DOM ?

Shadow DOM fournit les solutions suivantes :

  • Autoriser les éléments indépendants dans le DOM. Les requêtes telles quedocument.querySelectorne renverront pas d'éléments orphelins.
  • Autoriser le CSS étendu. Le CSS étendu garantit que toutes les règles de style restent dans la page. Cela signifie également des sélecteurs CSS plus simples, sans aucun conflit de noms et de nombreuses classes communes.

Notre exemple

Pour démontrer Shadow DOM, nous utiliserons un composant simple appelétuts-tabs. Toutes les références dans cet article pointeront vers ce code. Pour découvrir Shadow DOM, jetez un œil à la démo ci-dessous :

Comprendre Shadow DOM

Qu'est-ce que Shadow DOM ?

Avant de commencer à coder avec Shadow DOM, vous devez comprendre le DOM standard.

Le HTML est l'épine dorsale de votre site Web. En quelques minutes seulement, vous pouvez créer une page. Lorsque vous ouvrez la page dans votre navigateur, le DOM entre en jeu. Une fois que le navigateur charge la page, il commence à analyser le code HTML dans un modèle de données. Le modèle de données est une structure arborescente dans laquelle les nœuds représentent des éléments en HTML. Le modèle de données est facile à modifier et à manipuler avec du code.

L'inconvénient est que des pages Web entières ou même des applications Web complexes sont traitées comme une structure de données unique. Ce n'est pas facile à déboguer ! Par exemple, un style CSS appliqué à un composant peut finir par affecter un autre composant ailleurs dans l'application.

Utiliseziframes lorsque vous souhaitez isoler une partie de votre interface du reste. Mais les iframes sont lourdes et extrêmement restrictives.

C'est pourquoi Shadow DOM a été introduit. Il s'agit d'une fonctionnalité puissante des navigateurs modernes qui permet aux développeurs Web d'inclure des sous-arbres de divers éléments dans le DOM. Ces sous-arborescences du DOM n'affectent pas l'arborescence principale du document. Techniquement, ils sont appelésShadow Trees.

Un arbre d'ombre a uneracine d'ombre, qui est attachée à un parent dans le DOM. Ce parent s'appelle leShadow Host.

Par exemple, si vous branchezsur un navigateur alimenté par WebKit, il sera converti en slider. Pourquoi? Il s'agit d'un curseur car l'un des éléments DOM du sous-arbre comprend la « portée » pour modifier son apparence et introduire une fonctionnalité de type curseur. C'est un avantage que Shadow DOM apporte aux onglets.

Wow, ça fait beaucoup de théories. Maintenant, vous souhaiterez peut-être écrire du code pour voir comment Shadow DOM est implémenté.

Guide étape par étape pour utiliser Shadow DOM

Étape 1 : Créer l'élément Shadow DOM

Utilisezelement.attachShadow()pour créer des éléments Shadow DOM.

Dans notre exempletuts-tabvous verrez le code utilisé pour créer un élément Shadow DOM.

let shadowRoot = this.attachShadow({mode: 'open'});
Copier après la connexion

Étape 2. Ajouter du contenu à Shadow Root

Ensuite, nous utiliserons.innerHTMLpour ajouter du contenu à la racine fantôme. Notez que ce n'est pas la seule façon de remplir le Shadow DOM. Il existe de nombreuses API qui vous aident à remplir le Shadow DOM.

shadowRoot.innerHTML = ``
Copier après la connexion

Étape 3 : Connectez les éléments personnalisés au Shadow DOM

Connecter des éléments personnalisés à Shadow DOM est très simple. Gardez à l'esprit que lorsque vous combinez des éléments personnalisés avec Shadow DOM, vous pourrez créer des composants encapsulés à l'aide de CSS, JavaScript et HTML. Par conséquent, vous allez créer un tout nouveau composant Web qui pourra être réutilisé dans votre application.

Dans notre exemple, nous utilisonscustomElements.define()pour créer un nouvel élément personnalisé. Comme mentionné dans le tutoriel précédent, les nouveaux éléments doivent contenir "-" dans leur nom.customElements.define()创建一个新的自定义元素。正如上一教程中提到的,新元素的名称中应包含“-”。tuts-tabs组件扩展了HTMLElementLe composant étendHTMLElement.

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

customElements.define('tuts-tabs', class extends HTMLElement { constructor() { super(); // always call super() first in the constructor. // Attach a shadow root to . const shadowRoot = this.attachShadow({mode: 'open'}); ... });
Copier après la connexion

创建shadowRoot后,您可以为其创建 CSS 规则。 CSS 规则可以包含在 `; } ... });

Copier après la connexion

第 4 步:向 Shadow DOM 添加样式

tuts-tab相关的CSS可以写在

Copier après la connexion

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

shadowRoot.innerHTML = `   ...
Copier après la connexion

步骤 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 = `  .... // Our HTML elements for tuts-tab 
...
...
... `; } ... });
Copier après la connexion

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

第 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 = `  .... // Our HTML elements for tuts-tab 
... `; } ... });
Copier après la connexion

第 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; }); ... }
Copier après la connexion

此外,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。这是一个简单的例子来演示其用法。

    
content panel 1
content panel 2
content panel 3
Copier après la connexion

结论

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!