原题:https://gold.xitu.io/post/587dab348d6d810058d87a0a
我发现又是腾讯这种变态公司。垃圾!垃圾!垃圾!
简单的答案是基于CSSOM getComputedStyle()。当然这个不是面试官想要的答案。
所以你再想一想,实际上要考虑多个元素叠在一起的时候,以及背景色带透明度的情况下,alpha blending的问题。当然,CSS还有一个Blend Mode的新控制属性,不过可以不用管,无非是扩展了alpha blending的计算公式而已。
所以,如果知道元素下面的layer元素是谁,背景色多少,以及当然元素的getComputedStyle()返回的背景色,就可以用alpha blending算出最终的屏幕显示颜色。
真正有技术性的问题是:如何找到一个html元素下面一层layer的元素???
这个问题不简单。当然在简单的情况下,下面一层layer元素其实就是当前元素的parent。但是许多反常情况:
(1)硬件加速时,存在layer squashing的情况;
(2)存在floating元素显示在任意元素上方的情况——注意,floating里面的元素仍然照通常的parent逻辑
(3)考虑可能的CSS opacity控制
(4)z-index的情况下,如果一个元素不是显示在屏幕最顶端的,则它不存在所谓的“最终屏幕颜色”问题。但z-index处于顶端的元素,其下一层的layer元素显然需要从它的siblings兄弟节点中按z-index降序进行搜索,而且还要考虑intersect问题。
有没有一个方便的API,用来获得某个document坐标上最终显示的屏幕颜色呢?没有。CSSOM只能从layer RenderLayer/Object处获得信息,无法获取GraphicsLayer层的(更底层的对象要支持JS scripting的话,性能就成大问题了)。
那么,要没有一个方便的API,可以获得某个document坐标上HitTest命中的所有layer RenderLayer呢?应该是有的。当据我所知,还是没有。CSSOM本身是依附于DOM的,不能直接遍历RenderLayer的layer树。
代码?本人对这种藏有陷阱、摆大公司优越感的面试题甚为鄙视。比如说:写出求fibocci的2种算法?假如你只想到了递归和DP 2个版本,那肯定就完了。还有一个基于2*2矩阵乘法的O(lg n)算法。但是即使写出来了又有什么意义呢?