2012-02-02 26 views
5

Tôi hiện đang làm việc trên một ứng dụng web trang duy nhất được tối ưu hóa cho các thiết bị cảm ứng, chủ yếu là iOS. Tôi đã triển khai di chuyển bản địa iOS mới qua -webkit-overflow-scrolling: touch; và tất cả hoạt động tốt ngoại trừ việc chúng tôi vẫn đang gặp phải hiệu ứng cuộn đàn hồi của táo trên toàn bộ trang.Tắt cuộn cơ thể đàn hồi của iOS & giữ nguyên cuộn làm việc

Điều này bao gồm toàn bộ trang di chuyển ra khỏi đầu/cuối của chế độ xem khi một cuộn kết thúc hoặc nội dung được đẩy và thực sự cho phép thực tế rằng đây là ứng dụng web. Tôi đã theo dõi various guidelines về cách ngăn chặn điều này và trong khi chúng hoạt động, chúng ngăn các phần tử cuộn bên trong hoạt động hoàn toàn.

Here's a fiddle để minh họa những gì tôi đang sử dụng cho đến thời điểm này.

Có ai tìm thấy giải pháp vô hiệu hóa cuộn đàn hồi của cơ thể nhưng cho phép cuộn bên trong hoạt động không?

+0

Tôi nhận thấy rằng việc vô hiệu hóa touchmove cho $ (tài liệu) đã được nhận xét. Đây có phải là mục đích? – zvona

+0

Đó là. Nếu bạn hủy nhận xét, tất cả cuộn sẽ bị tắt. Xin lỗi tôi đã đề cập đến điều đó. – madcapnmckay

Trả lời

5

Tôi đã thích nghi các giải pháp tốt từ Conditionally block scrolling/touchmove event in mobile safari sử dụng Dojo:

var initialY = null; 
dojo.connect(document, 'ontouchstart', function(e) { 
    initialY = e.pageY; 
}); 
dojo.connect(document, 'ontouchend', function(e) { 
    initialY = null; 
}); 
dojo.connect(document, 'ontouchcancel', function(e) { 
    initialY = null; 
}); 
dojo.connect(document, 'ontouchmove', function(e) { 
    if(initialY !== null) { 
     if(!dojo.query(e.target).closest('#content')[0]) { 
      // The element to be scrolled is not the content node 
      e.preventDefault(); 
      return; 
     } 

     var direction = e.pageY - initialY; 
     var contentNode = dojo.byId('content'); 

     if(direction > 0 && contentNode.scrollTop <= 0) { 
      // The user is scrolling up, and the element is already scrolled to top 
      e.preventDefault(); 
     } else if(direction < 0 && contentNode.scrollTop >= contentNode.scrollHeight - contentNode.clientHeight) { 
      // The user is scrolling down, and the element is already scrolled to bottom 
      e.preventDefault(); 
     } 
    } 
}); 

Yếu tố để được cuộn là #content trong trường hợp này.

+1

Bạn có chắc chắn rằng nó hoạt động không? Tôi không thể sao chép này làm việc trên fiddle ... tự hỏi nếu điều này thực sự là một câu trả lời đúng – zanona

+0

Vẫn hoạt động khá tốt cho tôi. –

+0

Trong IOS 7 mã này sẽ chỉ ngăn chặn cuộn đàn hồi khi trang đã được cuộn qua các ranh giới của nó một lần. Ví dụ: 1. bạn cuộn xuống: nó ghi đè 2. bạn cuộn xuống lần nữa: không ghi đè 3. bạn cuộn lên: nó ghi đè 4. bạn cuộn xuống: nó ghi đè 5.bạn cuộn xuống: không ghi đè 6. bạn cuộn xuống: không ghi đè – Phedg1

1

lẽ iScroll là những gì bạn đang tìm kiếm (nếu tôi có câu hỏi của bạn ngay)

+0

Vấn đề với iscroll là nó không phải là bản địa và nó chỉ thực hiện di chuyển trên một container theo như tôi biết. Quá trình cuộn luồng webkit cho phép cuộn cảm ứng tự nhiên trên các vùng chứa và hoạt động tốt. Nhưng cuộn cơ thể đàn hồi của táo vẫn còn hiện diện bất kể bạn chọn giải pháp cuộn nào. – madcapnmckay

+0

Trên thực tế, iScroll không bị nó, tôi nghĩ rằng nó đặt một sửa chữa tại chỗ, nó về cơ bản vô hiệu hóa tất cả di chuyển và sau đó thêm xử lý của nó trên đầu trang để cho phép nó di chuyển. Tôi đang nhìn vào làm tương tự bản thân mình nhưng chỉ cho phép di chuyển bản địa tiếp tục. – madcapnmckay

0

Lúc nguy cơ sao chép bài của tôi, tôi cố gắng để giải quyết cùng một vấn đề và cho đến nay là chỉ này cho đến nay:

 $(document).bind("touchmove",function(e){ 
      e.preventDefault(); 
     }); 
     $('.scrollable').bind("touchmove",function(e){ 
      e.stopPropagation(); 
     }); 

này hoạt động nếu bạn có một yếu tố tràn mà không bao gồm toàn bộ màn hình , ví dụ như trong ứng dụng iPad. nhưng nó không hoạt động nếu bạn có ứng dụng dành cho thiết bị di động và toàn bộ chế độ xem được bao phủ bởi phần tử tràn của bạn.

Điều duy nhất tôi có thể nghĩ là để kiểm tra scrollTop() của $ ('cuộn') và sau đó có điều kiện ràng buộc preventDefault() nếu nó là 0.

Sau khi thử, tôi nhận thấy rằng báo cáo UA của webkit scrollTop luôn luôn bằng 0 khi phần tử được cuộn lên trên cùng ngay cả khi phần tử "trả lại bên trong" của cuộn thừa gốc. Vì vậy, tôi không thể làm bất cứ điều gì kể từ khi tôi yêu cầu một scrollTop phủ định để thiết lập tình trạng của tôi.

Sigh. Bực bội.

Các vấn đề liên quan