最新文章专题视频专题问答1问答10问答100问答1000问答2000关键字专题1关键字专题50关键字专题500关键字专题1500TAG最新视频文章推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37视频文章20视频文章30视频文章40视频文章50视频文章60 视频文章70视频文章80视频文章90视频文章100视频文章120视频文章140 视频2关键字专题关键字专题tag2tag3文章专题文章专题2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章专题3
当前位置: 首页 - 科技 - 知识百科 - 正文

cssrelayoutrepaint导致ios下的bug_html/css

来源:懂视网 责编:小采 时间:2020-11-27 16:35:06
文档

cssrelayoutrepaint导致ios下的bug_html/css

cssrelayoutrepaint导致ios下的bug_html/css_WEB-ITnose:问题 近日在做移动端web时发现一个问题就是在ios中如果动画元素使用了left top值时在微信易信客户端中不能使用系统的复制文本功能了。纠结了许久,后来在大神的提醒下,了解到是因为css的repaint导致的。改用了css3的translate以后就OK了, 查了一下资
推荐度:
导读cssrelayoutrepaint导致ios下的bug_html/css_WEB-ITnose:问题 近日在做移动端web时发现一个问题就是在ios中如果动画元素使用了left top值时在微信易信客户端中不能使用系统的复制文本功能了。纠结了许久,后来在大神的提醒下,了解到是因为css的repaint导致的。改用了css3的translate以后就OK了, 查了一下资

问题

近日在做移动端web时发现一个问题就是在ios中如果动画元素使用了left top值时在微信易信客户端中不能使用系统的复制文本功能了。纠结了许久,后来在大神的提醒下,了解到是因为css的repaint导致的。改用了css3的translate以后就OK了, 查了一下资料,发现有以下的一些知识点,现在贴出来,有需要的人可以看看。参考资料:https://github.com/AlloyTeam/Mars/blob/master/performance/css-property-animation-performance.md

缘由

CSS动画属性会触发整个页面的重排relayout、重绘repaint、重组recomposite
Paint通常是其中最花费性能的,尽可能避免使用触发paint的CSS动画属性,这也是为什么我们推荐在CSS动画中使用webkit-transform: translateX(3em)的方案代替使用left: 3em,因为left会额外触发layout与paint,而webkit-transform只触发整个页面composite
div {
-webkit-animation-duration: 5s;
-webkit-animation-name: move;
-webkit-animation-iteration-count: infinite;
-webkit-animation-direction: alternate;
width: 200px;
height: 200px;
margin: 100px;
background-color: #808080;
position: absolute;
}
@-webkit-keyframes move{

from { left: 100px;}to { left: 200px;}

}
如下图使用left将持续触发页面重绘,表现为红色边框:

move

@-webkit-keyframes move{

from { -webkit-transform: translateX(100px);}to { -webkit-transform: translateX(200px);}

}

如下图使用-webkit-transform页面只发生重组,表现为橙色边框:

move2

CSS属性在CSS动画中行为表

浏览器绘制 DOM 的过程是这样子的:

获取 DOM 并将其分割为多个层(layer)将每个层独立地绘制进位图(bitmap)中将层作为纹理(texture)上传至 GPU复合(composite)多个层来生成最终的屏幕图像。

left/top/margin 之类的属性会影响到元素在文档中的布局,当对布局(layout)进行动画时,该元素的布局改变可能会影响到其他元素在文档中的位置,就导致了所有被影响到的元素都要进行重新布局[1],浏览器需要为整个层进行重绘并重新上传到 GPU,造成了极大的性能开销。

transform 属于合成属性(composite property),对合成属性进行 transition/animation 动画将会创建一个合成层(composite layer),这使得被动画元素在一个独立的层中进行动画。通常情况下,浏览器会将一个层的内容先绘制进一个位图中,然后再作为纹理(texture)上传到 GPU,只要该层的内容不发生改变,就没必要进行重绘(repaint),浏览器会通过重新复合(recomposite)来形成一个新的帧[2]。

层创立的条件如下:

3D 或透视变换 CSS 属性使用加速视频解码的 

总结:

对布局属性进行动画,浏览器需要为每一帧进行重绘并上传到 GPU 中对合成属性进行动画,浏览器会为元素创建一个独立的复合层,当元素内容没有发生改变,该层就不会被重绘,浏览器会通过重新复合来创建动画帧

另外可以参考http://csstriggers.com/ 里面有各种属性对页面布局,重绘,重排的影响关系。

文档

cssrelayoutrepaint导致ios下的bug_html/css

cssrelayoutrepaint导致ios下的bug_html/css_WEB-ITnose:问题 近日在做移动端web时发现一个问题就是在ios中如果动画元素使用了left top值时在微信易信客户端中不能使用系统的复制文本功能了。纠结了许久,后来在大神的提醒下,了解到是因为css的repaint导致的。改用了css3的translate以后就OK了, 查了一下资
推荐度:
标签: ios bug html
  • 热门焦点

最新推荐

猜你喜欢

热门推荐

专题
Top