等HTML元素,但我们可以通过浏览器API来定义自己的名字。自定义元素类似于那些标准的HTML元素,如或。展望未来,浏览器供应商已承诺不会创建名称中带有破折号的新内置元素,以防止冲突。自定义元素包含它们自己的语义、行为、标记,并且可以跨框架和浏览器共享。JSclassMyComponentextendsHTMLElement{connectedCallback(){this.innerHTML=`Helloworld`;}}customElements.define('my-component',MyComponent);HTMlResultHelloworld在这个例子中,我们定义了,我们自己的HTML元素。诚然,它的作用不大,但它是自定义元素的基本构建块。所有自定义元素都必须以某种方式扩展HTMLElement以便在浏览器中注册。自定义元素在没有第三方框架的情况下存在,浏览器供应商除了保证根据规范编写的组件不会破坏API更改外,还致力于规范的持续向后兼容性。更重要的是,这些组件通常可以与最流行的现有框架一起使用,包括Angular、React、Vue等,只需很少的努力。ShadowDOMShadowDOM是DOM的封装版本。这允许作者有效地将DOM片段彼此隔离,包括任何可用作CSS选择器的内容以及与之关联的样式。通常,文档范围内的任何东西都称为lightDOM,shadowroot内的任何东西都称为shadowDOM。使用轻型DOM时,可以使用document.querySelector('selector')或通过使用element.querySelector('selector')定位任何元素的子元素来选择元素;同理可以通过调用shadowRoot.querySelector来定位shadowRoot.querySelector根的子节点,其中shadowRoot是对文档片段的引用——不同的是影子根的子节点不能从轻量级DOM中选择。例如,如果我们有一个带有的影子根,调用shadowRoot.querySelector('button')将返回我们的按钮,但不调用文档的查询选择器将返回元素,因为它属于不同的DocumentOrShadowRoot实例.样式选择器的工作方式相同。在这方面,shadowDOM的工作方式类似于,其中的内容与文档的其余部分是隔离的;然而,当我们创建影子根时,我们仍然可以完全控制页面的那部分,但会根据上下文进行操作。这就是我们所说的封装。如果您曾经编写过重复使用相同内容或依赖CSS-in-JS工具或CSS命名策略(如BEM)的组件,那么影子DOM有可能改善您的开发人员体验。设想以下场景:<#shadow-root>这将使用CSS背景番茄#shadow-root>不是番茄