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
if the canvas is positioned with css top and left, then a duplicate GPU rendered canvas (generated for GPU hardware acceleration) will be rendered ignoring them properties so they're not aligned correctly.
if the canvas is positioned with css transform then the GPU duplicate canvas is correctly aligned, BUT when the canvas is positioned at minus X position then the only the part of the canvas that would be visible without the css is clickable
so changing between the two depending on visibility of the canvas is needed