浏览器视图层级中的“根”:<html>和<body>的属性研究
做前端开发的同学都会知道,每一个UI系统(比如IOS或Android)中都会有一个view hierarchy(视图层级)的概念,即所有的可视元素(大到一个页面,小到一个button)都在一个树形结构中,而树形结构的”根节点“为window,即整个屏幕或窗口。
浏览器中的view hierarchy可以认为是整个dom结构,但是“根节点”非常混乱,我们通常搞不清楚“根节点”是<body>、<html>、还是window,还是document? 我对这几个节点深入研究了一下,以下是我的总结。
注:所有测试均在mac的chrome下,其他浏览器未测试。不过原理基本相同
我做了一个demo:http://linchen1987.github.io/tool/htmlbody/,大家可以边读文章边通过demo体会。
1. 根View是谁?
demo中可以看到:html和body没有充满整个屏幕,而是一个普普通通的块级元素(大家可以修改width和height属性看效果)。我们知道,body的父视图是html,那么html还会有一个父视图,这个父视图是什么呢? 是window!也是浏览器中的根元素!这个元素的实例即为window对象(尺寸为window.innerWidth和window.innerHeight,可以监听resize事件等等)。那么document是什么呢?document虽然是整个DOM结构的根节点,但是document并不是显示元素,所以与view hierarchy无关。
结论:显示元素中,根元素不是html,是window。不过我们只会在body下创建子元素。浏览器的view hierarchy一直是这样的:
window
html
body
custom view
2. window,html和body的overflow属性
window像其他元素一样,是具有overflow属性的。window的overflow属性只有两个值:hidden和scroll。window的overflow属性取决于html和body的overflow属性,并且window可能改变html和body的overfow属性,很神奇吧。 规则如下:
window会首先查找html的overflow属性。如果html的overflow为scroll或者hidden,则据为己用,html的实际overflow效果则变为visible。
当html设置visible时,window则会查找body的overflow属性,与html一样,如果为scroll或者hidden,则据为己用,此时body的实际overflow效果变为visible。
当html和body均设为visible时,window不找他们俩的麻烦了,自己默默设定为scroll。这也是默认的情况。
结论:
html不论overflow设置什么,最终效果均为visible。
html为hidden或scroll时,window的overflow取决于html;
html为visible时,body不论overflow设置什么,最终效果均为visible。
html为visible,body为hidden或scroll时,window的overflow取决于body的overflow
html为visible,body为visible时,window为scroll
3. window,html和body的background属性
同overflow,window也具有background属性。window的background属性取决于html和body,并且会影响html和body。 结论如下:
html只要设置了background(即background不为transparent),window会将html的background据为己用,而html的background则变为transparent。
html为transparent时,只要body只要设置了background(即background不为transparent),window的background会将body的transparent据为己用,而body的background则变为transparent。
html和body的background都为transparent时,window的background为浏览器默认的颜色(白色),这也是默认的情况。
欢迎大家交流讨论,直接留言或邮箱linchen.1987@foxmail.com。
浏览器视图层级中的“根”:<html>和<body>的属性研究的更多相关文章
- 转: Firefox 浏览器对 TABLE 中绝对定位元素包含块的判定有错误
标准参考 元素的包含块 W3C CSS2.1 规范中规定,绝对定位元素的包含块(containing block),由离它最近的 position 特性值是 "absolute". ...
- Flask从入门到精通之在视图函数中处理表单
在新版hello.py 中,视图函数index() 不仅要渲染表单,还要接收表单中的数据.更新后的index() 视图函数如下: @app.route('/') def index(): name = ...
- django 结合 OPTIONS方法 处理跨域请求(单个视图方法中)
OPTIONS 方法比较少见,该方法用于请求服务器告知其支持哪些其他的功能和方法.通过 OPTIONS 方法,可以询问服务器具体支持哪些方法,或者服务器会使用什么样的方法来处理一些特殊资源.可以说这是 ...
- [Swift通天遁地]一、超级工具-(9)在地图视图MKMapView中添加支持交互动作的标注图标
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...
- MPMoviePlayerViewController的使用 (不直接将播放器放到主视图控制器,而是放到一个内部模态视图控制器中)
其实MPMoviePlayerController如果不作为嵌入视频来播放(例如在新闻中嵌入一个视频),通常在播放时都是占满一个屏幕的,特别是在 iPhone.iTouch上.因此从iOS3.2以后苹 ...
- view视图文件中的input等输入框必须含有name属性,不然控制器里的动作formCollection是没有值的
view视图文件中的input等输入框必须含有name属性,不然控制器里的动作formCollection是没有值的,就是没有name属性,后台获取不到值
- ExtJS-Viewport背景图片铺满浏览器视图并自动伸缩
var viewport = Ext.create('Ext.container.Viewport', { style : 'background-image:url(login_bj.jpg);ba ...
- 十九、利用OGNL获取ValueStack中:根栈和contextMap中的数据
利用OGNL获取ValueStack中:根栈和contextMap中的数据 原则:OGNL表达式如果以#开头,访问的contextMap中的数据 如果不以#开头,是访问的根栈中的对象的属性(List集 ...
- C#中网站根路径、应用根路径、物理路径、绝对路径,虚拟路径的区别
C#中网站根路径,请站点的最外一层 /表示 应用根路径 ~/表示,有时候C#程序路径并不是网站路径 物理路径 server.mappath("~/") 是指应用程序放在服务器硬盘的 ...
随机推荐
- python opencv识别蓝牌车牌号 之 取出车牌号 (1/3)
概述 车牌识别是计算机视频图像识别技术在车辆牌照识别中的一种应用,通常来讲如果结合opencv进行车牌识别主要分为四个大步骤,分别为: 图像采集 车牌定位 分割车牌字符 字符识别 当然,如果结合了机器 ...
- VM虚拟机 Ubuntu配置与ssh连接
VMware安装ubuntu 自定义 不作更改 选择稍后安装操作系统,相当于裸机,没装系统. 选择ubuntu64 选择虚拟机名字与保存路径 配置情况 2G即可 网络类型,选择NAT 可以了解一下这几 ...
- LGP5824口胡
万 恶 之 源 十 二 重 计 数 法 先鸽子了 球有序,盒子有序 答案明显为 \(m^n\). 球有序,盒子有序,每个盒子最多放一个 答案明显为 \(\binom{m}{n}n!\). 球有序,盒子 ...
- vue中使用keepAlice的各种问题
项目需求:从项目列表页index,进入到列表的详情页detail,再从detail返回到index,需要缓存index的数据 在App.vue中的配置 <template> <div ...
- ArcMap操作随记(6)
1.上流汇流区 [填洼]→[流向]→[分水岭] 2.输入坐标进行移动,也就是精确移动 [移动]工具(在自定义中,其中的[旋转]工具也有类似效果) 3.找最近的要素(矢量) [近邻分析]→[汇总] 4. ...
- ArcMap操作随记(1)
1.用python代码,将属性表中属性进行合并 代码:'ID'+str(!FID!) 2.地类编码与地类的转换 以python为例 显示代码块(预逻辑脚本代码): def getType(value) ...
- javaweb项目中关于配置文件web.xml的解析
一..启动tomcat,加载项目中的web.xml文件,创建servercontext上下文对象. 可以通过servercontext对象在应用中获取web.xml文件中的值. web应用加载的顺序与 ...
- SpringMVC解决前端传来的中文字符乱码问题
以前乱码问题通过过滤器解决,而SpringMVC给我们提供了一个过滤器,可以在web.xml中添加以下配置 修改了xml文件需要重启服务器! <!--配置解决中文乱码过滤器--> < ...
- CF 920A Water The Garden
本题可以看做是一个数学题 因为 在第 1 和第 3 个洒水器之间的 花园灌溉的时间只要 (1 + 3 ) >> 1 - 1 + 1;//这么长的时间 那么我么就可以以此类推到 从而我么可以 ...
- VSCode编写vue项目文件出现红色波浪线
VSCode编写vue项目文件出现红色波浪线 在我们在写Vue或其他项目时,可能会遇到这样一个问题:明明自己的代码程序都没有错,代码规范也符合标准,为什么它就是给我报错显红呢??? 解决方案 第一种方 ...