<table class="css">
<tr class="li1"><td class="ln"><pre class="de1">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441 //web.com// 相信不少人在做移动端动画的时候遇到了卡顿的问题,这篇文章尝试从浏览器渲染的角度;一点一点告诉你动画优化的原理及其技巧,作为你工作中优化动画的参考。文末有优化技巧的总结。 因为GPU合成没有官方规范,每个浏览器的问题和解决方式也不同;所以文章内容仅供参考。 浏览器渲染 提高动画的优化不得不提及浏览器是如何渲染一个页面。在从服务器中拿到数据后,浏览器会先做解析三类东西: 解析htmlxhtmlsvg这三类文档,形成dom树。 解析css,产生css rule tree。 解析js,js会通过api来操作dom tree和css rule tree。 解析完成之后,浏览器引擎会通过dom tree和css rule tree来构建rendering tree: rendering tree和dom tree并不完全相同,例如:或的东西就不会放在渲染树中。 css rule tree主要是完成匹配,并把css rule附加给rendering tree的每个。 在渲染树构建完成后, 浏览器会对这些元素进行定位和布局,这一步也叫做reflow或者layout。 浏览器绘制这些元素的样式,颜色,背景,大小及边框等,这一步也叫做repaint。 然后浏览器会将各层的信息发送给GPU,GPU会将各层合成;显示在屏幕上。 渲染优化原理 如上所说,渲染树构建完成后;浏览器要做的步骤: reflow——》repaint——》composite reflow和repaint reflow和repaint都是耗费浏览器性能的操作,这两者尤以reflow为甚;因为每次reflow,浏览器都要重新计算每个元素的形状和位置。 由于reflow和repaint都是非常消耗性能的,我们的浏览器为此做了一些优化。浏览器会将reflow和repaint的操作积攒一批,然后做一次reflow。但是有些时候,你的代码会强制浏览器做多次reflow。例如: JavaScript document.getElementById content contentWidth content.offsetWidth content document.getElementById content contentWidth content.offsetWidth content 以上第三行代码,需要浏览器reflow后;再获取值,所以会导致浏览器多做一次reflow。 下面是一些针对reflow和repaint的最佳实践: 不要一条一条地修改dom的样式,尽量使用className一次修改。 将dom离线后修改 使用documentFragment对象在内存里操作dom。 先把dom节点(会触发一次reflow)。然后做大量的修改后,再把它显示出来。 clone一个dom节点在内存里,修改之后;与在线的节点相替换。 不要使用布局,一个小改动会造成整个的重新布局。 和只会引起合成,不会引起布局和重绘。 从上述的最佳实践中你可能发现,动画优化一般都是尽可能地减少reflow、repaint的发生。关于哪些属性会引起reflow、repaint及composite,你可以在这个网站找到https//csstriggers.com/。 composite 在reflow和repaint之后,浏览器会将多个复合层传入GPU;进行合成工作,那么合成是如何工作的呢? 假设我们的页面中有A和B两个元素,它们有和属性;浏览器会重绘它们,然后将图像发送给GPU;然后GPU将会把多个图像合成展示在屏幕上。 XHTML
A
B
A
B
-586c5a0d3a1c9_articlex
我们将A元素使用属性,做一个移动动画:
XHTML
linear
from
to
A
B
linear
from
to
A
B
在这个例子中,对于动画的每一帧;浏览器会计算元素的几何形状,渲染新状态的图像;并把它们发送给GPU。(你没看错,也会引起浏览器重排的)尽管浏览器做了优化,在repaint时,只会repaint部分区域;但是我们的动画仍然不够流畅。
因为重排和重绘发生在动画的每一帧,一个有效避免reflow和repaint的方式是我们仅仅画两个图像;一个是a元素,一个是b元素及整个页面;我们将这两张图片发送给GPU,然后动画发生的时候;只做两张图片相对对方的平移。也就是说,仅仅合成缓存的图片将会很快;这也是GPU的优势——它能非常快地以亚像素精度地合成图片,并给动画带来平滑的曲线。
为了仅发生composite,我们做动画的css property必须满足以下三个条件:
不影响文档流。
不依赖文档流。
不会造成重绘。
满足以上以上条件的css property只有和。你可能以为也满足以上条件,但事实不是这样,举个例子属性可以使用百分比的值,依赖于它的offset parent。还有em、vh等其他单位也依赖于他们的环境。
我们使用来代替
XHTML