HTML/BODY的背景渲染原理

一、前言

结论先行:

我们给body设置背景色,实际我们看见的未必是body上的背景色:

  1. 当html标签没有设置背景色时,我们看见的是作用在浏览器画布上的背景色,不是body上的;
  2. 当html标签被设置了背景色时,我们看见的是真正作用在body上的背景色。

人在前端已经漂泊数年,机缘巧合才发现,这几年给body写的背景色,全被浏览器给「吃」了。文中涉及的是CSS中关于特殊元素(html/body)的背景渲染的原理,对你而言它也许是块新大陆,也可能,你早已熟知,那么正好···可以一起交流下?

二、一个情景

有一个渲染列表的页面(不定高),要求背景是渐变颜色,效果如下图:

需求很简单:

  • 列表内容不足以撑满一屏时,整屏背景以渐变色填充;
  • 列表内容超过一屏高度时,整个页面背景以渐变色填充;

三、情景破解

姿势有很多,偏爱的只有妳这一种。

PS:破解情景的解法有很多,而下面这种解法可以引起我们关于html、body背景渲染原理的思考。

Step 1:首先给body设置颜色渐变
body{ background: linear-gradient(#FFFAD0,#ffffff); }
复制代码

不出意外,页面渐变出现了断层?

Step 2:设置html高度为100%,同时给body设置下min-height
html{ height: 100%;}
body{ min-height: 100%; background: linear-gradient(#FFFAD0,#ffffff); } 复制代码

又不出意外,看起来很OJBK,没有出现断层了!

突然,内容渐渐多了起来,超过一屏的高度了···?

呃···这是什么情况?超过一屏之后又断层了![what the fuck & 掀桌].jpg

Step3:设置html的背景色
html{ height: 100%; background: red; }
复制代码

是的,你没看错,我给html设置了红色!不得不服气,这样的骚操作竟然解决了上面断层的问题。

突然兴起的总结

小小梳理下我们遇到的疑点:

  1. 首先我们给body设置了渐变色,即使内容超过一屏,我们看到的也应该是body那一层,即是渐变色的背景,不应该断层!
  2. 为什么给html元素设置一个背景色就可以完美解决这个断层?

四、原理解析

我们这个问题涉及到了三个对象:html元素、body元素和浏览器画布,我们需要了解它们三者之间渲染背景色的机制。

The document canvas is the infinite surface over which the document is rendered. [CSS2] Since no element corresponds to the canvas, in order to allow styling of the canvas CSS propagates the background of the root element (or, in the case of HTML, the element) as described below. However, if no boxes are generated for the element whose background would be used for the canvas (for example, if the root element has display: none), then the canvas background is transparent.

The background of the root element becomes the background of the canvas and its background painting area extends to cover the entire canvas. However, any images are sized and positioned relative to the root element as if they were painted for that element alone. (In other words, the background positioning area is determined as for the root element.) The root element does not paint this background again, i.e., the used value of its background is transparent.

以上是w3c对特定元素(根元素)背景的定义说明,总结为以下两点:

  • CSS根据根元素(html/body)给文档画布(该画布是无限大的,我们姑且理解为浏览器画布)渲染背景颜色,同时背景色的定位区域就是根元素的区域;
  • 根元素不再绘制该背景色,即根元素背景的使用值是透明的。

基于这两点解答前面我们的疑问:

1、给body设置了渐变色背景,内容超过一屏的时候,出现了断层

真相是,浏览器画布首先获取根节点的背景样式,由于html我们没有设置,所以它获取了body的背景色,从而导致浏览器画布也是渐变色背景;

其次,浏览器画布背景色的定位区域取决于根元素的区域,这里的根元素是html,而我们对html做了 height:100% 的设置。所以浏览器画布以该区域的背景色重复渲染。

用图举证: 给html设置50%的width,那么左侧看到的是我们的页面dom内容,右侧则是浏览器画布

html{ height: 100%; width: 50%; } body{ min-height: 100%; background: linear-gradient(#FFFAD0,#ffffff); } 复制代码

可以发现,左右两侧的背景色是一致的:证明了浏览器画布取了body的背景色进行渲染,而body的背景色其实是透明值,必然地,我们在body看见的是会断层的渐变色。

所以,我们给body设置的背景色被浏览器画布吃掉了!

2、通过html设置背景色的方式解决了断层问题

我们给html设置背景色,其实是让html去承担被浏览器画布取色的任务,这时候body的值就是我们设置的渐变色。以图举证:

html{ height: 100%; width: 50%; background: #42b983; } 复制代码

对的,红色不喜欢,我决定了换成vue的主题绿。如此,浏览器画布取了html的背景色,左侧就可以正常看见body的渐变背景了。

转载于:https://www.cnblogs.com/zhaoliu100125/p/9429000.html

HTML/BODY的背景渲染原理相关推荐

  1. html背景渲染原理(body透明渐变)

    给body设置的背景色 实际上 我们未必看得见: 偶然情况下发现 给body写的背景色 全被浏览器给覆盖了 文中涉及的是CSS中关于特殊元素(html/body)的背景渲染的原理 当html标签没有设 ...

  2. 高性能Web动画和渲染原理系列(2)——渲染管线和CPU渲染

    [摘要] 介绍浏览器渲染原理及CPU渲染流程 示例代码托管在:http://www.github.com/dashnowords/blogs 博客园地址:<大史住在大前端>原创博文目录 一 ...

  3. 详解浏览器渲染原理及流程

    今天来分享一下浏览器的渲染原理及流程. 前言   先来看看 Chrome 浏览器的多进程架构:   通常,我们打包出来的 HTML.CSS.JavaScript 等文件,经过浏览器运行之后就会显示出页 ...

  4. 图解浏览器渲染原理及流程

    本文约 8500 字,预计阅读需要 30 分钟. 今天来分享一下浏览器的渲染原理及流程. 前言 先来看看 Chrome 浏览器的多进程架构: 通常,我们打包出来的 HTML.CSS.JavaScrip ...

  5. 浏览器渲染原理的学习与总结

    参考文章:浏览器渲染原理 浏览器渲染原理 1. 进程和线程 进程包涵线程, 微信是一个进程, 里面有很多诸如用户登录等线程. a.线程共享内存, 进程独立内存: 进程与进程之间是相互独立的, 他们各自 ...

  6. 简述47种Shader Map的渲染原理与制作方法

    在Shader中会使用各种不同图参与渲染,所以简单地总结下各种图的渲染原理.制作方法,最后面几种是程序生成图. 1. Albedo 2. Diffuse(Photographic) <img d ...

  7. 单文件浏览器_图文并茂深度解析浏览器渲染原理,包看懂超值得收藏

    在我们面试过程中,面试官经常会问到这么一个问题,那就是从在浏览器地址栏中输入URL到页面显示,浏览器到底发生了什么?这个问题看起来是老生常谈,但是这个问题回答的好坏,确实可以很好的反映出面试者知识的广 ...

  8. Android中View(视图)绘制不同状态背景图片原理深入分析以及StateListDrawable使用详解...

    2019独角兽企业重金招聘Python工程师标准>>> 今天继续给大家分享下View的相关知识,重点有一下两点:   1.View的几种不同状态属性            2.如何根 ...

  9. 浏览器渲染原理及可能出现的bug

    Web测试中必不可少的天天打交道的一个应用就是浏览器,它是由哪些部分组成的呢? · 用户接口 – 包括地址栏,前进后退,书签菜单等窗口上除了网页显示区域以外的部分. · 浏览器引擎 – 查询与操作渲染 ...

最新文章

  1. PHP 5.3 中不建议使用的(部分)函数列表
  2. 使用“1”个参数调用“DownloadString”时发生异常:“操作超时”
  3. Android系统Surface机制的SurfaceFlinger服务对帧缓冲区(Frame Buffer)的管理分析
  4. Linux内核创建一个新进程的过程
  5. 《Cisco IOS XR技术精要》一4.4 理解二级提交模型
  6. python psycopg2_如何在Python上用“pip”安装psycopg2?
  7. 微信扫一扫背后的秘密:基于运动估计的智能传图算法
  8. BZOJ 1031: [JSOI2007]字符加密Cipher( 后缀数组 )
  9. java @Column 引发的一点思考
  10. 计算机暑期实践相关内容,计算机暑假社会实践报告5000范文
  11. 第9章 项目人力资源管理
  12. POJ-2151 Check the difficulty of problems 概率DP
  13. 网站开发中敏感信息加密
  14. .vue文件怎么使用_Vue使用ifream遇到的问题?怎么处理跨域呢?
  15. PHP表格下框线怎么设置虚线,html中p怎么设置虚线边框
  16. WCF 基础 契约 和 绑定
  17. 11462 - Age Sort
  18. 各种VC9 VC11版本的Apache
  19. Mac环境下安装JDK
  20. 无线网主dns服务器,无线网的dns怎么设置

热门文章

  1. Exchange 2003 限制用户外发邮件
  2. 考试系统—— 刷新页面 考试剩余时间不重新开始
  3. Node.js 初识 fs 模块
  4. Windows10中的IIS10安装php manager和IIS URL Rewrite 2.0组件的方法
  5. 深入浅出 JavaScript 中的 this
  6. Android TextView内容过长加省略号,点击显示全部内容
  7. Flex scroller皮肤的使用
  8. 删除U盘作为启动盘的隐藏启动分区
  9. Python文件夹与文件的操作
  10. asp.net faq: 在html文件中,用js获取session