热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

每个前端开发人员应该知道的网页呈现

2014年5月26日,由AlexanderSkutin撰写;由MaxShirshin于2014年6月30日翻译今天我想关注网页呈现的主题,以及为什么它在网页开发中很重要。有很多文章

2014年5月26日, 由Alexander Skutin撰写; 由Max Shirshin于2014年6月30日翻译

今天我想关注网页呈现的主题,以及为什么它在网页开发中很重要。有很多文章可用于涵盖这个主题,但是信息是分散的,以某种方式分散。例如,为了包围我的头脑,我不得不学习很多来源。这就是为什么我决定写这篇文章。我相信这篇文章对于初学者以及想要刷新和构建他们已经知道的更多高级开发人员将是有用的。

当页面布局被定义时,渲染必须从一开始就进行优化,因为样式和脚本在页面呈现中起关键作用。专业人士必须了解某些技巧以避免性能问题。

本文不详细研究内部浏览器的机制,而是提供一些常见的原则。不同的浏览器引擎的工作方式不同,这将使浏览器特定的研究变得更加复杂。

浏览器如何呈现网页
我们从绘制页面时浏览浏览器操作的概述开始:

1.DOM(文档对象模型)由从服务器接收的HTML形成。
2.样式被加载和解析,形成了CSSOM(CSS对象模型)。
3.在DOM和CSSOM之上,创建一个渲染树,它是一组要渲染的对象(Webkit调用那些“渲染器”或“渲染对象”,而在Gecko中它是一个“框架”)。渲染树反映除了不可见元素之外的DOM结构(如标签或已display:none;设置的元素)。每个文本字符串在渲染树中作为单独的渲染器表示。每个渲染对象都包含其对应的DOM对象(或文本块)加上计算的样式。换句话说,渲染树描述了DOM的视觉表示。
对于每个渲染树元素,计算其坐标,称为“布局”。浏览器使用一个流程方法,只需要一次传递来布局所有元素(表需要多个遍)。
最后,这实际上显示在浏览器窗口中,一个称为“绘画”的过程。
当用户与页面进行交互或脚本进行修改时,必须重复上述某些操作,因为底层页面结构发生变化。

重印
当改变不影响页面上的元素的位置元素的样式(例如background-color,border-color,visibility),浏览器只是应用了新样式再次重绘元素(即意味着“重画”或“restyle”正在发生的事情)。

回流
当更改影响文档内容或结构或元素位置时,会发生回流(或重新传输)。这些更改通常是由以下机制触发的:

DOM操作(元素添加,删除,更改或更改元素顺序);
内容更改,包括表单字段中的文本更改;
1计算或改变CSS属性;
2添加或删除样式表;
3改变“类”属性;
4浏览器窗口操纵(调整大小,滚动);
5伪类激活(:hover)。
浏览器如何优化渲染
浏览器正在尽最大努力将重绘/回流限制到仅覆盖已更改元素的区域。例如,绝对/固定定位元素中的大小变化仅影响元素本身及其后代,而静态定位元素中的相似变化会触发所有后续元素的回流。

另一种优化技术是在运行Javascript代码时,浏览器会缓存这些更改,并在代码运行后将其应用于单次传递。例如,这段代码只会触发一个回流和重绘:

var $body = $(‘body’);
$body.css(‘padding’, ‘1px’); // reflow, repaint
$body.css(‘color’, ‘red’); // repaint
$body.css(‘margin’, ‘2px’); // reflow, repaint
// only 1 reflow and repaint will actually happen
但是,如上所述,访问元素属性会触发强制回流。如果我们添加一个额外的行,将元素属性读入上一个块,则会发生这种情况:

var $body = $(‘body’);
$body.css(‘padding’, ‘1px’);
$body.css(‘padding’); // reading a property, a forced reflow
$body.css(‘color’, ‘red’);
$body.css(‘margin’, ‘2px’);

因此,我们得到2个回流而不是一个回流。因此,您应该将读取元素属性组合在一起以优化性能(请参阅 JSBin上的更详细示例)。

有时您必须触发强制回流。示例:我们必须将相同的属性(例如“margin-left”)应用于同一个元素两次。最初,它应该被设置为100px没有动画,然后它必须是动画与transition一个值50px。您现在可以在JSBin上学习这个例子,但是我将在这里进行更详细的描述。

我们首先创建一个具有转换的CSS类:

.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;

}
然后继续执行:

// our element that has a “has-transition” class by default
var $targetElem = $(‘#targetElemId’);

// remove the transition class
$targetElem.removeClass(‘has-transition’);

// change the property expecting the transition to be off, as the class is not there
// anymore
$targetElem.css(‘margin-left’, 100);

// put the transition class back
$targetElem.addClass(‘has-transition’);

// change the property
$targetElem.css(‘margin-left’, 50);
然而,这种实现不能像预期的那样工作。这些更改被缓存并应用于代码块的末尾。我们需要的是强制回流,我们可以通过进行以下更改来实现:

// remove the transition class
$(this).removeClass(‘has-transition’);

// change the property
$(this).css(‘margin-left’, 100);

// trigger a forced reflow, so that changes in a class/property get applied immediately
$(this)[0].offsetHeight; // an example, other properties would work, too

// put the transition class back
$(this).addClass(‘has-transition’);

// change the property
$(this).css(‘margin-left’, 50);
现在这样按预期工作。

优化实用建议
总结可用信息,我可以推荐以下内容:

创建有效的HTML和CSS,不要忘记指定文档编码。样式应包含在中,附加到标签末尾的脚本。
尝试简化和优化CSS选择器(这种优化几乎被大多数使用CSS预处理器的开发人员普遍忽略)。保持嵌套水平至少。这是CSS选择器根据其性能(从最快的)开始排名的方式:
识别者: #id
类: .class
标签: div
相邻的兄弟选择器: a + i
家长选择器 ul > li
通用选择器 *
属性选择器 input[type=”text”]
伪类和pseudoelements:a:hover 你应该记住,浏览器从右到左的处理选择,这就是为什么最右边的选择应该是最快的国家之一-要么#id或.class:
div * {…} // bad
.list li {…} // bad
.list-item {…} // good

list .list-item {…} // good

在脚本中,尽量减少DOM操作。缓存所有内容,包括属性和对象(如果要重复使用)。执行复杂操作时,最好使用“离线”元素(“离线”元素是从DOM断开并仅存储在内存中),然后将其附加到DOM。
如果您使用jQuery选择元素,请遵循jQuery选择器最佳做法。
要更改元素的样式,修改“类”属性是最有效的方式之一。您执行此更改的DOM树越深,越好(也是因为这有助于将逻辑与演示分离)。
动画只有绝对/固定的元素,如果可以的话。
在:hover滚动时禁用复杂动画是一个好主意(例如,通过向添加一个额外的“no-hover”类)。阅读有关此主题的文章。
有关更详细的概述,请查看这些文章:

浏览器的工作原理
渲染:重绘,回流/重新传输,修复
我希望你能发现这篇文章有用!

2014年6月30日
[RU] РендерингWEB-страницы:чтообэтомдолжензнать前端разработчик
亚历山大Skutin
现场: http://skutin.ru/
Max Shirshin
GitHub: ingdir
推特: @ingdir
Facebook 推特 Google+
如果您发现有错误,请随时在GitHub上进行 编辑。
评论由Disqus提供支持


推荐阅读
  • 解决 Windows Server 2016 网络连接问题
    本文详细介绍了如何解决 Windows Server 2016 在使用无线网络 (WLAN) 和有线网络 (以太网) 时遇到的连接问题。包括添加必要的功能和安装正确的驱动程序。 ... [详细]
  • 网站访问全流程解析
    本文详细介绍了从用户在浏览器中输入一个域名(如www.yy.com)到页面完全展示的整个过程,包括DNS解析、TCP连接、请求响应等多个步骤。 ... [详细]
  • javascript分页类支持页码格式
    前端时间因为项目需要,要对一个产品下所有的附属图片进行分页显示,没考虑ajax一张张请求,所以干脆一次性全部把图片out,然 ... [详细]
  • 解决Parallels Desktop错误15265的方法
    本文详细介绍了在使用Parallels Desktop时遇到错误15265的多种解决方案,包括检查网络连接、关闭代理服务器和修改主机文件等步骤。 ... [详细]
  • 使用React与Ant Design 3.x构建IP地址输入组件
    本文深入探讨了利用React框架结合Ant Design 3.x版本开发IP地址输入组件的方法。通过详细的代码示例,展示了如何高效地创建具备良好用户体验的IP输入框,对于前端开发者而言具有较高的实践指导意义。 ... [详细]
  • 通过 CSS 中的 transition 属性,可以轻松实现元素状态变化时的平滑过渡效果。本文将详细介绍如何使用 transition 属性,并提供一个具体的示例。 ... [详细]
  • 第二十五天接口、多态
    1.java是面向对象的语言。设计模式:接口接口类是从java里衍生出来的,不是python原生支持的主要用于继承里多继承抽象类是python原生支持的主要用于继承里的单继承但是接 ... [详细]
  • Bootstrap 支持用户自定义样式调整。即使长时间未使用 Bootstrap,也可以通过添加新的 CSS 类或覆盖现有类来轻松修改默认样式,以满足特定的设计需求。 ... [详细]
  • 在使用Eclipse进行调试时,如果遇到未解析的断点(unresolved breakpoint)并显示“未加载符号表,请使用‘file’命令加载目标文件以进行调试”的错误提示,这通常是因为调试器未能正确加载符号表。解决此问题的方法是通过GDB的`file`命令手动加载目标文件,以便调试器能够识别和解析断点。具体操作为在GDB命令行中输入 `(gdb) file `。这一步骤确保了调试环境能够正确访问和解析程序中的符号信息,从而实现有效的调试。 ... [详细]
  • 在 LeetCode 的“有效回文串 II”问题中,给定一个非空字符串 `s`,允许删除最多一个字符。本篇深入解析了如何判断删除一个字符后,字符串是否能成为回文串,并提出了高效的优化算法。通过详细的分析和代码实现,本文提供了多种解决方案,帮助读者更好地理解和应用这一算法。 ... [详细]
  • 每日前端实战:148# 视频教程展示纯 CSS 实现按钮两侧滑入装饰元素的悬停效果
    通过点击页面右侧的“预览”按钮,您可以直接在当前页面查看效果,或点击链接进入全屏预览模式。该视频教程展示了如何使用纯 CSS 实现按钮两侧滑入装饰元素的悬停效果。视频内容具有互动性,观众可以实时调整代码并观察变化。访问以下链接体验完整效果:https://codepen.io/comehope/pen/yRyOZr。 ... [详细]
  • 在HTML5应用中,Accordion(手风琴,又称抽屉)效果因其独特的展开和折叠样式而广泛使用。本文探讨了三种不同的Accordion交互效果,通过层次结构优化信息展示和页面布局,提升用户体验。这些效果不仅增强了视觉效果,还提高了内容的可访问性和互动性。 ... [详细]
  • 织梦系统多条件联动筛选功能详细教程及删除操作指南
    多条件联动筛选功能广泛应用于图片展示、装修设计、机械设备和在线商城等场景,通常筛选条件应聚焦于用户最关心的要素,而非涵盖所有可能的选项。在DedeCMS中,多条件筛选的PHP开发并未内置删除已选条件的功能,但通过理解PHP筛选与JS筛选的不同机制,实现这一功能相对简单且易于操作。 ... [详细]
  • 期末Web开发综合实践项目:运用前端技术打造趣味小游戏体验
    期末Web开发综合实践项目中,学生通过运用HTML、CSS和JavaScript等前端技术,设计并实现了一款趣味性十足的小游戏。该项目不仅检验了学生对前端基础知识的掌握情况,还提升了他们的实际操作能力和创意设计水平。视频链接展示了项目的最终成果,直观呈现了游戏的互动性和视觉效果。 ... [详细]
  • PyQt5 QTextEdit:深入解析Python中多功能GUI库的应用与实现
    本文详细探讨了 PyQt5 中 QTextEdit 组件在 Python 多功能 GUI 库中的应用与实现。PyQt5 是 Qt 框架的 Python 绑定,提供了超过 620 个类和 6000 个函数及方法,广泛应用于跨平台应用程序开发。QTextEdit 作为其中的重要组件,支持丰富的文本编辑功能,如富文本格式、文本高亮和自定义样式等。PyQt5 的流行性不仅在于其强大的功能,还在于其易用性和灵活性,使其成为开发复杂用户界面的理想选择。 ... [详细]
author-avatar
黄宗翰琼琦莉雯
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有