首页 > 其他分享 >【学习记录】 shadow-dom

【学习记录】 shadow-dom

时间:2022-10-26 13:12:52浏览次数:65  
标签:style img 记录 dom var shadow icon

优点:内部 dom结构 不向外暴露(可以设置)

网页结构更加简洁,同时外部样式不影响内部,比如html5video 标签就使用了 shadow dom

shadow-dom 结构

使用

大致过程:

  1. 创建 shadow host 类并继承 HTMLElement
  2. 在类的构造函数中创建 shadow root 结点
  3. 创建的结点都绑定到 shadow root
  4. customElements 注册 shadow host
  5. html 使用

代码如下(mdn的例子):

class PopUpInfo extends HTMLElement {
  constructor() {
    super();
    // mode 有两个选项值:open 和 closed,表示是否可以通过 shadowRoot 属性
    // 获取 shadow dom,从而对内部 dom 进行一些操作
    var shadow = this.attachShadow({ mode: 'open' });

    // create span
    var wrapper = document.createElement('span');
    wrapper.setAttribute('class', 'wrapper');
    var icon = document.createElement('span');
    icon.setAttribute('class', 'icon');
    icon.setAttribute('tabindex', 0);
    var info = document.createElement('span');

    // get props and append to info element
    var text = this.getAttribute('text');
    info.textContent = text;

    // insert icon
    var imgUrl;
    if (this.hasAttribute('img')) {
      imgUrl = this.getAttribute('img');
    } else {
      imgUrl = 'img/default.png';
    }

    var img = document.createElement('img');
    img.src = imgUrl;
    icon.appendChild(img);

    // create a style element
    // add style on tag's attributes or create a style element
    // or through <link> get it

    // vay style = document.createElement('style');
    // ...

    // shadow.appendChild(style);
    shadow.appendChild(wrapper);
    shadow.appendChild(icon);
    shadow.appendChild(info);
  }
}

// define a new element
customElements.define('popup-info', PopUpInfo);

// html file
<popup-info img="213.png" text="build a shadow dom"></popup-info>

一些操作

1.外部如何对内部的进行 dom 操作?

// 前提 {mode:'open'}
var shadowRoot = document.querySelector('popup-info').shadowRoot;

2.外部如何对内部的进行 样式操作?

通过 伪类(兼容差) 或者使用 link 标签链接外部样式表,属性传值也能达到效果


3.其他

组件通信通过属性绑定即可完成

标签:style,img,记录,dom,var,shadow,icon
From: https://www.cnblogs.com/chenmijiang/p/16827981.html

相关文章

  • 探索使用 ViewContainerRef 的 Angular DOM 操控技术
    探索使用ViewContainerRef的AngularDOM操控技术https://indepth.dev/posts/1052/exploring-angular-dom-manipulation-techniques-using-viewcontainerref每当我阅......
  • 记录
    <scripttype="text/javascript">$(function(){letv=urlparam.get('key');storage.set("key",v);$("#app").validate({......
  • 关于Centos虚拟机简单记录
    1.解决关于复制粘贴的问题2.调大虚拟机窗口......
  • 部署spingboot项目到云服务器踩坑记录
    按教程部署mall电商系统https://www.macrozheng.com/mall/deploy/mall_deploy_docker.html#docker环境安装只记录SpringBoot应用部署这部分一、本地电脑安装maven官......
  • DOM 第一章 获取元素事件
    ##1.1.WebAPI介绍###1.1.1API的概念API(ApplicationProgrammingInterface,应用程序编程接口)是一些预先定义的函数,目的是提供应用程序与开发人员基于某软件或硬件得......
  • 使用Spring AOP实现系统操作日志记录
    使用SpringAOP实现系统操作日志记录一、什么是SpringSpring是一个广泛应用的J2EE框架,是针对bean的生命周期进行管理的轻量级容器,主要由SpringCore、SpringAOP、Spri......
  • 图像响应式学习记录
    看到阮一峰老师的响应式图片教程,这里就不粘贴代码方面的示例了,因为阮一峰老师里的示例都讲得很清楚,具体内容参考以下链接响应式图像教程......
  • day11DOM和BOM回顾以及事件讲解 ( 上 )
    内容回顾BOM(bowserobjectmodel)浏览器对象模型window:窗口对象(全局的变量及函数都属于window也就是global全局对象)location:地址栏对象(获取地......
  • sql自学记录
    复习SQLjoin :用于根据两个或多个表中的列之间的关系,从这些表中查询数据 eg:SELECTPersons.LastName,Persons.FirstName,Orders.OrderNoFROMPersons,OrdersW......
  • pdf的踩坑记录
    1.开始使用vue-pdf这个插件,发现它只适用于页码小的文件,文件大了容易卡顿奔溃(建议小文件使用,比较方便)2.然后做优化,在包裹pdf显示外层div添加滚动事件,初始渲......