part3:还是dom操作的优化

    开篇先让我们了解一下重排版(reflow)和重绘(repaint)。根据我的理解,发生重排版就一定会发生重绘。当页面中元素的width,height,margin,border,等属性发生改变时(也可以理解为大小,位置,形状,内容改变时),这些发生改变的元素和受这些改变影响的其他元素的几何属性会被浏览器重新计算,重构渲染树,这叫做重排版。然后浏览器重新绘制屏幕上受影响的部分,这叫重绘。当我们只改变元素的颜色时,只会发生重绘。另外,浏览器窗口大小改变,出现滚动条也会使浏览器对页面重排版。下面举一个优化的小例子:

var el = document.getElementById('mydiv');
el.style.borderLeft = '1px';
el.style.borderRight = '2px';
el.style.padding = '5px';

  如果这样写,页面会进行三次重排版,效率低下。

//优化版

var el = document.getElementById('mydiv');
el.style.cssText = 'border-left: 1px; border-right: 2px; padding: 5px;';

这样就只要重排版一次


  在平时的项目中,我们可能会遇到这样的工作,在页面中的列表中插入一些行新的数据。如果不注意,我们可能会写出这样的代码:

//原始的列表

<ul id="mylist">
<li><a href="http://phpied.com">Stoyan</a></li>

<li><a href="http://julienlecomte.com">Julien</a></li>
</ul>

//要插入的数据

var data = [
{
"name": "Nicholas",
"url": "http://nczonline.net"
},
{
"name": "Ross",
"url": "http://techfoolery.com"
}
];

//进行插入的函数

function appendDataToElement(appendToElement, data) {
var a, li;
for (var i = 0, max = data.length; i < max; i++) {
a = document.createElement('a');
a.href = data[i].url;
a.appendChild(document.createTextNode(data[i].name));
li = document.createElement('li');
li.appendChild(a);
appendToElement.appendChild(li);

}
};

这样插入数据,每插一条都会引起一次重排版,如果插个几百条。。。。那我们如何解决呢。

思路一:我们可以让原始的列表隐藏(display:none),把他从文档中摘除,然后进行数据插入,最后再把整个列表放回文档

思路二:在文档外创建一个dom片段,然后把这些数据插入到dom片段中,最后把dom片段插入到列表中。

思路三:用cloneNode创建一个原始列表的副本,把数据插入到副本中,最后用副本来覆盖原始的列表。

思路二的过程,涉及到的dom访问和重排版次数最少,所以只附上思路二的代码:

var fragment = document.createDocumentFragment();//记住这个生成dom片段的方法
appendDataToElement(fragment, data);
document.getElementById('mylist').appendChild(fragment);

    在我们操作元素模拟动画时,也要注意在元素动前把它进行绝对定位,让它脱离文档流,然后移动完成后再恢复。由于脱离文档流,它们在移动的过程中不会引起重排版。

    最后,是一点关于“查询并刷新渲染树改变”的内容,这一部分的文字我读着有点费劲。我认为原版的描述更好理解:Because of the computation costs associated with each reflow, most browsers optimize the reflow process by
queuing changes and performing them in batches. However, you may (often involuntarily) force the queue to be 
flushed and require that all scheduled changes be applied right away. Flushing the queue happens when you want to retrieve layout information, which means using any of the following:

• offsetTop, offsetLeft, offsetWidth, offsetHeight
• scrollTop, scrollLeft, scrollWidth, scrollHeight
• clientTop, clientLeft, clientWidth, clientHeight
• getComputedStyle() (currentStyle in IE)(在 IE 中此函数称为 currentStyle)

所以,不要这么做:

var computed,

tmp = '',
bodystyle = document.body.style;
if (document.body.currentStyle) { // IE, Opera
computed = document.body.currentStyle;
} else { // W3C
computed = document.defaultView.getComputedStyle(document.body, '');
}
bodystyle.color = 'red';
tmp = computed.backgroundColor;
bodystyle.color = 'white';
tmp = computed.backgroundImage;
bodystyle.color = 'green';
tmp = computed.backgroundAttachment;

这样好一些

bodystyle.color = 'red';
bodystyle.color = 'white';
bodystyle.color = 'green';
tmp = computed.backgroundColor;
tmp = computed.backgroundImage;
tmp = computed.backgroundAttachment;

dom优化的部分就到此为止了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随与博主沟通,第一间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值