数週間前にAndroidでバグに遭遇しました.cssを使用してネイティブAndroidブラウザー(WebKit 534.4)にキャンバス要素を配置position:absolute; top:10px; left:100px;
すると、複製されたキャンバス(明らかにAndroidはGPUアクセラレーションに1つを使用します)を無視してブラウザーにレンダリングされます.ポジショニング。
したがって、位置top:100px; left:100px;
にキャンバスがある場合、キャンバスは完全に配置されますが、GPU アクセラレーション キャンバスはそれを無視し、左上隅に配置されます (前の質問の画像を参照してください)。
HTML5 キャンバスを複製する Android ネイティブ ブラウザ (Chrome では問題ありません)
代わりにCSS変換を使用する解決策を見つけました。このようにtransform: translate(100px, 100px);
、GPUアクセラレーションキャンバスが同じ場所にレンダリングされるため、問題が修正されます(重複しているようには見えません)...
しかし、ノックオン効果として、クリックバグが発生しました。
キャンバスを中央に配置すると、ウィンドウの幅がデバイスの幅よりも小さい場合、X 位置は負の値になります。これが発生したときにキャンバスの唯一のクリック可能な領域は、配置なしで表示されるものです。
これを説明するのは難しいですが、うまくいけば、この画像がより明確になります
このコードを使用しても、画面の半分からアラートが発生しないため、ブラウザ自体の問題だと思います
canvas.addEventListener('click', function(e) { alert('click'; });
私はCSSの位置が上と左でCPUを使用してキャンバスを移動するため、GPUで生成されたものは間違った場所にあると推測していますが、CSS変換はGPUを使用してキャンバスを移動するため、GPUで生成されたものは正しく配置されますが、CPUはこのオフセットなしでマウス イベントを読み取る.........ああああああ!
編集: より多くのデバイスでテストした後、この問題はほとんどの Android ネイティブ ブラウザーと iOS5 の Safari で発生するため、535 未満の webkit のバージョンを使用するブラウザーで問題であるように見えることを確認できます。