几周前,我在 Android 中遇到了一个错误,如果您使用 css 在本机 Android 浏览器(WebKit 534.4)上放置一个画布元素,position:absolute; top:10px; left:100px;
则将复制的 Canvas(显然 android 使用一个用于 GPU 加速)呈现给浏览器而忽略定位。
因此,如果我的位置有一个画布,top:100px; left:100px;
我的画布将完美地放置在适当的位置,但 GPU 加速画布将忽略它并将位于左上角(请参阅我之前的问题中的图像
Android本机浏览器复制HTML5画布(在chrome中很好)
我找到了一个解决方案,改为使用 CSS 翻译,就像这样,transform: translate(100px, 100px);
现在解决了这个问题,因为 GPU 加速画布呈现在同一个地方(所以它不会出现重复)......
但作为一种连锁效应,我现在有一个点击错误。
由于我将画布居中,当窗口宽度小于设备宽度时,X 位置将为负值,发生这种情况时画布的唯一可点击区域是在没有定位的情况下显示的区域。
这很难解释,但希望这张图片能让它更清楚
我认为这是浏览器本身的问题,因为即使我有这段代码,警报也不会从屏幕的一半触发
canvas.addEventListener('click', function(e) { alert('click'; });
我猜 CSS 位置 top 和 left 使用 CPU 移动画布,因此 GPU 生成的画布在错误的位置,但 CSS translate 使用 GPU 移动画布,因此 GPU 生成的画布正确定位但 CPU 是在没有此偏移的情况下读取鼠标事件........AHHHHH!
编辑:在更多设备上进行测试后,我可以确认这似乎是使用低于 535 的 webkit 版本的浏览器的问题,因为此问题出现在大多数 Android 本机浏览器和 iOS5 上的 Safari 上