首页 > 其他分享 >shadow DOM

shadow DOM

时间:2023-02-23 15:36:25浏览次数:42  
标签:DOM 元素 添加 attachShadow shadow Shadow

https://developer.mozilla.org/zh-CN/docs/Web/Web_Components/Using_shadow_DOM

  • Web components 的一个重要属性是封装——可以将标记结构、样式和行为隐藏起来,并与页面上的其他代码相隔离,保证不同的部分不会混在一起,可使代码更加干净、整洁
    • 注释:每个Shadow DOM都有一个根节点,这个根节点挂载到正常dom下,作为它的子节点。
  • 你可以使用同样的方式来操作 Shadow DOM,就和操作常规 DOM 一样——例如添加子节点、设置属性,以及为节点添加自己的样式(例如通过 element.style 属性),或者为整个 Shadow DOM 添加样式(例如在 <style> 元素内添加样式)
  • Shadow DOM 内部的元素始终不会影响到它外部的元素(除了 :focus-within),这为封装提供了便利
    • 注释::focus-within 是一个CSS 伪类 ,表示一个元素获得焦点,或,该元素的后代元素获得焦点。换句话说,元素自身或者它的某个后代匹配 :focus 伪类
    • 注释:外部也不会影响到内部
  • 默认播放控制按钮的 <video> 元素为例。你所能看到的只是一个 <video> 标签,实际上,在它的 Shadow DOM 中,包含了一系列的按钮和其他控制器。Shadow DOM 标准允许你为你自己的元素(custom element)维护一组 Shadow DOM。
  • 可以使用 Element.attachShadow() 方法来将一个 shadow root 附加到任何一个元素上。它接受一个配置对象作为参数,该对象有一个 mode 属性,值可以是 open 或者 closed:
    • open 表示可以通过页面内的 JavaScript 方法来获取 Shadow DOM,例如使用 Element.shadowRoot 属性:
    • 注释:elementRef.attachShadow 是把一个 dom 结构渲染成 Shadow DOM。然后这个 shadow 可以像普通 dom 一样,通过 appendChild 添加到其他 dom 上
let shadow = elementRef.attachShadow({mode: 'open'});
let shadow = elementRef.attachShadow({mode: 'closed'});
  • 浏览器中的某些内置元素就是如此,例如<video>,包含了不可访问的 Shadow DOM
  • 实现一个示例
    • 在构造函数中,我们首先将 Shadow root 附加到 custom element 上:
    • 注释:class 的方式可以通过 this.attachShadow 去声明一个容器,然后把根节点添加到这个容器上,从而把这个根节点创造为Shadow DOM
class PopUpInfo extends HTMLElement {
  constructor() {
    // 必须首先调用 super 方法
    super();

    // 创建 shadow root
    var shadow = this.attachShadow({mode: 'open'});
    // 将所创建的元素添加到 Shadow DOM 上
    shadow.appendChild(style);
    shadow.appendChild(wrapper);
    wrapper.appendChild(icon);
    wrapper.appendChild(info);

    // 元素的具体功能写在下面
    
    ...
  }
}
  • 因为<link> 元素不会打断 shadow root 的绘制,因此在加载样式表时可能会出现未添加样式内容(FOUC),导致闪烁

标签:DOM,元素,添加,attachShadow,shadow,Shadow
From: https://www.cnblogs.com/qq3279338858/p/17148124.html

相关文章

  • vue虚拟Dom详解
    1.什么是虚拟dom?虚拟dom本质上是一个js对象,用来描述视图的界面结构,在vue中,每个组件都有一个render函数,每个render函数都会返回一个虚拟dom树,这意味着每个组件都对应着一......
  • Vue如何渲染几千几万条数据(DOM)而不卡顿
    首先介绍原生的js渲染大量DOM会出现的问题和解决方法一、渲染大量DOM会出现的问题会出现较长的白屏事件。<html> <head> <title>渲染会卡的代码示例</title> </he......
  • E006Web学习笔记-JavaScript(四):DOM
    一、概述1、简介DocumentObjectModel文档对象模型;将标记语言文档的各个部分,封装为对象,可以使用这些对象,对标记语言文档进行CRUD(增删改查)的动......
  • js操作shadow-root内的DOM元素
    其实就是documentfragment元素,就是动态生成的文档碎片元素。1,项目中在DOM结构里遇到了shadow-root(open),用JS方法无法直接获取其内的DOM元素2、shadow DOMWebcompon......
  • cpp generate template random number
    #include<iostream>#include<random>template<typenameT>Tgen_random(Tmin,Tmax){std::random_devicerd;std::mt19937_64mt(rd()......
  • virtual DOM VS shadow DOM
    virtualDOM在JS里头构建当前DOM树结构,然后精准计算需要更新的DOM元素,来提升性能  shadowDOM封装组件,隐藏内部的复杂DOM结构<inputtype="range"/>打开浏览器的......
  • Java基础——数组的初始化与赋值、循环遍历,Random随机数[大于等于0,小于所给值)
    packagecom.zhao.demo;publicclassDemo05{//数组的静态初始化/*publicstaticvoidmain(String[]args){int[]arr1=newint[]{11,22,33};......
  • Clock Domain Crossing
    ClockDomainCrossingCDC问题主要有亚稳态问题,多比特信号同步,握手信号同步,异步Fifo....TopicsDescribetheSoCDesignIssuesUnderstandthetranditonalverifi......
  • vue2 - $nextTick 在下一次DOM更新结束后 指定其回调
    Vue实现响应式并不是数据发⽣变化之后DOM⽴即变化,⽽是按⼀定的策略进⾏DOM的更新。$nextTick是在下次DOM更新循环结束之后执⾏延迟回调,在修改数据之后使⽤$next......
  • typescript 声明、获取dom元素
    获取已有的dom元素constarrows=document.querySelectorAll('.arrows');获取DOM数组,比如有时候只有在请求数据后界面才渲染,我是在vue里面需要处理一些罗里吧嗦的功能......