当前位置: 首页 > Web前端 > CSS

从css到页面样式渲染

时间:2023-03-30 22:27:15 CSS

写了那么多class,color,background,display...;可能有时候会想怎么在页面上显示,改变元素的样式。本文简要介绍了整个解析、匹配、渲染过程css描述CSS是CascadingStyleSheets的简称,是一种样式表语言。对应各种语法规则,可以为HTML指定样式。基本规则图像来源。CSS规则由两部分组成:选择器和声明。上图中element对应的类选择器,后面是声明(Declaration)。每个语句由一个属性(Property)后跟一个冒号(:)和一个值(value)后跟一个分号(;)组成。CSS解析解析html或外部css文档,就是将文档转化为代码可以理解的有意义的结构。解析结果表示文档结构的节点树,解析分为词法分析和句法分析。词法分析也是编译原理中的一个术语。它从左到右一个字符一个字符地读取源程序,扫描字符流,根据构词规则识别单词。这个过程可以使用lex等工具自动生成。语法分析,主要任务是在词法分析的基础上,将单词序列组合成各种语法短语,如“程序”、“语句”、“表达式”等。解析工作通常分为两个部分:词法分析Decoder,负责将输入流分解为有效字符。解析器负责根据不同语言的语法规则分析文档结构,最后构建解析树。词法分析器知道如何去除不相关的字符,例如空格和换行符,并且是css解析所特有的,因为它是一种上下文无关的语法,可以被各种解析器解析。webkit使用Flex和Bison解析器生成器从css语法文件自动创建解析器。解析器将CSS文件解析为StyleSheet对象,每个对象包含CSS规则。CSS规则包含选择器和声明对象。上图是从像素生命周期的ppt中选出的一张图。有兴趣的可以看演讲视频。这非常简单。CSS样式规则将以各种方式进行索引,以便快速有效地进行搜索。实现各个样式属性的C++类,比如ppt中的BorderLeftColor类,是Python脚本在构建时自动生成的。具体在代码实现上,webkit使用CSSRuleSet对象保存样式规则,需要创建通用规则时调用createStyleRule();browsersmatchselectorsfromrighttoleft在使用css选择器进行样式匹配时,尽量少使用层级关系,因为这样可以减少选择器匹配的次数,提高css解析的效率。事实上,浏览器使用了从右到左的解析顺序,这也提高了效率。通常在写css样式的时候,我们一贯的思路是从左到右解析,从根节点开始,逐层遍历匹配,直到匹配到所有的选择器。浏览器以相反的顺序解析它们。从右向左匹配的好处我们简单回顾一下本题的上下文,也就是浏览器对页面的解析过程:HTML解析器生成DomTree,css解析器生成样式规则,即CSSOM树。Dom和CSSOM的匹配完成后,rendertree最终合并。根据rendertree开始布局...根据这张图,可以对渲染流程有个大概的了解。回到浏览器匹配css规则,如果只有一个选择器匹配一个元素,从左到右匹配似乎很合理,但正常情况是一个dom节点,比如

可能对应无数个css规则,没有上限,我可以在上面加很多样式。css匹配效率的关键是如何快速判断尽可能多的选择器无法匹配。我们先来看多层嵌套的css规则。比如#root.box.wrapi{},如果是从左到右解析,从最左边开始,直到最右边的选择器i,dom节点上没有i标签,遍历后排除css规则到最后。相反,从最右边的选择器部分开始匹配。如果不成功,整个匹配过程可以立即结束;如果成功,则继续向左匹配父节点,这与树的深度成正比。因此,浏览器的匹配方式可以很快排除大部分选择器。根据2009年在Firefox上做的测试,结论是只从最右边的选择器开始检查,可以排除70%的规则。快速移除2/3的CSS规则后,你只需要担心剩下的1/3。样式作用于DOM元素,通过解析器解析css文档,将数据保存在对象模型中,得到所有解析出的样式规则,结合浏览器提供的默认样式,最终的样式值为计算每个DOM元素。存储在ComputedStyle对象模型中,它是样式属性和值的映射。而getComputedStyle已经暴露出来了,可以在js中通过window.getComputedStyle获取元素最终的样式。SharedComputedStyle如果多个元素的computedStyle通过计算无法确定相等,那么这些元素只会计算一次样式,其余直接共享ComputedStyle。那些规则会共享computedStyle(有待验证):共享元素不能有id属性,CSS中有id的StyleRule,即使StyleRule不匹配元素,tagName和class属性必须是相同的。mappedAttribute必须相同。不能使用兄弟选择器,例如:first-child、:last-child。不能有样式属性,即使样式属性相同。他们也不分享。p1

p2

渲染页面绘制到屏幕后,页面结构的变化也可能导致renderingtree需要重新计算,其中Reflowing和repainting是最耗时的部分。在页面的生命周期中,随时可能发生回流(Layout)和重绘(Painting)。可见节点的位置和大小发生变化时会发生回流(reflow),回流的代价大于重绘。.至少会出现一次回流,发生在页面布局初始化的时候。触发重排的几种情况:添加或删除可见dom元素元素位置改变元素大小改变文本、内容、字体改变页面初始化渲染...repaints改变元素的外观属性(如background-color,border-color,visibility),在不影响整个布局的情况下,浏览器会根据元素的新属性重绘。重绘不会带来重新布局层组合(composite)DOM树中的每个节点对应一个LayoutObject,坐标空间相同的LayoutObjects属于同一个渲染层(RenderLayers)。渲染层保证元素按正确的顺序合成,元素的重叠和元素的透明度正常显示。在某些特殊情况下,满足指定条件的LayoutObject将拥有独立的渲染层,而其他layoutobject将与第一个拥有渲染层的父元素共享一个。使用chromeDevtools查看绘制过程。打开ChromeDevtools,按Esc键,然后在出现的面板上单击左上角的三个点。选择渲染并转到相应的选项卡。打开后,页面上闪烁的绿色区域表示该区域需要重绘。滚动侧边栏时,会出现一整块绿色。总结本文简单介绍了css的整个渲染过程,试图把很多复杂的知识点串起来,至少让平时和css打交道的我们大致了解一下流程是怎样的,同时也是一个总结我自己的学习过程。对于其中涉及的概念,可以作为切入点仔细研究。参考链接ThingsnobodyeverteachedmeaboutCSS缩小了样式计算的范围和复杂性为什么浏览器从右到左读取css规则why-do-browsers-match-css-selectors-from-right-to-left【HelloCSS】章节1-CSS语法与工作流编译原理词法分析、句法分析、语义分析浏览器的工作原理:现代网络浏览器的幕后花絮前端代码如何演变成像素通过浏览器显示在屏幕上WebkitCSS引擎分析简化复杂性绘图并减少绘图区域无线性能优化:复合