Подтвердить что ты не робот

Текущее положение прокрутки при использовании -webkit-overflow-прокрутки: touch - событие javascript для Safari iOS (scrollTop/scrollLeft)

Я использую -webkit-overflow-scrolling: touch, чтобы сделать 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>

============ UPDATE ============

iOS 8 отсортировал это поведение. События прокрутки теперь запускаются при прокрутке.

Обратите внимание, что теперь вам придется иметь дело с отрицательными значениями прокрутки во время прокрутки отскока.

4b9b3361

Ответ 1

В iOS Developer Library в руководстве Safari есть объяснение:

http://developer.apple.com/library/IOs/#documentation/AppleApplications/Reference/SafariWebContent/HandlingEvents/HandlingEvents.html

В принципе, поток событий для прокрутки выглядит следующим образом: touch/start dragging (mousewheel event) → панорамирование/перемещение (без событий) → остановка (onscroll)

Итак, нет ничего похожего на непрерывное событие прокрутки, которое запускается, пока в кассе есть только onScroll в конце жеста.

Если вы найдете дополнительный способ для этого, дайте мне знать:)

Ответ 2

Это может помочь. Это решение jQuery, которое я использую, чтобы накладывать разбивку на страницы на IOS-бок о бок. Это не совсем тот случай, когда вы работаете. Я использую "overflow-scrolling: auto", который не ведет себя как "сенсорная" версия.

#yourDiv {
    -webkit-overflow-scrolling: auto;
    overflow:auto;
}

Я использую "overflow-scrolling: auto", потому что он быстрее реагирует на событие touchhend. Unfortunatley, "переполнение прокрутки: касание" действительно, похоже, противостоит 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
};

Ответ 3

В аналогичной ситуации я использую scrollability.js, который действительно делает хорошую работу, имитирующую поведение прокрутки. Затем я слушаю событие "запуск прокрутки" и отслеживает атрибуты верхнего/левого элемента прокрутки. Я знаю, что это не идеально, но это достойная альтернатива.

Ответ 4

Вот мой репозиторий, где я добавил обратный вызов onScrolling(), чтобы сообщить мне, когда анимация прокрутки импульса происходит в animate(): https://github.com/simpleshadow/iscroll/blob/master/src/iscroll.js

Я сделал пример приложения, используя его предложение здесь: http://jsfiddle.net/simpleshadow/wQQEM/22/

@robertlawson86 на Github сделал это предложение, чтобы помочь составить представление о том, когда нужно захватить позицию во время прокрутки импульса. См. Пример и обсуждение: https://github.com/cubiq/iscroll/issues/183

Ответ 5

Я знаю, это странно, но вы можете отслеживать scrollLeft/scrollTop, просто зарегистрировав событие touchstart:

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

Ответ 6

Получить положение горизонтального скроллера во время прокрутки (через css overflow-y: прокрутка)

$('#myNode').bind('scroll', function(e){
  var myPos = e.target.scrollLeft;
  // do something with myPos but don't naughty
})

Ответ 7

Если это помогает, scrollTop и scrollLeft обновляются в реальном времени в обработчике событий touchmove:

$(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 );
});