◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。
shadow dom 是现代 web 开发工具包中的一项强大功能,可帮助开发人员封装元素并隔离样式。本质上,shadow dom 允许您在与页面其余部分完全隔离的元素内创建“迷你 dom”。这意味着这个影子 dom 内的 css 和 javascript 不会干扰其外部的任何内容,反之亦然。
shadow dom 解决的关键问题之一是 css 样式泄漏,即为应用程序的一部分定义的样式无意中影响其他部分,从而导致缺乏可预测性和难以维护的代码。 shadow dom 创建样式边界,防止出现此问题。
这是一个 shadow dom 特别有用的示例用例:
假设您有一个聊天机器人小部件(例如 hexabot 小部件),您想要将其嵌入多个网站。每个网站都有自己的 css,某些样式可能会干扰您的小部件的外观和行为。例如,网站可能具有
为了防止网站的 css 与您的 widget 的 css 发生冲突,您可以利用 shadow dom 来封装您的 widget。这是一个简单的例子来说明这一点:
<script crossorigin src="https://unpkg.com/react@18/umd/react.production.min.js"></script><script crossorigin src="https://unpkg.com/react-dom@18/umd/react-dom.production.min.js"></script><link rel="stylesheet" href="./style.css"><script src="<<widget%20url>>/hexabot-widget.umd.js"></script><div id="hb-chat-widget"></div> <script> const el = react.createelement; const domcontainer = document.getelementbyid('hb-chat-widget'); reactdom.render( el(hexabotwidget, { apiurl: 'https://api.yourdomain.com', channel: 'offline', token: 'token123', }), domcontainer, ); </script>
在此示例中,网站中的任何全局样式都可能会干扰小部件的外观。
<script crossorigin src="https://cdn.jsdelivr.net/npm/react@18/umd/react.production.min.js"></script><script crossorigin src="https://cdn.jsdelivr.net/npm/react-dom@18/umd/react-dom.production.min.js"></script><script src="<<WIDGET%20URL>>/hexabot-widget.umd.js"></script><div id="hb-chat-widget"></div> <script> // Create the shadow root and attach it to the widget container const widgetContainer = document.getElementById('hb-chat-widget'); const shadowRoot = widgetContainer.attachShadow({ mode: 'open' }); // Create a new div inside the shadow root to serve as the rendering target const shadowContainer = document.createElement('div'); shadowRoot.appendChild(shadowContainer); // Add styles inside the shadow root by importing the CSS file into the shadow DOM const linkElement = document.createElement('link'); linkElement.rel = 'stylesheet'; linkElement.href = './style.css'; shadowRoot.appendChild(linkElement); // Render the widget inside the shadow root const el = React.createElement; ReactDOM.render( el(HexabotWidget, { apiUrl: 'https://api.yourdomain.com', channel: 'offline', token: 'token123', }), shadowContainer, ); </script>
在此版本中,小部件在影子根内渲染。这意味着为网站定义的样式不会影响小部件,反之亦然。小部件的 css 样式保持独立,确保嵌入小部件的任何网站的外观一致。
当您需要创建不受应用程序其他部分影响或影响应用程序其他部分的自包含组件时,shadow dom 非常有用。以下是您应该考虑使用它的一些场景:
通过封装组件的样式和行为,shadow dom 可以成为开发人员构建模块化、可重用且强大的 web 组件的重要工具。
hexabot 实时聊天小部件使用此方法来确保跨不同网站的无缝且一致的用户体验,而不受外部样式的任何干扰。如果您有兴趣看到这一点,请随时查看 hexabot 并为 github 存储库加注星标以支持该项目!
为 hexabot github 存储库加注星标 ⭐
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。