Webkit浏览器<535(Android native / ios5 Safari)HTML5 Canvas单击错误

罗里皮科

几周前,我在Android上遇到了一个错误,如果您使用CSS在本地Android浏览器(WebKit 534.4)上放置画布元素,将CSSposition: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'; });


I'm guessing that CSS position top and left use the CPU to move the canvas so the GPU generated one is in the wrong place, but CSS translate uses the GPU to move the canvas so the GPU generated one is correctly positioned but the CPU is reading mouse events without this offset........AHHHHH!


EDIT: after testing on more devices I can confirm that this appears to be an issue with browsers using a version of webkit under 535 as this issue appears on most Android Native browsers and Safari on iOS5

rorypicko

Ok, i've fixed this issue, but I think it's pretty case specific.

if(webKitVer < 535) {
     document.body.style.paddingTop = pos.top + "px";
    if(canSeeWholeOfCanvas) {
        canwrap.style.transform = 'translateX('+pos.left+'px)';
        canwrap.style.left = 'auto';
    } else {
        canwrap.style.left = pos.left + "px";
        canwrap.style.transform  = 'none';
    }
} 
else 
{
    //standard all browsers
    canwrap.style.transform = 'translate('+pos.left+'px, '+pos.top+'px)';
}

feels hacky, case specific and hard to explain. but it works


in old webkit browsers (generally Android native browsers and IOS5 safari there are two bugs

如果画布的位置在CSS的顶部和左侧,则将渲染一个重复的GPU渲染的画布(为GPU硬件加速而生成),并忽略它们的属性,因此它们的对齐方式不正确。

如果画布使用css变换定位,则GPU重复画布正确对齐;但是,当画布定位在负X位置时,只有在没有css的情况下,画布中唯一可见的部分是可单击的

因此需要根据画布的可见性在两者之间进行更改

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用HTML5 / Canvas / JavaScript拍摄浏览器内屏幕截图

iOS5中我的UITableView中的dequeueReusableCellWithIdentifier错误

HTML5 Canvas + JS无法在IOS / Safari上运行

html5地理位置无法在Safari浏览器中运行

Angular $ templateCache与HTML5浏览器缓存

HTML5视频播放器在除Safari之外的所有浏览器中均无声音

浏览器对拖移的响应-html5拖放

HTML5 <音频>流OSX Safari错误

HTML5全屏API无法在iPhone SE Safari浏览器和其他最新的iPhone中使用

js / html5音频:为什么无法在iOS Safari浏览器中触发canplaythrough?

React Native Expo-单击链接时从Android浏览器打开我的应用

HTML5 Geolocation不提示在Safari浏览器中定位

Safari通过HTML5 Canvas错误地在SVG上绘制阴影

手机浏览器中的html5 canvas支持

Chartboost在iOS5中始终崩溃

HTML5多人浏览器游戏

从HTML5 <button>删除默认的浏览器效果

如何在Safari / IE浏览器中检测HTML5或Javascript中用于播放mp3而非webm的浏览器类型?

HTML 5和Java,Android浏览器与计算机浏览器的代码差异

使用HTML5在Safari浏览器中录制音频?

为什么html5应用程序在浏览器中的工作方式不同于在Cordova(Android)中的工作方式?

播放前html5视频Safari浏览器已全部下载

在浏览器中测试HTML5游戏?

HTML5 / CSS浏览器出现故障

如何检查我的浏览器是否支持HTML5 Canvas混合模式?

跨浏览器在HTML5 Canvas上放置文本不一致

ios 上的 Html5 音频:在浏览器中播放

HTML5 Canvas 从浏览器缓存加载图像

WordPress 网站上的 HTML5 视频背景无法在 Safari 浏览器上运行