Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/473.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/98.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用-webkit overflow scrolling:touch-Safari iOS javascript事件时的当前滚动位置(scrollTop/scrollLeft)_Javascript_Ios - Fatal编程技术网

使用-webkit overflow scrolling:touch-Safari iOS javascript事件时的当前滚动位置(scrollTop/scrollLeft)

使用-webkit overflow scrolling:touch-Safari iOS javascript事件时的当前滚动位置(scrollTop/scrollLeft),javascript,ios,Javascript,Ios,我正在使用-webkit overflow scrolling:touch使用overflow:scroll制作div;在iOS触摸事件中平滑滚动 它工作得非常出色,只是在滚动时似乎没有更新element.scrollTop或element.scrollLeft。它仅更新element.scrollTop/在动量耗尽且停止时触发滚动事件 有没有人知道如何找到它当前的滚动位置,以及是否有我可以收听的事件?我想知道是否可以通过CSS3属性找到它?谢谢 下面的示例显示了两种尝试: <!DOCTY

我正在使用-webkit overflow scrolling:touch使用overflow:scroll制作div;在iOS触摸事件中平滑滚动

它工作得非常出色,只是在滚动时似乎没有更新element.scrollTop或element.scrollLeft。它仅更新element.scrollTop/在动量耗尽且停止时触发滚动事件

有没有人知道如何找到它当前的滚动位置,以及是否有我可以收听的事件?我想知道是否可以通过CSS3属性找到它?谢谢

下面的示例显示了两种尝试:

<!DOCTYPE html>
<body>
    <div id="display_a">Scroll is: 0</div>
    <div id="display_b">Scroll is: 0</div>  
    <div id="element" style="width:800px;overflow-x:scroll;-webkit-overflow-scrolling:touch;">
        <div style="font-size:100px;width:1850px;">
            a b c d e f g h i j k l m n o p q r s t u v w x y z
        </div>
    </div>
    <script>
        var e = document.getElementById("element");
        var display_a = document.getElementById("display_a");
        var display_b = document.getElementById("display_b");
        e.addEventListener("scroll",function(event){display_a.innerHTML = "Scroll is: " + event.target.scrollLeft;});
        setInterval(function(){display_b.innerHTML = "Scroll is: " +  e.scrollLeft;},100);
    </script>   
</body>
</html>

卷轴是:0
卷轴是:0
a b c d e f g h i j k l m n o p q r s t u v w x y z
var e=document.getElementById(“元素”);
var display_a=document.getElementById(“display_a”);
var display_b=document.getElementById(“display_b”);
e、 addEventListener(“scroll”,函数(事件){display_a.innerHTML=“scroll is:”+event.target.scrollLeft;});
setInterval(function(){display_b.innerHTML=“Scroll is:”+e.scrollLeft;},100);
========================================

iOS 8对这种行为进行了分类。滚动事件现在在滚动时触发


请注意,您现在必须在弹跳滚动期间处理负滚动值。

在iOS开发者库中,Safari指南中对此进行了解释:

基本上,滚动的事件流如下所示: 触摸/开始拖动(鼠标滚轮事件)->平移/移动(无事件)->停止(onscroll)

因此,当平移发生时,没有什么像连续的滚动事件一样被触发,只是在手势的末尾有一个onScroll


如果你能找到一个可选的方法来实现这一点,请告诉我:)

这可能会有所帮助。这是一个jQuery解决方案,我使用它在IOS端到端滑动中强制分页。这和你工作的情况不完全一样。我使用的是“溢出滚动:自动”,其行为与“触摸”版本不同

我使用“溢出滚动:自动”,因为它对touchend事件的反应更快。不幸的是,“overflow scrolling:touch”似乎确实在运动中抵制javascript和CSS动画。但至少你可以在滚动过程中从中获得一些位置信息

var pageSwiping = false;

$('#yourDiv').on('scroll', function(e) {
    if (pageSwiping !== true  ) {
        pageSwiping = true;
        var offset = $('#'+e.target.id).scrollLeft();
        $('#yourDiv').one( 'touchend',{elem:e.target.id,dragStart:offset},divMove);
    };
});

var divMove = function(e) {
    pageSwiping = false;
    var elem = e.data.elem;
    var dragEnd = $('#'+elem).scrollLeft();
    var dragDelta = (dragEnd - e.data.dragStart)
        // Make page-alignment decisions based on dragDelta
};

如果有帮助,则在touchmove事件处理程序中实时更新scrollTop和scrollLeft:

$(function()
{
    var $div = $("#scroll")
    var $p   = $("#display");

    var update = function(e)
    {
        $p.text( e.type +": "+ $div.scrollLeft() +", "+ $div.scrollTop() );
    }

    $div.bind( "touchmove", update )
        .bind( "scroll",    update );
});

在我正在使用的类似情况下,它在模拟本机滚动行为方面做得非常好。然后我监听“scrollability start”事件并监视滚动元素的上/左属性。我知道这并不理想,但这是一个不错的选择。

我知道这很奇怪,但您只需注册touchstart事件即可跟踪scrollLeft/scrollTop:

e.addEventListener("touchstart",function(event){});

在滚动时获取水平滚动条的位置(通过css overflow-y:scroll)


这是我的存储库,我在其中添加了回调
onScrolling()
,让我知道在
animate()
中何时出现动量滚动动画:

我用他的建议制作了一个示例应用程序:


@Github上的robertlawson86提出了这个建议,以帮助提供在动量滚动期间何时抓住位置的想法。参见示例和讨论:

嗨,马特,刚刚拿起这个答案。这是一个可能的解决方案,但我喜欢本机iOS滚动的感觉,所以我真的希望保持这种感觉(不尝试复制拖动动量代码,iOS做得很好)。谢谢你!恐怕我还没有接近这个问题,但如果我找到了解决方案,我一定会让大家知道。谢谢大家。需要注意的是,如果你想让元素在屏幕上保持静态,那么位置:iOS 5引入了固定CSS。这假设jQuery依赖jQuery用于一个简短的工作演示;scrollTop、scrollLeft和touchmove在没有它的情况下都是标准的。我不得不说,它在模拟iOS风格的滚动时确实做得很好!我一定会仔细考虑一下。谢谢你的建议,让我们看一看,它也有同样的作用,但我发现更有用的方法是scrollTo()和scrollToElement()。谢谢David,但在你用手指触摸屏之后,这肯定没有帮助,只是动力让它滚动。还是我遗漏了什么?我只是想向所有迄今为止做出贡献的人表示衷心的感谢,我担心我们不会找到完美的解决方案,但下面有一些好的建议。iOS>8上的第三方浏览器上仍然存在此问题。xScroll事件不会在主屏幕Web应用程序或UIWebViews中触发此假设存在jQuery依赖性
e.addEventListener("touchstart",function(event){});
$('#myNode').bind('scroll', function(e){
  var myPos = e.target.scrollLeft;
  // do something with myPos but don't naughty
})