关于dom元素上css属性值的取值过程

最近在研究w3c的css标准规范,css2.2版本,虽然早已进入css3时代,但是css3还是继承了很多css2的基础,所以了解css2的很多标准原理,对于理解css核心内容,对写好css,写出高性能的css是很有必要的。

这篇文章写在读了css标准第六章css属性值取值过程相关内容,英文标准地址:https://www.w3.org/TR/CSS22/cascade.html

浏览器渲染页面时,解析dom树之后,一定(标准中用了must)会对每个dom元素都加上css的属性和对应的值:

“Once a user agent has parsed a document and constructed a document tree, it must assign, for every element in the tree, a value to every property that applies to the target media type.”

这里需要注意的是,每个dom的css的每个css属性都会被赋值,即便那个css属性并没有进行过任何显式设置,也会被赋予一个对应的值。

而这个对应的值,从最初赋值到最后渲染出来一共要经历四个过程,根据标准的翻译和我自己理解如下:

一,赋予指定值。(Specified values)

很容易理解,就是直接对某个css属性赋的值,就是我们写css时写的body{font-size:15px}这些。这个“指定值”又有一个规则来指定:

1.如果css样式表直接有显示的设置,就使用这个设置值;如果被设置的值是“inherit”,就使用它父元素的Computed values来做为赋予值。

2.如果没有1中的设置,inherited的属性就会它父元素的Computed values来做为赋予值。

3.既不是1也不是2(没有设置过而且属性还不能继承)的,就使用该属性的默认值作为指定值。

二,计算值。(Computed values)

从字面上可以理解就是把相对值换算成绝对值,比如ex、em换成实际的px值,相对的url转成绝对url。最重要的在于,这一步得到的Computed values,必须要是能够被子元素继承的值。

三,实际使用值(翻译的有点挫)。(Used values)

如果一个元素的宽度使用了widt:30%,这是相对于他父元素设定的,而这个值依赖于他的父元素的宽度,只有当他父元素的宽度的Computed values被设置好了之后才会来指定这个实际使用值。这里你可能会晕了,这个40%不也是相对单位么,跟二中的Computed values有什么不一样呢?不一样就在于,二中的Computed values不基于某个元素依赖,看刚才二中举的例子,ex,em都是相对于自身的font-size值进行相对设定的,不依赖于文档中的格式,所以二的Computed values肯定会发生在Used values之前。

四,实际渲染值。(Actual values)

实际渲染值是每个浏览器自己做的限制,比如设置了font-size:12.1px,实际渲染出来的还是12px,这就是Actual values。

css属性值从赋值到渲染一共经历了这四个步骤,表面看起来很简单,其实内部进行了很多的计算、赋值的过程。个人认为,了解这个过程对css的书写是有帮助的,比如,能写绝对值的时候尽量不要写相对值,能减少css计算,能进行本身样式值设置的时候不然依赖于父元素等。

时间: 2024-10-14 18:20:16

关于dom元素上css属性值的取值过程的相关文章

获取元素的css属性之getComputedStyle

习惯了用jQuery的css()的方法获取元素的css属性,突然不用jQquery了,当要获得元素的css时候,我瞬间停顿了一下,咦?咋获取元素的css值?比如获取元素的width.是这样么?document.getElementById("id").style.width? 一.getComputedStyle getComputedStyle,见名之意,就是获取元素计算之后的样式属性值,也就是获取当前元素所有最终使用的CSS属性值.返回的是一个CSS样式声明对象([object C

jQuery查看dom元素上绑定的事件列表

作为技术狂热分子的职业本能,看到一个技术产品的功能,总会忍不住想知道它是怎么被实现的.比如我每每看到别人网站一个很炫的界面或者很酷的功能,就忍不住打开了浏览器的控制台... 好,不扯远,说说当你想看到网站上某个元素绑定的事件函数的代码时应该怎么做吧. 查看原生绑定的事件函数代码 所谓原生就是通过addEventListener方法绑定到dom元素上.这个好办: 审查绑定事件的元素(对着它右键->审查元素) 在弹出的Elements视图的控制台,右侧点击“Event Listeners”页签 然后

vue获取DOM元素并设置属性

这里我想到了2个方法: 方法一: 直接给相应的元素加id,然后再document.getElementById("id");获取,然后设置相应属性或样式 方法二: 使用ref,给相应的元素加ref=“name” 然后再this.$refs.name获取到该元素 注意:在获取相应元素之前,必须在mount钩子进行挂载,否则获取到的值为空,    如果是给子组件加id并修改自定义属性,则直接会加载改子组件对应的外层div上,并不会改变该子组件原本的自定义属性的值   如果给子组件加ref,

VS+SqlServe 在引用了webservice后刷新数据时提示:已超过传入消息(65536)的最大消息大小配额若要增加配额请使用相应绑定元素上 MaxReceivedMessageSize 属性

使用了VS建立了webservice 后,在VS项目中添加了引用,可是在今天从sqlserve中取数据时, 突然提示:已超过传入消息(65536)的最大消息大小配额若要增加配额请使用相应绑定元素上 MaxReceivedMessageSize 属性 这让我那叫一个郁闷啊,之前都是一直好用,为什么突然就不好用了????????? 后来根据提示分析和上网查资料分析,猜测可能是数据量问题,再去找如何绑定元素上 MaxReceivedMessageSize属性,经过了几个小时的处理终于找到解决方案了:

DOM元素对象的属性和方法(1)

一.accessKey() 作用:获取元素焦点快捷键:设置快捷键后,使用Alt+快捷键,让元素快速获得焦点, <!DOCTYPE html> <html> <head> <title>element.accesskey</title> <meta charset="utf-8"> </head> <body> <input type="text" id="

DOM 元素对象的属性方法

在 HTML DOM (文档对象模型)中,每个部分都是节点. 节点是DOM结构中最基本的组成单元,每一个HTML标签都是DOM结构的节点. 文档是一个    文档节点 . 所有的HTML元素都是    元素节点 所有 HTML 属性都是    属性节点 文本插入到 HTML 元素是    文本节点 注释是    注释节点. 最基本的节点类型是Node类型,其他所有类型都继承自Node,DOM操作往往是js中开销最大的部分,因而NodeList导致的问题最多.要注意:NodeList是‘动态的’,

MutationObserver监听DOM元素结构变化和属性变化实例

1 var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver;//浏览器兼容 2 var config = { attributes: true, childList: true}//配置对象 3 $("要监听的DOM元素").each(function(){ 4 var _this = $(this); 5 var obse

DOM元素对象的属性和方法(2)

11.contentEditable 作用:设置或返回元素内容可否编辑布尔值,HTML5新增属性 <!DOCTYPE html> <html> <head> <title>cloneNode</title> <meta charset="utf-8"> </head> <body> <ul id="one"> <li>可编辑</li>

08.16号 dom 节点的创建 和删除DOM表单与非表单取值的方法 和操作属性与操作样式

<html> <head> <meta charset="utf-8"> <title>Dom操作</title> <script type="text/javascript" src="08.16/08.16.js"></script> </head> <body> <!--dom节点添加 删除 ; createElemen 创建一