关于“如何获得页面上元素的背景色”这个奇葩的面试问题

原题: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)算法。但是即使写出来了又有什么意义呢?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值