浏览器原生组件 shadow DOM(已完成)
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),导致闪烁
浏览器原生组件 shadow DOM(已完成)的更多相关文章
- 【Web技术】401- 在 React 中使用 Shadow DOM
本文作者:houfeng 1. Shadow DOM 是什么 Shadow DOM 是什么?我们先来打开 Chrome 的 DevTool,并在 'Settings -> Preferences ...
- JavaScript 是如何工作:Shadow DOM 的内部结构 + 如何编写独立的组件!
这是专门探索 JavaScript 及其所构建的组件的系列文章的第 17 篇. 如果你错过了前面的章节,可以在这里找到它们: JavaScript 是如何工作的:引擎,运行时和调用堆栈的概述! Jav ...
- 【shadow dom入UI】web components思想如何应用于实际项目
回顾 经过昨天的优化处理([前端优化之拆分CSS]前端三剑客的分分合合),我们在UI一块做了几个关键动作: ① CSS入UI ② CSS作为组件的一个节点而存在,并且会被“格式化”,即选择器带id前缀 ...
- 在Shadow DOM使用原生模板
原生模板的优势 延迟了资源加载 延迟了加载和处理模板所引用的资源的时机,这样,用户就能够在模板中使用任意多的资源,却不阻碍页面的渲染. 延迟了渲染内容 无论模板在什么位置,浏览器不会把模板中的内容直接 ...
- JS21. 使用原生JS封装一个公共的Alert插件(HTML5: Shadow Dom)
效果预览 Shadow DOM Web components 的一个重要属性是封装--可以将标记结构.样式和行为隐藏起来,并与页面上的其他代码相隔离,保证不同的部分不会混在一起,可使代码更加干净.整 ...
- 使用shadow dom封装web组件
什么是shadow dom? 首先我们先来看看它长什么样子.在HTML5中,我们只用写如下简单的两行代码,就可以通过 <video> 标签来创建一个浏览器自带的视频播放器控件. <v ...
- 原生JS获取DOM 节点到浏览器顶部的距离或者左侧的距离
关于js获取dom 节点到浏览器顶/左部的距离,Jquery里面有封装好的offset().top/offset().left,只到父级的顶/左部距离position().top/position() ...
- 封印术:shadow dom
置顶文章:<纯CSS打造银色MacBook Air(完整版)> 上一篇:<鼠标滚动插件smoovejs和wowjs> 作者主页:myvin 博主QQ:851399101(点击Q ...
- 【Web技术】400- 浅谈Shadow DOM
编者按:本文作者:刘观宇,360 奇舞团高级前端工程师.技术经理,W3C CSS 工作组成员. 为什么会有Shadow DOM 你在实际的开发中很可能遇到过这样的需求:实现一个可以拖拽的滑块,以实现范 ...
- 究竟什么是Shadow DOM?
shadow dom 是什么? 顾名思义,shadow dom直译的话就是影子dom,但我更愿把它理解为DOM中的DOM.因为他能够为Web组件中的 DOM和 CSS提供了封装,实际上是在浏览器渲染文 ...
随机推荐
- [oeasy]教您玩转python - 0005- 勇闯地下城
继续运行 回忆上次内容 上次从1行代码进化到了2行代码 yy p粘贴剪贴板中的内容 将剪贴板中的代码粘贴9999次 9999p 真的实现了万行代码梦 是真·圆梦 没有撒谎的那种 不过圆梦之后多少 ...
- 常用ffmpeg命令集合(收藏吧,帮你省一个录屏软件的会员费)
录制屏幕: 全屏的话用screen-capture-recoder下载地址:https://github.com/rdp/screen-capture-recorder-to-video-window ...
- java实现二维码登录功能
本文采用Springboot工程进行开发,使用Google的zxing生成二维码,直接放代码: <?xml version="1.0" encoding="UTF- ...
- 【PHP】5版本 过程式操作MySQL
建立连接和释放连接: # 连接参数 $sever = 'localhost:3309'; $username = 'root'; $password = 'root'; # 调用连接方法,如果失败结束 ...
- 【Vue】Re14 Router 第一部分(入门案例)
一.箭头函数(Lambda匿名函数) <!DOCTYPE html> <html lang="en"> <head> <meta char ...
- Meta公司的Llama3大语言模型
Github地址: https://github.com/meta-llama/llama3 官方介绍: https://ai.meta.com/blog/meta-llama-3/ 官方项目主页: ...
- 【节选 转载】人形机器人Optimus擎天柱技术解析
参考原文: https://www.sohu.com/a/589454391_383324?scm=9010.8000.0.0.1265 可以利用动作捕捉"学习"人类动作,依靠视觉 ...
- 最为期待的国产3D游戏 —— 3A大作 ——《黑神话:悟空》
地址: https://www.heishenhua.com/
- 强化学习是否可以AI4Science呢?
最近,华为和Google都推出了AI的天气预报系统(发表了nature.science论文,但是没开放公众使用),可以说这个传统的Science问题已经被AI算法解决,这也说明了传统Science问题 ...
- 算法·理论:Manacher 笔记
\(\text{Manacher}\) 来啦! \(\text{Manacher}\) 并没有什么前置知识,比 \(\text{KMP}\) 简单多了. 前置处理 \(\text{Manacher}\ ...