2012-05-13 28 views
5

Giả sử tôi có một số div và tôi sử dụng .animate({opacity:0},400, function(){}); cho con của nó. Sau đó, bạn có thể nhận được thời gian còn lại cho hoạt ảnh hoàn thành không? ví dụ: 200 ms còn lại hoặc 0 nếu không có hoạt ảnh? Cảm ơn.Có cách nào để có thời gian hoạt ảnh còn lại không?

+1

Chỉ cần ra khỏi tò mò ... tại sao bạn cần giá trị đó? –

+1

@ RokoC.Buljan. Đó là một sở thích mà tôi đoán. Anh ấy là bộ sưu tập hình ảnh động lần. – gdoron

+0

Tôi gặp vấn đề với việc xếp hàng một số cuộc gọi lại cho trẻ em - nó không phải lúc nào cũng kích hoạt và không dễ xác định xem con nào xếp hàng, vì vậy tôi muốn thử với setTimeout để làm cho nó đáng tin cậy hơn. – Anonymous

Trả lời

6

Để giúp bạn hiểu rõ hơn về cách bạn có thể sử dụng step chức năng [như được đăng bởi gdoron]
Tôi tạo ra một ví dụ bằng cách sử dụng bước chức năng để có được thời gian còn lại:

(nhấp vào nút get state! để dừng hoạt ảnh và truy xuất thời gian còn lại!)

demo with distance
demo with opacity

cách dụ jQuery:

var time = 4000; 
var distance = 300; 
var currentTime = 0; 

$('#ball').animate({ 
    left: distance 
}, { 
    duration: time, 
    step: function (now, fx) { 

     currentTime = Math.round((now * time)/distance); 
     var data = fx.prop + ' ' + Math.round(now) + '; <b>' + currentTime + 'ms</b> '; 

     $('body').append('<p>' + data + '</p>'); 
    }, 
    easing: 'linear' 
}); 

$('#getTime').click(function() { 
    $('#ball').stop(); 
    $('body').prepend('<p>currentTime is:' + currentTime + ' ms; REMAINING: ' + (time - currentTime) + 'ms</p>'); 
}); 
  • Bạn có thể xem như thế nào tôi đã sử dụng fx.prop bên trong animation step để có được (left) bất động sản hiện đang hoạt hình.
  • Bạn có thể xem cách: biết thời gian hoạt ảnh và khoảng cách (độ mờ, bất kỳ ...) chúng tôi có thể dễ dàng truy xuất trạng thái 'đã dừng/tạm dừng' bằng một số phép toán đơn giản ((now*time)/distance) và nhờ giá trị trả về now .
+0

Cảm ơn điều này là rất hữu ích! Và có vẻ như nó sẽ không ảnh hưởng nhiều đến hiệu năng nếu chúng ta giới hạn chức năng của bước chỉ bằng văn bản thay đổi. Dù sao nó sẽ không được gọi mỗi 1 ms hay gì đó. – Anonymous

+0

@ user1125062 Không nên, vì chúng tôi chỉ truy cập vào nội dung nào đó đang chạy hoạt ảnh của chúng tôi. –

3

Tôi không có ý tưởng tại sao bạn cần nó, nhưng step có thể giúp bạn trích xuất giá trị này:

Bước Chức năng

Phiên bản thứ hai của .animate() cung cấp một lựa chọn bước - một chức năng gọi lại được kích hoạt tại mỗi bước của hoạt ảnh. Chức năng này rất hữu ích cho việc bật các loại hoạt hình tùy chỉnh hoặc thay đổi hoạt ảnh khi nó đang diễn ra. Nó chấp nhận hai đối số (bây giờ và fx), và điều này được đặt thành phần tử DOM đang được làm động.

tại: giá trị số tài sản được hoạt hình ở mỗi bước
fx: một tham chiếu đến đối tượng nguyên mẫu jQuery.fx, trong đó có một số tài sản như elem cho các phần tử hoạt hình, bắt đầu và kết thúc cho giá trị đầu tiên và cuối cùng của thuộc tính động, tương ứng và chống cho thuộc tính đang được làm động.

docs

+0

hmmm, nhưng tôi phải làm gì với điều đó? :) – Anonymous

+0

@ user1125062. Bạn có thể lấy giá trị hiện tại, giá trị đầu tiên, giá trị cuối cùng v.v., chỉ cần chơi với nó. Dù sao tôi chắc chắn rằng có những cách khác để làm những gì bạn đang cố gắng để làm ... – gdoron

+0

Nếu không có một setInterval hoặc phương pháp này, không, AFAIK. Đây là những cách duy nhất để có được nó. – inhan

3

Nghe, đừng bận tâm đến chức năng step mà mọi người tiếp tục nói đến. Tôi đã từng cần những gì bạn làm và viết của riêng tôi mà chỉ cần đặt nó ngược thiết kế thời gian còn lại bằng cách xem tổng thời gian hoạt hình (nên đã được biết đến bạn kể từ khi bạn đã đưa số này cho jQuery) và thương của Opacity hiện tại và mục tiêu. Sau đó, chỉ nhân thương số đó với tổng thời gian hoạt ảnh, có tổng trừ đi tổng thời gian. Đơn giản như thế.

Pseudo-code:

func calculate-time-left-in-a-running-fade-in-animation: 
{ 
    var current_opacity = $elem.css('opacity'); 
    var target_opacity = this.getTargetOpacity(); 

    var total = this.getTotalAnimationTime(); 

    var quotient = current_opacity/target_opacity; 
    return total - quotient * total; 
} 
+0

Cách tiếp cận thú vị, mặc dù không phải của nó! Mặc dù nếu độ chính xác là quan trọng, bước là cách duy nhất để đi. – Anonymous

+0

Tự lấy giá trị thuộc tính hoặc sử dụng biến số hiện tại là điều tương tự, miễn là hoạt ảnh bị tạm dừng. Trong ví dụ về bước jQuery mà @roXon đưa ra, sẽ có rất nhiều chi phí đang diễn ra, ở mỗi bước của hoạt ảnh. Thậm chí có thể giới thiệu các biến toàn cục như ví dụ thực sự đã làm. Nếu bạn có ý định tạm dừng hoạt ảnh trước khi tính toán (giống như ví dụ đã làm) và lập trình tiếp tục hoạt ảnh sau đó, thì hoàn toàn không có sự khác biệt nào cả. Tôi thậm chí còn nói rằng nhận được giá trị tính toán này dưới một hình ảnh động chạy sẽ tạo ra kết quả tương tự. –

+0

Sản phẩm được lưu trữ của logic bước, giá trị được tính của thời gian còn lại, không giống như danh sách trực tiếp, giá trị không tự cập nhật lên giá trị chính xác tối đa. Và nó sẽ không là gì ngoài tính toán "cũ" bạn sử dụng bất cứ khi nào bạn sử dụng nó. Bạn thậm chí sẽ có một người đàn ông trung gian chịu trách nhiệm bắc cầu khoảng cách thông tin này, chức năng bước, những người nên trong lý thuyết ngăn chặn độ chính xác. Nhưng nếu bạn thay vào đó thực hiện cùng một tính toán _exactly khi bạn cần biết_ thời gian còn lại, thậm chí sẽ không chính xác hơn? Và rẻ hơn nữa, cả về khả năng đọc mã và chi phí xử lý. –

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