这两天看《webkit技术内幕》发现了一些神奇的东西,其中之一就是ShadowDOM,学web开发也有两年多时间了,居然一直不知道还有一个ShadowDOM……惭愧惭愧
言归正传,ShadowDOM到底是个什么鬼呢?

引入

ShadowDOM主要解决一个文档中可能需要大量交互的多个DOM树建立和维护各自功能边界的问题

那么这段话到底是什么意思呢…
举一个常见的例子,先看下面一系列图,这是慕课网上一个视频的页面,打开chrome开发者工具查看video标签(图一)……嗯,什么都没有。但是当我们打开chrome开发者工具show shadowdom选项时(图二),我们看到video标签下的ShadowDOM结构。同时HTML支持的其他一些比如视频、音频甚至一些表单的控件,这些控件有些是由很复杂的界面组成的,其实这些界面也是用HTML+CSS写的,只是如果你不打开开发者工具的show ShadowDOM选项的话,你是无法查看到这些节点的。

ShadowDOM的意义及用法

所以这里就对ShadowDOM的思想有了一个模糊的感觉了。当我们想开发一个控件的时候,这个控件内部由一些HTML标签组成,这些元素组成DOM树的子树。这个控件可以被广泛使用,但是,每个使用这个控件的地方,都会知道这个子树的结构。当我们访问网页DOM结构的时候,这些子树都会暴露出来,给我们html文档的DOM遍历带来麻烦,而且选择器也可能会无意中改变控件的内部节点的样式,导致奇怪的问题。而事实上,我们使用控件的时候并不关心控件的内部结构,只关心控件的本身,所以需要一种方式来将内部的信息封装起来。
那么有什么办法既能将内部节点的信息封装起来,又能将这些节点给渲染出来呢?W3C提出了ShadowDOM的概念,ShadowDOM可以使一些DOM节点在特定范围内可见,而在网页DOM树中不可见,但是网页渲染的结果包含了这些节点。

一个小例子

下面我们用ShadowDOM来模仿input框开发一个输入框控件,控件左边是文字,右边是输入框,为了更好的展现ShadowDOM,输入框不采用原本的input,而是用一个可编辑内容的span代替,下面看代码,这里也有一个在线的jsbin看效果,不过还是需要浏览器支持ShadowDOM才能显示效果->传送门jsbin

<!DOCTYPE html>
<html>
<head><meta charset="utf-8"><title>shadowDOM</title><style type="text/css">#div { width: 300px;height: 50px;border: 1px solid #666;padding: 15px; }</style>
</head>
<body><div id="div">这里是不显示出来的,如果你看到了,说明浏览器不支持ShadowDOM</div><button>点我点我</button><script type="text/javascript">function createShadowDOM(elem) {var root = elem.createShadowRoot();root.appendChild(createStyle());root.appendChild(createInputDiv("姓名","name"));}function createStyle() {var style = document.createElement('style');style.textContent = 'div.input-div { height: 30px; width: 250px; }' +'font.input-font { line-height: 30px;font-size: 16px;color: #495A80; margin-right: 10px;}'+'span.input-area {width: 200px;height: 25px;line-height: 25px;padding-left: 5px;display:inline-block;color: #666;font-size: 16px;border: 1px solid #999;border-radius: 3px;}';return style;}function createInputDiv(font, name) {var inputDiv = document.createElement('div');inputDiv.className = 'input-div';inputDiv.innerHTML = "<font class='input-font'>" + font + "</font><span class='input-area' contentEditable='true' id=" + name + "></span>";return inputDiv;}createShadowDOM(document.querySelector("#div"));document.querySelector('button').addEventListener('click', function() {alert(document.querySelector('#div').shadowRoot.querySelector('#name').innerHTML);})</script>
</body>
</html>

看一下效果图

注意如果ShodowDOM显示出来的话,原先div里面的内容是不会显示出来的,如果显示出来,则说明浏览器不支持shadowDOM。

当我们使用JS代码来访问HTML文档的DOM结构的时候,通常的接口是不能直接访问到ShadowDOM子树中的节点的,只能通过特殊的接口访问:document.querySelector(‘#div’).shadowRoot.querySelector(‘#name’).innerHTML。
当然这里的代码简单的展示一下ShadowDOM的使用,如果想开发一个完美的组件的话可以将以上代码再封装一下,使用的时候直接new xxx()就可以啦~

遗憾的兼容性

研究了这么些关于ShadowDOM的东西,感觉还挺有意思的。但是…可惜浏览器对它的支持并不好。以上代码我在火狐中运行就看不到效果。

我们可以看看各浏览器对它的兼容性怎么样->Can I use传送门
以下是截图,全球的和中国的浏览器支持程度

我们发现浏览器对它的支持程度并不是特别好,至少火狐都不支持……

参考链接

  1. Shadow DOM v1:独立的网络组件 (推荐好文!)
  2. Shadow DOM - W3C Working Draft 13 February 2017

谈一谈神奇的ShadowDOM相关推荐

  1. 谈一谈我所遇到的定位属性

    世界杯是一个很神奇的运动,让我欲罢不能的想参与其中.于是我买德国赢--德国输了,巴西赢--巴西平了,哥伦比亚赢....最近真的有点屋漏偏逢连夜雨不仅世界杯屡屡爆冷门,买的几只基金也像过山车一样,刹不住 ...

  2. 谈一谈浏览器解析CSS选择器的过程【前端每日一题-6】

    谈一谈浏览器解析CSS选择器的过程? 这是一道发散题,可以根据自己的理解自行解答. 在开始前,我们必须了解一个真相:为什么排版引擎解析 CSS 选择器时一定要从右往左解析? 简单的来说:浏览器从右到左 ...

  3. 有一群200w年薪的朋友是什么感觉?谈一谈入学中国科学院大学的几点感受吧

    我叫阿广,偶尔正经,偶尔逗比,97年生人,在求学期间当过鸡头鸡尾,当过凤尾没当过凤头.大家如果想深入了解我,可以查看本公众号的原创文章. 技术人光有技术走不长久,所以今天不更新技术文章了,也给大家谈一 ...

  4. 【建站系列教程】5、谈一谈网站的静态化

    [建站系列教程]5.谈一谈网站的静态化[进阶] 动态页面?静态页面?伪静态页面? 三个页面有何优缺点? 为什么要让网页静态化 如何网页伪静态化? 写在前面:大家好,我是热爱编程的小泽. [建站系列教程 ...

  5. 谈一谈周公所理解的面试

    因为公司最近招聘的力度很大,所以最近公司的面试很多,加之很多同事项目紧,所以让我参加了一些技术面试.不论是作为面试官还是应聘者,参加工作以来我参与的面试的次数我自己也记不清了,所以在此想从面试官和应聘 ...

  6. 我从阿里面试回来,想和Java程序猿谈一谈

    最近小编看了一篇关于面试的文章,题目是"我从阿里面试回来,想和Java程序员谈一谈",内容不是讲面试前刷题,而是更加聚焦在面试前如何准备,以及工作当中如何学习.感觉总结的很不错,今 ...

  7. 怎么学python-结合学习经历,谈一谈如何学习Python

    结合自己的学习经历,谈一谈如何学习Python吧. 入门阶段 Python其实语言本身已经很接近自然语言了,所以入门其实并不麻烦.如果你是从未接触过编程的萌新,给你推荐一门Udacity CS101, ...

  8. 先查询再插入的存储过程怎么写_谈一谈 InnoDB(1) - 底层存储文件结构

    看技术文章是不是很累呢, 这次来个轻松点的~来谈一谈MySQL最主流的数据库引擎 InnoDB 吧~ 序 老王走进一号会议室, 随手打开了灯, 小张紧随其后 "王哥, 找我来干啥啊" ...

  9. Java程序员谈一谈-----java程序员成长之路

    转载:http://www.banzg.com/archives/679.html?ref=myread 阿里面试回来,想和Java程序员谈一谈 引言 其实本来真的没打算写这篇文章,主要是LZ得记忆力 ...

  10. 谈一谈并查集QAQ(上)

    最近几日理了理学过的很多oi知识...发现不知不觉就有很多的知识忘记了... 在聊聊并查集的时候顺便当作巩固吧.... 什么是并查集呢? ( Union Find Set ) 是一种用于处理分离集合的 ...

最新文章

  1. rpm怎样在win安装mysql_centos7.6安装mysql的正确步骤
  2. java程序员入门先学什么开发者工具
  3. 图像条纹检测 python_【连载4.5】特征检测技术研究面向强反射表面的多传感器三维检测技术研究...
  4. python 一次编辑
  5. Elasticsearch 教程--入门
  6. MongoDB 5.0新特性概览
  7. Halcon:二维仿射变换实例探究
  8. 编译原理(二)之语法分析
  9. @qualifier注解_常见的 Spring 注解概览
  10. python骰子游戏分析_python 用python写一个骰子游戏
  11. Varnish由于cookie过大返回503
  12. 编写高质量代码改善C#程序的157个建议——建议50:在Dispose模式中应区别对待托管资源和非托管资源...
  13. linux系统安装coerplayer,安装deepin~
  14. ArcEngine中打开各种数据源(WorkSpace)的连接(转)
  15. 最新消息:苹果M1芯片为何如此之快?
  16. 浅识JAVA设计模式——观察者模式
  17. R2CNN 算法笔记
  18. linux下编译jrtplib和jthread,Linux下编译jrtplib和jthread(转)
  19. pclzip.lib.php,LimeSurvey
  20. 关于如何查找NXP S32K1xx系列单片机的封装信息和引脚定义

热门文章

  1. 关于线下《三国杀》流局问题的若干思考
  2. Maya云渲染如何使用,Maya云渲染流程实操!
  3. 灰度图像和彩色图像是怎么来的?如何计算一张图片的大小?像素和分辨率分别是什么?它们之间有什么关系?我们平时所说显示器的1080p、2k和4k分别指的是什么?
  4. javase 正则表达式 (小白必看)
  5. 错误代码666020_Steam - Shark Dating Simulator XL
  6. Pr中如何将视频导出成mp4格式
  7. sketch android切图,Sketch切图及导出图片尺寸
  8. jmeter的json提取器和json提取器取值
  9. R语言使用tiff函数将可视化图像结果保存tiff格式、使用tiff函数打开图像设备、使用dev.off函数关闭图像设备、使用compression参数自定义压缩类型(形式)
  10. chatgpt赋能Python-python_descending