做前端开发的同学都会知道,每一个UI系统(比如IOSAndroid)中都会有一个view hierarchy(视图层级)的概念,即所有的可视元素(大到一个页面,小到一个button)都在一个树形结构中,而树形结构的”根节点“为window,即整个屏幕或窗口。

浏览器中的view hierarchy可以认为是整个dom结构,但是“根节点”非常混乱,我们通常搞不清楚“根节点”是<body><html>、还是window,还是document? 我对这几个节点深入研究了一下,以下是我的总结。

注:所有测试均在mac的chrome下,其他浏览器未测试。不过原理基本相同

我做了一个demo:http://linchen1987.github.io/tool/htmlbody/,大家可以边读文章边通过demo体会。

1. 根View是谁?

demo中可以看到:htmlbody没有充满整个屏幕,而是一个普普通通的块级元素(大家可以修改width和height属性看效果)。我们知道,body的父视图是html,那么html还会有一个父视图,这个父视图是什么呢? 是window!也是浏览器中的根元素!这个元素的实例即为window对象(尺寸为window.innerWidthwindow.innerHeight,可以监听resize事件等等)。那么document是什么呢?document虽然是整个DOM结构的根节点,但是document并不是显示元素,所以与view hierarchy无关。

结论:显示元素中,根元素不是html,是window。不过我们只会在body下创建子元素。浏览器的view hierarchy一直是这样的:

window

html

body

custom view

2. windowhtmlbody的overflow属性

window像其他元素一样,是具有overflow属性的。window的overflow属性只有两个值:hiddenscrollwindow的overflow属性取决于html和body的overflow属性,并且window可能改变html和body的overfow属性,很神奇吧。 规则如下:

  1. window会首先查找html的overflow属性。如果html的overflow为scroll或者hidden,则据为己用,html的实际overflow效果则变为visible。

  2. 当html设置visible时,window则会查找body的overflow属性,与html一样,如果为scroll或者hidden,则据为己用,此时body的实际overflow效果变为visible。

  3. 当html和body均设为visible时,window不找他们俩的麻烦了,自己默默设定为scroll。这也是默认的情况。

结论:

  1. html不论overflow设置什么,最终效果均为visible。

  2. html为hidden或scroll时,window的overflow取决于html;

  3. html为visible时,body不论overflow设置什么,最终效果均为visible。

  4. html为visible,body为hidden或scroll时,window的overflow取决于body的overflow

  5. html为visible,body为visible时,window为scroll

3. windowhtmlbody的background属性

同overflow,window也具有background属性。window的background属性取决于html和body,并且会影响html和body。 结论如下:

  1. html只要设置了background(即background不为transparent),window会将html的background据为己用,而html的background则变为transparent。

  2. html为transparent时,只要body只要设置了background(即background不为transparent),window的background会将body的transparent据为己用,而body的background则变为transparent。

  3. html和body的background都为transparent时,window的background为浏览器默认的颜色(白色),这也是默认的情况。

欢迎大家交流讨论,直接留言或邮箱linchen.1987@foxmail.com

浏览器视图层级中的“根”:<html>和<body>的属性研究的更多相关文章

  1. 转: Firefox 浏览器对 TABLE 中绝对定位元素包含块的判定有错误

    标准参考 元素的包含块 W3C CSS2.1 规范中规定,绝对定位元素的包含块(containing block),由离它最近的 position 特性值是 "absolute". ...

  2. Flask从入门到精通之在视图函数中处理表单

    在新版hello.py 中,视图函数index() 不仅要渲染表单,还要接收表单中的数据.更新后的index() 视图函数如下: @app.route('/') def index(): name = ...

  3. django 结合 OPTIONS方法 处理跨域请求(单个视图方法中)

    OPTIONS 方法比较少见,该方法用于请求服务器告知其支持哪些其他的功能和方法.通过 OPTIONS 方法,可以询问服务器具体支持哪些方法,或者服务器会使用什么样的方法来处理一些特殊资源.可以说这是 ...

  4. [Swift通天遁地]一、超级工具-(9)在地图视图MKMapView中添加支持交互动作的标注图标

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  5. MPMoviePlayerViewController的使用 (不直接将播放器放到主视图控制器,而是放到一个内部模态视图控制器中)

    其实MPMoviePlayerController如果不作为嵌入视频来播放(例如在新闻中嵌入一个视频),通常在播放时都是占满一个屏幕的,特别是在 iPhone.iTouch上.因此从iOS3.2以后苹 ...

  6. view视图文件中的input等输入框必须含有name属性,不然控制器里的动作formCollection是没有值的

    view视图文件中的input等输入框必须含有name属性,不然控制器里的动作formCollection是没有值的,就是没有name属性,后台获取不到值

  7. ExtJS-Viewport背景图片铺满浏览器视图并自动伸缩

    var viewport = Ext.create('Ext.container.Viewport', { style : 'background-image:url(login_bj.jpg);ba ...

  8. 十九、利用OGNL获取ValueStack中:根栈和contextMap中的数据

    利用OGNL获取ValueStack中:根栈和contextMap中的数据 原则:OGNL表达式如果以#开头,访问的contextMap中的数据 如果不以#开头,是访问的根栈中的对象的属性(List集 ...

  9. C#中网站根路径、应用根路径、物理路径、绝对路径,虚拟路径的区别

    C#中网站根路径,请站点的最外一层 /表示 应用根路径 ~/表示,有时候C#程序路径并不是网站路径 物理路径 server.mappath("~/") 是指应用程序放在服务器硬盘的 ...

随机推荐

  1. c# 去除TextBox的获取焦点事件

    /// <summary> /// 去除TextBox的获取焦点事件 /// </summary> /// <param name="sender"& ...

  2. JZ-071-把数字翻译成字符串

    把数字翻译成字符串 题目描述 给定一个数字,按照如下规则翻译成字符串:1 翻译成"a",2 翻译成"b"... 26 翻译成"z".一个数字 ...

  3. c# 通过HttpListener创建HTTP服务

    在c#中可以利用HttpListener来自定义创建HTTP服务,通过http协议进行服务端与多个客户端之间的信息传递,并且可以做成windows系统服务,而不用寄宿在IIS上.以下为一个demo,分 ...

  4. 图解|从根上彻底理解MySQL的索引

    这是图解MySQL的第4篇文章,这篇文章会让你 明白什么是索引,彻底理解B+树和索引的关系: 彻底理解主键索引.普通索引.联合索引: 了解什么是HASH索引,InnoDB和MyISAM索引的不同实现方 ...

  5. 【一周聚焦】 联邦学习 arxiv 2.16-3.10

    这是一个新开的每周六定期更新栏目,将本周arxiv上新出的联邦学习等感兴趣方向的文章进行总结.与之前精读文章不同,本栏目只会简要总结其研究内容.解决方法与效果.这篇作为栏目首发,可能不止本周内容(毕竟 ...

  6. linux作业--第五周

    1.简述osi七层模型和TCP/IP五层模型 一.OSI参考模型 (1) OSI的来源 OSI(Open System Interconnect),即开放式系统互联. 一般都叫OSI参考模型,是ISO ...

  7. 七牛云cdn加速

    https://developer.qiniu.com/fusion/1228/fusion-quick-start https://blog.csdn.net/qq_27292113/article ...

  8. 空间插值生物X适宜性分析

    1 前言 这期博主将根据示例大概讲一下插值分析. 2 问题阐述 根据要求,完成以下操作: (1)请就以上条件确定此地区适合X的生活范围,并制作专题图.专题图内容要求以地形和水系作为背景,且给出适宜区域 ...

  9. jdbc创建数据库的连接

    package com.gylhaut.db; import java.sql.Connection;import java.sql.DriverManager;import java.sql.Res ...

  10. ASP.NET Core 6.0对热重载的支持

    .NET 热重载技术支持将代码更改(包括对样式表的更改)实时应用到正在运行的程序中,不需要重启应用,也不会丢失应用状态. 一.整体介绍 目前 ASP.NET Core 6.0 项目都支持热重载.在以下 ...