2012-02-10 35 views
26

Tôi hiện đang sử dụng $(window).bind('scroll', foo); để theo dõi $ (cửa sổ) .scrollTop() và thực hiện các công cụ để tạo hiệu ứng thị sai.Làm cách nào để giám sát vị trí cuộn trong khi cuộn trong Safari trên iOS?

Trong tất cả trình duyệt trên máy tính để bàn foo() được gọi cho mỗi pixel mà người dùng cuộn và tất cả mọi thứ đều đẹp và dandy. Trong Safari trên iOS, sự kiện cuộn chỉ được kích hoạt SAU khi cuộn xong.

Tôi đã thêm $(window).bind('touchmove', foo); để đảm bảo chức năng được gọi trong khi vuốt trong iOS và nó giúp tôi có thêm một chút nữa. Khi người dùng thả ngón tay ra, trang tiếp tục cuộn, nhưng sự kiện sẽ ngừng kích hoạt.

Bất kỳ ý tưởng nào?

Trả lời

4

Khi tôi nhìn thấy câu hỏi của bạn, tôi đã lên kế hoạch để thực hiện một polyfill cho điều này (nếu không tồn tại?). Thật không may tôi đã có rất ít thời gian.

Ý tưởng là có một setInterval, được bắt đầu ontouchstart và nó kiểm tra xem document.body.scrollTop đã thay đổi từ lần trước, ví dụ: cho mỗi 20 mili giây. Và nếu có, thì chúng tôi sẽ gửi sự kiện cuộn theo cách thủ công. Nếu không, chúng tôi clearInterval vì dường như không có cuộn nhiều hơn xảy ra.

Điều này sẽ ngắn gọn. Nếu bạn có nhiều thời gian hơn tôi thì hãy thử với những hướng dẫn này.

Chỉnh sửa: Bây giờ, đọc thêm, ý tưởng tương tự dường như được đề xuất trên câu trả lời khác. Bạn có chắc chắn rằng khoảng thời gian được dừng lại trong khi di chuyển trên iPad?

+0

@tkalve giống nhau trên droid ... –

+7

Tôi đã thử t anh ấy tại http://www.hakoniemi.net/labs/onscroll.html và kết thúc với cùng độ phân giải: không thể theo dõi cuộn đàn hồi của iOS. Không có trình xử lý sự kiện cho nó + cả khoảng thời gian chờ/khoảng thời gian không thực hiện trong khi cuộn. Và vì không có requestAnimationFrame trong iOS5, điều này dường như không thể giải quyết được. – zvona

+0

Chắc chắn bạn không mong đợi rAF chạy nếu khoảng thời gian không chạy được. Đó là, tuy nhiên, FWIW, có thể để có được một lần đọc được cập nhật trong các công cụ Safari Dev ổ cắm web chạy trong khi di chuyển đà đang được tiến hành. –

0

Đây có thể là một lỗi với jQuery riêng của mình: http://bugs.jquery.com/ticket/6446

Đó vé đã được mở trong một thời gian và gắn liền với iOS 4, nhưng có lẽ bạn nên điều tra việc tính toán vị trí cuộn với javascript tinh khiết.

0

Như tôi biết không có thực thi javascript trong khi cuộn trên hầu hết các thiết bị di động. Có một số cách giải quyết (f.e. iscroll) ngoài kia. Iscroll đang sử dụng kỹ thuật "chuyển đổi" css. Nhưng không có cách nào để thực thi javascript trong khi cuộn. Tôi cho rằng thuật toán cuộn mượt mà quá đắt.

1

Trong khi điều này là không thể ra khỏi hộp, có thể nói, bạn có thể làm điều đó bằng iscroll

Vì vậy, bạn muốn sử dụng iScroll dành cho iOS và Android điện thoại di động thiết bị/viên, và sử dụng theo cách bạn hiện đang thực hiện nó cho các thiết bị máy tính để bàn.

iScroll có một loạt các tùy chọn cho chức năng gọi lại được gọi trên các sự kiện nhất định - chẳng hạn như 'onScrollMove', 'onBeforeScrollEnd', 'onTouchEnd', v.v. Thật không may, không có tùy chọn thực hiện gọi lại trên "EVERY position thay đổi, bao gồm những thay đổi gây ra bởi động lượng di chuyển sau khi người dùng đã dừng chạm vào màn hình ". Nhưng, thật dễ dàng để thêm một.

Trong nguồn iScroll, xung quanh dòng 127, gần "// Sự kiện" bình luận, thêm một biến mới:

onPosChange: null 

Sau đó, xung quanh dòng 308, ở phần cuối của "_pos" chức năng, thêm dòng này:

if (this.options.onPosChange) this.options.onPosChange.call(); 

(sẽ chỉ gọi hàm được chuyển trong tùy chọn "onPosChange" nếu có).

Sau khi làm điều đó, các mã ví dụ sau đây sẽ thiết lập iScroll cho div với id = "iscroll_container", và sẽ in Y-offset để giao diện điều khiển mỗi lần nó thay đổi:

var myScroll; 
function loaded() { 
    myScroll = new iScroll('iscroll_container', { onPosChange: actOnScroll }); 
} 

document.addEventListener('touchmove', function (e) { e.preventDefault(); }, false); 

//Use this for high compatibility (iDevice + Android) 
document.addEventListener('DOMContentLoaded', function() { setTimeout(loaded, 200); }, false); 

function actOnScroll(){ 
    console.log('got a scroll move! Vert offset is: ' + myScroll.y); 
} 

Note, Ben the Bodyguard Parallax Site hoạt động trên iPad bằng cách sử dụng iScroll (chúng sử dụng phiên bản cũ hơn của iscroll và không thực hiện chính xác cách tôi mô tả ở đây)

Ngoài ra, Life of Pi Parallax Site hoạt động trên iPad thực sự độc đáo - Tôi không thể hiểu cách chúng làm điều đó, nhưng ít nhất nó chứng minh điều đó là có thể!

2

Trang web của Apple dành cho iPhone 5c sử dụng một số hiệu ứng cuộn thị sai dường như tiếp tục với ngón tay của bạn vẫn chạm vào màn hình và cuộn. Vì vậy, tôi đoán javascript không thể bị tắt hoàn toàn trong khi cuộn. Tumult Hype cũng cung cấp chức năng này.

4

Tôi khuyên bạn nên sử dụng thư viện javascript "Skrollr". Đó là lựa chọn hoạt hình di chuyển di động tốt nhất mà tôi đã tìm thấy cho đến nay và rất dễ dàng để bắt đầu và chạy một cách nhanh chóng. Tạo hình động và thao tác CSS dựa trên vị trí cuộn bắt đầu và kết thúc. Tạo nhiều vị trí và hình ảnh động cuộn dữ liệu như bạn cần cho hầu hết các thuộc tính CSS chuẩn.

Trong ví dụ sau màu nền sẽ chuyển động theo quá trình của một cuộn 500 điểm ảnh:

<div data-0="background-color:rgb(0,0,255);" data-500="background-color:rgb(255,0,0);">WOOOT</div> 

Thanh toán kho trên Git: https://github.com/Prinzhorn/skrollr

Skrollr Demo Ví dụ: http://prinzhorn.github.io/skrollr/

tạo ảnh vui nhộn ví dụ thực tế: http://www.fontwalk.de/03/

+0

Cảm ơn bạn đã tham khảo. Tôi đang đối phó với cùng một vấn đề và hy vọng skrollr sẽ giúp đỡ, nhưng đi qua các tài liệu tuyệt vời tôi đã tự tin với điều đó. – Max

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