On my current project, I have a fancy UI that has an element constantly changing rotation and position using webkit transform CSS built with javascript. On Android 2.1, it worked fine as a 1-liner:
element.style.webkitTransform = "translate3d(" + xPos + "px, " + yPos + "px, 0px) rotate(" + rotation + "deg)";But, on Android 2.2, the rotation stopped working. It seems that you can't have the translate3d and the rotate properties all set in the style.webkitTransform property. To fix the issue, I positioned using traditional absolute coordinates with the top and left CSS properties, and then used the webkitTransform property to do the rotation. There were a ton of special browser cases in my project to handle different things. Check out my platform detection class below to see how I handled a lot of special cases in one place.
PlatformHelper = function () { this.webkit_css_enabled = false; this.animations_enabled = false; this.is_android = false; this.is_android21 = false; this.is_android22 = false; this.is_idevice = false; this.is_touchscreen = false; this.is_msie = false; this.is_msie6 = false; this.is_msie8 = false; this.is_firefox = false; return this; }; PlatformHelper.prototype.init = function () { // check for webkit positioning capability if( navigator.userAgent.match(/iPhone/i) ) this.webkit_css_enabled = true; else if( navigator.userAgent.match(/iPod/i) ) this.webkit_css_enabled = true; else if( navigator.userAgent.match(/iPad/i) ) this.webkit_css_enabled = true; else if( navigator.userAgent.match(/Chrome/i) ) this.webkit_css_enabled = true; else if( navigator.userAgent.match(/Safari/i) ) this.webkit_css_enabled = true; // check for certain platforms if( navigator.userAgent.match(/Android/i) ) this.is_android = true; if( navigator.userAgent.match(/Android 2.1/i) ) this.is_android21 = true; if( navigator.userAgent.match(/Android 2.2/i) ) this.is_android22 = true; if( navigator.userAgent.match(/MSIE/i) ) this.is_msie = true; if( navigator.userAgent.match(/MSIE 6/i) ) this.is_msie6 = true; if( navigator.userAgent.match(/MSIE 8/i) ) this.is_msie8 = true; if( navigator.userAgent.match(/iPhone/i) || navigator.userAgent.match(/iPod/i) || navigator.userAgent.match(/iPad/i) ) this.is_idevice = true; if( navigator.userAgent.match(/Firefox/i) ) this.is_firefox = true; // special cases for touchscreens if( this.is_android == true || this.is_idevice == true ) this.is_touchscreen = true; // decide who sees animations if( this.is_msie == true ) this.animations_enabled = false; else this.animations_enabled = true; }; PlatformHelper.prototype.updatePosition = function ( element, xPos, yPos, rotation ) { if( !this.webkit_css_enabled || this.is_android22 ) { element.style.left = xPos + 'px'; element.style.top = yPos + 'px'; element.style.MozTransform = 'rotate(' + rotation + 'deg)'; element.style.webkitTransform = 'rotate(' + rotation + 'deg)'; } else { var new_transform = "translate3d(" + xPos + "px, " + yPos + "px, 0px) rotate(" + rotation + "deg)"; if( element.style.webkitTransform != new_transform ) // only apply style if not already in position element.style.webkitTransform = new_transform; } };
Ew, browser sniffing makes me feel signal.
ReplyDeleteWhy not using transform translate property?