[removed] and scrolling on iOS 5

后端 未结 5 505
说谎
说谎 2020-11-28 02:37

iOS 5 has brought a number of nice things to JavaScript/Web Apps. One of them is improved scrolling. If you add

-webkit-overflow-scroll:touch;
相关标签:
5条回答
  • 2020-11-28 02:42

    For anyone trying to acheive this with PhoneGap, you can disable the elastic scrolling in the cordova.plist, set the value for UIWebViewBounce to NO. I hope that helps anyone spending ages on this (like i was).

    0 讨论(0)
  • 2020-11-28 02:42

    It was frustrating to discover a known problem with stopPropagation and native div scrolling. It does not seem to prevent the onTouchMove from bubbling up, so that when scrolling beyond the bounds of the div (upwards at the top or downwards at the bottom), the entire page will bounce.

    More discussion here and here.

    0 讨论(0)
  • 2020-11-28 02:55

    ScrollFix seems to be perfect solution. I tested it and it works like a charm!

    https://github.com/joelambert/ScrollFix

    /**
     * ScrollFix v0.1
     * http://www.joelambert.co.uk
     *
     * Copyright 2011, Joe Lambert.
     * Free to use under the MIT license.
     * http://www.opensource.org/licenses/mit-license.php
     */
    
    var ScrollFix = function(elem) {
        // Variables to track inputs
        var startY, startTopScroll;
    
        elem = elem || document.querySelector(elem);
    
        // If there is no element, then do nothing  
        if(!elem)
            return;
    
        // Handle the start of interactions
        elem.addEventListener('touchstart', function(event){
            startY = event.touches[0].pageY;
            startTopScroll = elem.scrollTop;
    
            if(startTopScroll <= 0)
                elem.scrollTop = 1;
    
            if(startTopScroll + elem.offsetHeight >= elem.scrollHeight)
                elem.scrollTop = elem.scrollHeight - elem.offsetHeight - 1;
        }, false);
    };
    
    0 讨论(0)
  • 2020-11-28 02:57

    The only issue with Brian Nickel's answer is that (as user1012566 mentioned) stopPropagation doesn't prevent bubbling when you hit your scrollable's boundaries. You can prevent this with the following:

    elem.addEventListener('touchstart', function(event){
        this.allowUp = (this.scrollTop > 0);
        this.allowDown = (this.scrollTop < this.scrollHeight - this.clientHeight);
        this.prevTop = null; 
        this.prevBot = null;
        this.lastY = event.pageY;
    });
    
    elem.addEventListener('touchmove', function(event){
        var up = (event.pageY > this.lastY), 
            down = !up;
    
        this.lastY = event.pageY;
    
        if ((up && this.allowUp) || (down && this.allowDown)) 
            event.stopPropagation();
        else 
            event.preventDefault();
    });
    
    0 讨论(0)
  • 2020-11-28 02:59

    Update Per Alvaro's comment, this solution may no longer work as of iOS 11.3.

    You should be able to allow scrolling by selecting whether or not preventDefault is called. E.g.,

    document.ontouchmove = function(e) {
        var target = e.currentTarget;
        while(target) {
            if(checkIfElementShouldScroll(target))
                return;
            target = target.parentNode;
        }
    
        e.preventDefault();
    };
    

    Alternatively, this may work by preventing the event from reaching the document level.

    elementYouWantToScroll.ontouchmove = function(e) {
        e.stopPropagation();
    };
    

    Edit For anyone reading later, the alternate answer does work and is way easier.

    0 讨论(0)
提交回复
热议问题