0

我使用iScoll.js来帮助在 iOS 上滚动动画。基本上它使用硬件加速的 CSS 属性来移动内容,而不是传统的滚动。

iScoll 运行良好,但我也在尝试实现平滑滚动锚解决方案。

它在桌面上运行良好,但问题是我无法锻炼如何检索正确的偏移值以传递给 iScoll 实例。我觉得我非常接近解决方案:

var ua = navigator.userAgent,
    isMobileWebkit = /WebKit/.test(ua) && /Mobile/.test(ua);

if (isMobileWebkit) {
      iScrollInstance = new iScroll('wrapper');
}


$('a[href*=#]:not([href=#])').click(function() {
        if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') 
            || location.hostname == this.hostname) {
            var target = $(this.hash);
            target = target.length ? target : $('[name=' + this.hash.slice(1) +']');
               if (target.length) {
                   if (isMobileWebkit) {
                       iScrollInstance.refresh();
/* issue here with "target.position.top" = "undefined" */
                       iScrollInstance.scrollTo(0, target.position.top, 1000);
                   }else{
                        $('html,body').animate({
                        scrollTop: target.offset().top
                        }, 1000);
                   }
                return false;
            }
        }
    });

完整的演示在这里http://jsfiddle.net/Wccev/3/

4

1 回答 1

0

不知道为什么,但似乎 iScroll.js 在 scrollTo 函数中不喜欢 jQuery。所以提前设置变量似乎有帮助。由于 iScroll 移动 div 而不是屏幕的方式,我还必须计算出正确的偏移量。

如果有人需要它,这个 jQuery 应该有助于在 IO 设备上平滑滚动锚点,前提是您正确设置了 iScroll:

var ua = navigator.userAgent,
    isMobileWebkit = /WebKit/.test(ua) && /Mobile/.test(ua);

if (isMobileWebkit) {
    $('html').addClass('mobile');
}   

$('a[href*=#]:not([href=#])').click(function() {
        if (location.pathname.replace(/^\//,'') == this.pathname.replace(/^\//,'') 
            || location.hostname == this.hostname) {
            var target = $(this.hash);
            target = target.length ? target : $('[name=' + this.hash.slice(1) +']');
               if (target.length) {
                   if (isMobileWebkit) {
                        scrollOffset = $('#scroller').position().top;
                        targetOffset = target.offset().top;
                        iScrollInstance.refresh();
                        iScrollInstance.scrollTo(0, -(targetOffset-scrollOffset), 1000);
                   }else{
                        $('html,body').animate({
                        scrollTop: target.offset().top
                        }, 1000);
                   }
                return false;
            }
        }
    });
于 2013-03-19T14:16:28.360 回答