27 votes

Position de défilement actuelle lors de l'utilisation de -webkit-overflow-scrolling:touch - événement javascript iOS Safari (scrollTop / scrollLeft)

J'utilise -webkit-overflow-scrolling:touch pour faire défiler un div avec overflow:scroll ; de manière fluide grâce aux événements tactiles d'iOS.

Il fonctionne parfaitement, sauf qu'il ne semble pas mettre à jour element.scrollTop ou element.scrollLeft pendant le défilement. Il ne met à jour element.scrollTop / déclenche un événement de défilement que lorsque l'élan s'épuise et qu'il s'arrête.

Quelqu'un connaît-il un moyen de connaître sa position de défilement actuelle et s'il y a un événement que je peux écouter ? Je me demande si cela ne peut pas être trouvé par le biais d'une propriété CSS3, peut-être ? Merci

L'exemple ci-dessous montre deux tentatives :

<!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 a corrigé ce comportement. Les événements de défilement sont désormais déclenchés pendant le défilement.

Notez que vous devrez maintenant gérer les valeurs de défilement négatives pendant le défilement de rebond.

10voto

pixshatterer Points 281

Dans la bibliothèque des développeurs iOS, vous trouverez une explication à ce sujet dans les directives relatives à Safari :

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

En gros, le flux d'événements pour le défilement se déroule comme suit : touch/start dragging(mousewheel event)-> pan/movement(no events) -> stop(onscroll)

Il n'y a donc rien qui ressemble à un événement continu de défilement déclenché pendant que le panoramique se produit, juste un onScroll à la fin du geste.

Si vous trouvez un moyen optionnel d'accomplir cela, faites-le moi savoir :)

2voto

mattsahr Points 413

Ceci pourrait vous aider. C'est une solution jQuery que j'utilise pour forcer la pagination sur les balayages latéraux d'IOS. Ce n'est pas exactement le même cas que celui dans lequel vous travaillez. J'utilise le "overflow-scrolling:auto" qui ne se comporte pas comme la version "touch".

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

J'utilise "overflow-scrolling:auto" car il réagit plus rapidement à l'événement touchend. Malheureusement, "overflow-scrolling:touch" semble en effet résister aux animations javascript et CSS lorsqu'il est en mouvement. Mais au moins, vous pouvez obtenir des informations sur l'emplacement pendant le défilement.

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
};

2voto

spacehelmetboy Points 21

Dans une situation similaire, j'utilise scrollability.js qui simule très bien le comportement de défilement natif. J'écoute ensuite l'événement "scrollability-start" et je surveille les attributs haut et gauche de l'élément défilé. Je sais que ce n'est pas idéal, mais c'est une bonne solution.

1voto

Corey Points 72

Voici mon référentiel où j'ai ajouté le callback onScrolling() pour me faire savoir quand l'animation de défilement dynamique se produit dans animate() : https://github.com/simpleshadow/iscroll/blob/master/src/iscroll.js

J'ai créé une application d'exemple en utilisant sa suggestion ici : http://jsfiddle.net/simpleshadow/wQQEM/22/

@robertlawson86 sur Github a fait cette suggestion pour aider à donner une idée du moment où il faut saisir la position pendant le défilement dynamique. Voir l'exemple et la discussion : https://github.com/cubiq/iscroll/issues/183

0voto

David Points 31

Je sais que c'est bizarre, mais vous pouvez garder la trace de scrollLeft/scrollTop simplement en enregistrant l'événement touchstart :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X