为什么每个前端开发者都要理解页面的渲染?
浏览器是怎样渲染一个页面的?
- 由从服务器接收到的 HTML 形成 DOM(文档对象模型)。
- 样式被加载和解析,形成 CSSOM(CSS 对象模型)。
- 紧接着 DOM 和 CSSOM 创建了一个渲染树,这个渲染树是一些被渲染对象的集合( Webkit 分别叫它们”renderer”和”render object”,而在Gecko 引擎中叫”frame”)。除了不可见的元素(比如 head 标签和一些有 display:none 属性的元素),渲染树映射了 DOM 的结构。在渲染树中,每一个文本字符串都被当做一个独立的 renderer。每个渲染对象都包含了与之对应的计算过样式的DOM 对象(或者一个文本块)。换句话说,渲染树描述了 DOM 的直观的表现形式。
- 对每个渲染元素来说,它的坐标是经过计算的,这被叫做“布局(layout)”。浏览器使用一种只需要一次处理的“流方法”来布局所有元素(tables需要多次处理)。
- 最后,将布局显示在浏览器窗口中,这个过程叫做“绘制(painting)”。
重绘
重排
- DOM 操作(如元素增、删、改或者改变元素顺序)。
- 内容的改变,包括 Form 表单中文字的变化。
- 计算或改变 CSS 属性。
- 增加或删除一个样式表。
- 改变”class”属性。
- 浏览器窗口的操作(改变大小、滚动窗口)。
- 激活伪类(如:hover状态)。
浏览器如何优化渲染?
- var $body = $('body');
- $body.css('padding', '1px'); // 重排, 重绘
- $body.css('color', 'red'); // 重绘
- $body.css('margin', '2px'); // 重排, 重绘
- // 实际上只有一次重排和重绘被执行。
如上面所说,访问一个元素的属性会进行一次强制重排。如果我们给上面的代码加上一行读取元素属性的代码,这个情况就会出现:
- var $body = $('body');
- $body.css('padding', '1px');
- $body.css('padding'); // 这里读取了一次元素的属性,一次强制重排就会发生。
- $body.css('color', 'red');
- $body.css('margin', '2px');
- .has-transition {
- -webkit-transition: margin-left 1s ease-out;
- -moz-transition: margin-left 1s ease-out;
- -o-transition: margin-left 1s ease-out;
- transition: margin-left 1s ease-out;
- }
然后进行实现:
- //我们的元素默认有"has-transition"属性
- var $targetElem = $('#targetElemId');
- //删除包含transition的class
- $targetElem.removeClass('has-transition');
- // 当包含transition的class已经没了的时候,改变元素属性
- $targetElem.css('margin-left', 100);
- // 再将包含transition的class添加回来
- $targetElem.addClass('has-transition');
- // 改变元素属性
- $targetElem.css('margin-left', 50);
- //删除包含transition的class
- $(this).removeClass('has-transition');
- // 改变元素属性
- $(this).css('margin-left', 100);
- //触发一次强制重排,从而使变化了的class或属性能够立即执行。
- $(this)[0].offsetHeight; // offsetHeight仅仅是个例子,其他的属性也可以奏效。
- // 再将包含transition的class添加回来
- $(this).addClass('has-transition');
- // 改变元素属性
- $(this).css('margin-left', 50);
现在这段代码如我们所期望的运行了。
实际的优化建议
- 创建合法的 HTML 和 CSS ,别忘了制定文件编码,Style 应该写在 head 标签中,script 标签应该加载 body 标签结束的位置。
- 试着简化和优化 CSS 选择器(这个优化点被大多数使用 CSS 预处理器的开发者忽略了)。将嵌套层数控制在最小。以下是 CSS 选择器的性能排行(从最快的开始):
- ID选择器:#id
- class选择器: .class
- 标签: div
- 相邻的兄弟元素:a + i
- 父元素选择器: ul > li
- 通配符选择器: *
- 伪类和伪元素: a:hover ,你应该记住浏览器处理选择器是从右向左的,这也就是为什么最右面的选择器会更快——#id或.class。
-
- div * {...} // bad
- .list li {...} // bad
- .list-item {...} // good
- #list .list-item {...} // good
- 在你的脚本中,尽可能的减少 DOM 的操作。把所有东西都缓存起来,包括属性和对象(如果它可被重复使用)。进行复杂的操作的时候,最好操作一个“离线”的元素(“离线”元素的意思是与 DOM 对象分开、仅存在内存中的元素),然后将这个元素插入到 DOM 中。
- 如果你使用 jQuery,遵循jQuery 选择器最佳实践
- 要改变元素的样式,修改“class”属性是最高效的方式之一。你要改变 DOM 树的层次越深,这一条就越高效(这也有助于将表现和逻辑分开)。
- 尽可能的只对 position 为 absolute 或 fix 的元素做动画。
- 当滚动时禁用一些复杂的 :hover动画是一个很好的主意(例如,给 body 标签加一个 no-hover 的 class)关于这个主题的文章。

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

HTML、CSS和JavaScript在Web开发中的作用分别是:1.HTML定义网页结构,2.CSS控制网页样式,3.JavaScript添加动态行为。它们共同构建了现代网站的框架、美观和交互性。

HTML的未来趋势是语义化和Web组件,CSS的未来趋势是CSS-in-JS和CSSHoudini,JavaScript的未来趋势是WebAssembly和Serverless。1.HTML的语义化提高可访问性和SEO效果,Web组件提升开发效率但需注意浏览器兼容性。2.CSS-in-JS增强样式管理灵活性但可能增大文件体积,CSSHoudini允许直接操作CSS渲染。3.WebAssembly优化浏览器应用性能但学习曲线陡,Serverless简化开发但需优化冷启动问题。

HTML的未来充满了无限可能。1)新功能和标准将包括更多的语义化标签和WebComponents的普及。2)网页设计趋势将继续向响应式和无障碍设计发展。3)性能优化将通过响应式图片加载和延迟加载技术提升用户体验。

HTML、CSS和JavaScript在网页开发中的角色分别是:HTML负责内容结构,CSS负责样式,JavaScript负责动态行为。1.HTML通过标签定义网页结构和内容,确保语义化。2.CSS通过选择器和属性控制网页样式,使其美观易读。3.JavaScript通过脚本控制网页行为,实现动态和交互功能。

HTML是构建网页结构的基石。1.HTML定义内容结构和语义,使用、、等标签。2.提供语义化标记,如、、等,提升SEO效果。3.通过标签实现用户交互,需注意表单验证。4.使用、等高级元素结合JavaScript实现动态效果。5.常见错误包括标签未闭合和属性值未加引号,需使用验证工具。6.优化策略包括减少HTTP请求、压缩HTML、使用语义化标签等。

HTML、CSS和JavaScript是构建现代网页的核心技术:1.HTML定义网页结构,2.CSS负责网页外观,3.JavaScript提供网页动态和交互性,它们共同作用,打造出用户体验良好的网站。

HTMLISNOTAPROGRAMMENGUAGE; ITISAMARKUMARKUPLAGUAGE.1)htmlStructures andFormatSwebContentusingtags.2)itworkswithcsssforstylingandjavascript for Interactivity,增强WebevebDevelopment。

HTML是一种用于构建网页的语言,通过标签和属性定义网页结构和内容。1)HTML通过标签组织文档结构,如、。2)浏览器解析HTML构建DOM并渲染网页。3)HTML5的新特性如、、增强了多媒体功能。4)常见错误包括标签未闭合和属性值未加引号。5)优化建议包括使用语义化标签和减少文件大小。
