菜单

记一涂鸦天猫首页奇葩之渲染问题

2018年12月14日 - CSS/CSS3

记一遍于Taobao首页奇葩的渲染问题

2015/11/23 · CSS ·
渲染

原文出处: 天猫前端团队(FED)-
阎王
   

图片 1

恐怕你曾当 Chrome 浏览器上遭受过那样为人瞠目结舌的题目:

如上列举到之老两只问题,我当护Tmall首页的上都遭遇了。这么些依然浏览器渲染页面时,因为渲染引擎的
bug 导致的问题,不广,更加不便形容 demo
演示,它们就以一定的繁杂气象下,程序总结在误差或者漏洞的早晚起,尤其是干到分界判断的当儿。

图片 2

题材复现

非凡宝贵有会吃我赶上一个得复现的,我把它记录下来了。如下图所示,hover
到上模块的边界地方时:

图片 3

手动 hover 和模仿 hover
都发平等的题材,没有多想,立马加上了千篇一律词话修复了此问题:

CSS

.channel2 .channel-item { transform: translateZ(0); }

1
2
3
.channel2 .channel-item {
    transform: translateZ(0);
}

夫不是直觉,多次遇见这种奇葩问题,我首先想开的就是是用 3D
加速将以此渲染层隔离渲染,80%
以上的概率会解决问题,而化解问题之关键在于找准加这句代码的 DOM 元素。

                                           文/楠木

探索 bug

是层在自己之代码中毫无疑问是匪存在的,我们只可以用 bug
来形容这题目。因为元素刚好贴在 .channel2 的境界,估摸应该跟层渲染有关,于是打开了控制台 ESC -> Rendering -> Show layer borders,看到了此:

图片 4

密切观看,可以见见,那一个粉红色块在瓦片边界与父元素边界中,可以看清,这么些瓦片在渲染的时刻在问题。


此处用加下有关瓦片的学问。瓦片,英文里头称之为 tile,它是
webkit/blink
渲染页面时之高中级经过,将全页面分成多单高低相同的瓦片,并作渲染每个瓦片的情。一个元素被
3D
硬件加速之后,会化为一个独门的交汇,这个层的渲染也会叫划分成瓦片,可以设想变为一个子页面。

瓦片和瓦片之间的边界总括是处理的难,因为渲染的情无法错位。


其实为自家找到问题根本原因的是,rendering
块的颜色,通常当网页上起首启 show layer borders 看到底是半透明的青色块,而这里显示的是黄色块,搜索了生非同色块象征的义,没找到切实可行的文档表明,可是找到了 代码:

JavaScript

// Missing resize invalidations are in salmon pink. SkColor
DebugColors::MissingResizeInvalidations() { return SkColorSetARGB(255,
255, 155, 170); }

1
2
3
4
// Missing resize invalidations are in salmon pink.
SkColor DebugColors::MissingResizeInvalidations() {
  return SkColorSetARGB(255, 255, 155, 170);
}

相应的哪怕是者颜色,“缺失调整验证”,在 chromium
的源码仓库着搜了上边的代码,找到了 现实表达:

JavaScript

if (!deflated_content_rect.Contains(canvas_playback_rect)) { if
(clear_canvas_with_debug_color) { // Any non-painted areas outside
of the content bounds are left in // this color. If this is seen then it
means that cc neglected to // rerasterize a tile that used to intersect
with the content rect // after the content bounds grew.
canvas->save(); canvas->translate(-canvas_bitmap_rect.x(),
-canvas_bitmap_rect.y());
canvas->clipRect(gfx::RectToSkRect(content_rect),
SkRegion::kDifference_Op);
canvas->drawColor(DebugColors::MissingResizeInvalidations(),
SkXfermode::kSrc_Mode); canvas->restore(); } }

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
if (!deflated_content_rect.Contains(canvas_playback_rect)) {
  if (clear_canvas_with_debug_color) {
    // Any non-painted areas outside of the content bounds are left in
    // this color.  If this is seen then it means that cc neglected to
    // rerasterize a tile that used to intersect with the content rect
    // after the content bounds grew.
    canvas->save();
    canvas->translate(-canvas_bitmap_rect.x(), -canvas_bitmap_rect.y());
    canvas->clipRect(gfx::RectToSkRect(content_rect),
                     SkRegion::kDifference_Op);
    canvas->drawColor(DebugColors::MissingResizeInvalidations(),
                      SkXfermode::kSrc_Mode);
    canvas->restore();
  }
}

这边能看的定就是是注释啦,没有尽多上下文,看之挺头疼!大致翻译了下上下几乎截注释:

  1. 就是完全盖,对于触际遇渲染层边界的栅格化处理,我们仍要,在上次记录没有遮盖到之纹理下方和纹理化线性过滤的上,栅格化处理背景颜色。
  2. 内容的末尾的纹理可能只有有于栅格覆盖
  3. 于内容边界外无于渲染到的片以利用 MissingResizeInvalidations
    颜色,如果是片会给看见,这固然表示程序忽视处理了内边边界增长后栅格化与情相交的瓦。

从第三句大致可精通及,因为元素的边际增长造成了这渲染
bug,回头看了下元素的鄂状态,果然…

     
明天,我的随笔《相思莫相负》通过了简书首页。当自家收《首页投稿》通告我透过的紧缺信时,当我看来于首页看到自己的著作时,内心如故由了涟漪,有惊喜不借。虽然一万大多少人口关注之首页,每一日几百篇作品通过,对于那一个大咖们来说,很易就可以拿到首页通过,在他们眼里并没有啊,是屡见不鲜。然则,每个人倒之路程不等同,这长达路给我倒是是一律种的的一定跟鼓励。在即时漫漫路上,我爬得可怜缓慢,慢到接近要叫千军万马的亲笔大军淹没掉。由此,首页通过,对于我的话,它是一个初的起源,激励着我累写又好的小说。

直接原因

大家看 hover 上去未来,层边界的变:

图片 5

死明朗,这里的冲天溢起了,不过没处理,看了产这多少个因素的
css,确实中度上并未做处理,在要素上补偿加

CSS

.channel-item { overflow: hidden; }

1
2
3
.channel-item {
  overflow: hidden;
}

同可以解决问题。

最终之缓解手段:

图片 6

臃肿渲染之题目本身要么相比好以 3d
硬件加速来拍卖,而 overflow:hidden 这样的 css
布局处理及,我是休太推荐的,搞不佳就拿何人要之始末隐藏掉了。

     
我自十二月二日自,每一天百折不挠写1000配,为了不吃好犯懒,特地以《每一日写1000许》专题里投稿打卡,到前些天恰巧25龙。25龙里,我几天天还投首页,天天都给拒绝。我发生一致抹倔强,心想:既然被拒,肯定是尚从未达标可经过的水准,这激发着本人再一次大力地做。于是,我无歇地勾画,不歇地照耀。到后来,我一度见惯司空了,也不失去于完全各一个牵动在哭脸的退稿简信,也无去想简书的编写等是否烦我每一日还投。

看似题材处理方案

如之后我们境遇类似的问题,可以打开 chrome
的叠以及瓦片分析工具,看看渲染出来的片有没有出坏色块,尤其是肉色块。也可洞察交互过程被,元素的边际发生没有暴发变。

CSS
于浏览器被的渲染是大家接触相比少之知识,要是想快找到题目,必须对浏览器的渲染原理有所精通,并且会熟习的以
chrome 提供的调剂工具,这是基础。

1 赞 1 收藏
评论

图片 7

     
我回来了祥和的初心:当初赶到简书,就是爱她那种简易而一目精通的阳台风格。每一天自己可以看出自己写了多少字,这时候自己就是想,等自于此描绘了10万许后会是什么的温馨?就立即一个目的,足以让自己希望和坚定不移。后来察觉此尚可以看见来小人读书,有怎么样的评价,甚至前些天我才注意到甚至还有打赏,这个奇怪的大悲大喜都吃自家死喜爱简书这些平台。那么,既然还未能走及这无异立,就逐步移动下来好了。这一起拿走的点点滴滴也是不利的呢。什么人知道接下会有什么的惊喜在抵正在你吧?

     
像今天正巧通过首页的那么篇作品,就吃一个《每一天醒来一点点》的专题收去了。有人喜欢自己之契,这是各类一个写作者最可怜的嗜吧,总的我是的。我欣赏被肯定,被喜好,被鼓励,假设说自家是极端缺爱吧,那么,我哉确认的。因为,没有丁晤面规避得过心中最实际的感受。当自家知道,总起一个人数当私自地眷顾着我之各一样首作品时,我的心坎是最为温暖的。无论有没有经过首页,无论将来发无写来什么名堂。这多少个过程,有人陪同,是不行幸福之一模一样码事。所以,每一个小小的前行都谋面为我缅怀分享给陪同在自己的朋友等。

       小豫说“分享是一律种植快乐”,于我倒是再也多的凡一致份感动;

       青柠说“真替你心满意足;”

     
 覃说:你可知心若水,不见世间波,不与尘世浪;不粘尘,不惹俗,看正在平静;

       心情舒畅说:滚滚红尘,能发您这意竟者甚少,真心为而沾许。

     
 文字的社会风气,有人理解你,是老大美好的等同种感觉。快乐和震动,总是在深深浅浅的日子里互相交替着。

     
我挺领悟,我之程非凡狭小,只会写好喜欢的字,不明了干货,不知推广。这条路并无汇合为经首页就突然开阔,这长长的总长呢并无相会坐多矣若干粉丝虽易走。我生自身的百折不挠和信念,我起自我之指望和追求,哪怕再增长又缓缓再为难走,我为无怨无悔。因为,我就享受及了此历程的上上下下美好。所以,先天自己将经过首页的那些经过及感受记下来,一啊砥砺自己,二凡是唯恐也可以拉到片还于途中、和本人当时同一坚持的朋友等运动至即同样龙。

     
走对了路程,爱对了人数,就甭怕什么坚苦险阻,山大水长。坚韧不拔下去就得了,我是这般认为的。爱,是极其美好的坚定不移不懈。生活是仿的整整,而文是生活的雅观。我吧是这般觉得的。

     
热爱文字,热爱写作,这已经化为自生之主旋律,我之在也因为这么些要精采起来。但愿你呢是。


生在形容着爱在,追求一生顺遂的苍穹。

假若你喜欢,您的珍贵以及点赞比打赏更会激励自己!

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图