Android 2.x: css overflow scroll sample: Haxe
Android 2.x 系では CSS で overflow: scroll; 指定を行っても hidden 扱いになってしまう、という不具合(仕様?)があります。この問題に対し Javascript を用いてスクロール制御を行います。
以下は Haxe を利用した簡単なサンプルです。スクロールさせたい要素を OverflowScrollHack クラスのコンストラクタ引数に指定します。現在 Haxe の JQuery用 Event クラスには originalEvent が定義されていないようなので、untyped を利用しています。
import js.html.TouchEvent; import jQuery.Event; import jQuery.JQuery; class OverflowScrollHack{ private var touchStartY:Int; public function new(element:JQuery, preventDefault:Bool = false){ var userAgent = UserAgent.create(); if(!userAgent.isAndroid() || userAgent.getAndroidVersion() >= 3) return; element.on("touchstart", function(event:Event){ var touchEvent:TouchEvent = untyped event.originalEvent; touchStartY = touchEvent.touches[0].pageY + element.scrollTop(); }); element.on("touchmove", function(event:Event){ if(preventDefault) event.preventDefault(); var touchEvent:TouchEvent = untyped event.originalEvent; element.scrollTop(touchStartY - touchEvent.touches[0].pageY); }); } }
モバイル 端末・バージョン判定用クラス
class UserAgent { public static inline var ANDROID = "Android"; private var userAgentString:String; public static function create(){ var userAgent = null; #if js userAgent = new UserAgent(js.Browser.navigator.userAgent); #end return userAgent; } public function new(userAgentString:String){ this.userAgentString = userAgentString; } public function isDocomo():Bool{ return ~/^DoCoMo/.match(userAgentString); } public function isSoftbank():Bool{ return ~/^J-PHONE|^Vodafone|^SoftBank/.match(userAgentString); } public function isAu():Bool{ return ~/^UP.Browser|^KDDI/.match(userAgentString); } public function isAndroid():Bool{ return ~/Android/.match(userAgentString); } public function isIPhone():Bool{ return ~/iPhone/.match(userAgentString); } public function isIPod():Bool{ return ~/iPod/.match(userAgentString); } public function isIPad():Bool{ return ~/iPad/.match(userAgentString); } public function isSmartPhone():Bool{ return isAndroid() || isIPhone() || isIPod(); } public function getAndroidVersion():Float{ return Std.parseFloat(userAgentString.substr( userAgentString.indexOf(ANDROID) + '$ANDROID '.length, "*.*".length)); } }