スクロールさせる組み込みJSでスマフォだと途中で止まってしまう場合

スクロールさせる組み込みJS(scrollTo)をスマートフォンから実行すると、たまにスクロールが途中で止まってしまう不具合が発見されました。(特にAndroidで発生します)

対象

  • a-blog cms Ver. 2.6.1.2 以下

対応方法

a-blog cmsのバージョンによって、対応方法が少し異なります。バージョンに適切な対応をお願いします。

Ver. 2.5.0以上

テンプレートでacms.jsを読み込んだあと、以下の記述を追加してください。

<script>
	ACMS.Ready(function(){
		ACMS.Library.scrollTo = function ( x, y, m, k, offset, callback )
		{
			y = y + offset;
                        callback = callback || function(){};
        
                        var left = Math.floor(document.body.scrollLeft || document.documentElement.scrollLeft);
                        var top  = Math.floor(document.body.scrollTop  || document.documentElement.scrollTop);
                        var remainX = x - left;
                        var remainY = y - top;
                        var calc = function ()
                        {
                            var h = parseInt(x - remainX);
                            var v = parseInt(y - remainY);
                            remainX = remainX*(1-k);
                            remainY = remainY*(1-k);
                            if(parseInt(remainX) != 0 || parseInt(remainY) != 0){
                                window.scrollTo(h, v);
                                setTimeout(calc,m);
                            }else{
                                window.scrollTo(x,y);
                                callback();
                            }
                        };
                        setTimeout(calc, m);
		};
	});
</script>

Ver. 2.5.0未満

テンプレートでindex.jsを読み込んだあと、以下の記述を追加してください。

<script>
	ACMS.Library.acmsLink({});
	ACMS.Library.scrollTo = function ( x, y, m, k, offset, callback )
	{
		y = y + offset;
                callback = callback || function(){};
    
                var left = Math.floor(document.body.scrollLeft || document.documentElement.scrollLeft);
                var top  = Math.floor(document.body.scrollTop  || document.documentElement.scrollTop);
                var remainX = x - left;
                var remainY = y - top;
                var calc = function ()
                {
                    var h = parseInt(x - remainX);
                    var v = parseInt(y - remainY);
                    remainX = remainX*(1-k);
                    remainY = remainY*(1-k);
                    if(parseInt(remainX) != 0 || parseInt(remainY) != 0){
                        window.scrollTo(h, v);
                        setTimeout(calc,m);
                    }else{
                        window.scrollTo(x,y);
                        callback();
                    }
                };
                setTimeout(calc, m);
	};
</script>

以上の対応を行うことにより、途中でスクロールが止まることはなくなります。

この度はご迷惑をお掛けしてしまい申し訳ございませんでした。
今後ともa-blog cmsをよろしくお願いいたします。