2011-08-09 28 views
33

Sử dụng keyframes, có thể tạo hiệu ứng một phần tử ngay sau khi được chèn vào DOM. Dưới đây là một số mẫu CSS:CSS3 - Chuyển đổi trên loại bỏ DOM

@-moz-keyframes fadeIn { 
    from {opacity:0;} 
    to {opacity:1;} 
} 

@-webkit-keyframes fadeIn { 
    from {opacity:0;} 
    to {opacity:1;} 
} 

@keyframes fadeIn { 
    from {opacity:0;} 
    to {opacity:1;} 
} 

#box { 
    -webkit-animation: fadeIn 500ms; 
    -moz-animation: fadeIn 500ms; 
    animation: fadeIn 500ms; 
} 

Có một số chức năng tương tự có sẵn để áp dụng hoạt ảnh (qua CSS, không JavaScript) cho phần tử ngay trước khi bị xóa khỏi DOM không? Dưới đây là một jsFiddle tôi đã thực hiện để chơi xung quanh với ý tưởng này; cảm thấy tự do để ngã ba nó nếu bạn biết một giải pháp.

jsFiddle - http://jsfiddle.net/skoshy/dLdFZ/

Trả lời

12

Tạo một hình ảnh động CSS gọi fadeOut, nói. Sau đó, khi bạn muốn loại bỏ yếu tố, thay đổi animation tài sản trên các yếu tố để mà hoạt hình mới, và sử dụng các sự kiện animationend để kích hoạt việc loại bỏ thực tế của nguyên tố này khi hoạt hình được thực hiện:

$('.hide').click(function() { 
    if (!$(this).hasClass('disabled')) { 
     $('#fill').css('-webkit-animation', 'fadeOut 500ms'); 
     $('#fill').bind('webkitAnimationEnd',function(){ 
      $('#fill').remove(); 
      $('.show, .hide').toggleClass('disabled'); 
     }); 
    } 
}); 

See also my updated version of your jsFiddle. đó làm việc đối với tôi trong Safari, ít nhất.

Vâng, bạn nên sử dụng lớp học thay vì .css().

Tôi không nghĩ jQuery có bất kỳ hỗ trợ "thực" nào cho hoạt ảnh CSS, vì vậy tôi không nghĩ rằng bạn có thể loại bỏ điều đó webkitAnimationEnd. Trong Firefox, nó chỉ được gọi là animationend.

Tôi chắc chắn không có cách nào để thực hiện việc này chỉ trong CSS.

+0

này là khá thông minh, nhưng nếu tôi đi một con đường Javascript tôi chỉ có thể gọi '$ ('# điền '). fadeOut() '. Những gì tôi thực sự tìm kiếm là một giải pháp CSS duy nhất - tôi không biết mờ dần trong một phần tử là có thể cho đến khi tôi xem nhiều diễn đàn, vì vậy tôi hy vọng ai đó biết cách làm mờ một phần tử. – Steve

+6

Nhưng '.fadeOut()' sử dụng JavaScript để thực hiện hoạt ảnh.Điều này thực sự sử dụng CSS cho hoạt ảnh. Nó chỉ sử dụng JavaScript để kích hoạt nó vào đúng thời điểm. Và vì bạn đang sử dụng JavaScript để thực sự chèn/xóa phần tử, "chỉ CSS" là loại tùy ý. Không có cách nào để kích hoạt một cái gì đó trong CSS để xảy ra ngay trước khi nó được gỡ bỏ. Nếu bạn đã biến các div "click me" đó thành các liên kết, bạn có thể sử dụng '.hide: active + # fill' như một bộ chọn để kích hoạt fading out, nhưng sau đó bạn vẫn cần một sự kiện' animationend' để thực sự loại bỏ các yếu tố khi nó bị mờ đi. – mercator

+0

@ S.K: Tóm lại, không. CSS không liên quan đến thao tác DOM như thêm và xóa các phần tử. Bí quyết FadeIn hoạt động vì hoạt ảnh xảy ra bất cứ khi nào yếu tố đầu tiên xuất hiện đơn giản vì đó là khoảnh khắc đầu tiên CÓ THỂ xảy ra. Để cho một phần tử biết đến FadeOut, nó sẽ cần phải biết rằng nó sắp bị loại bỏ, và điều đó chỉ có thể với Javascript. Và như người chia bài nói, vì bạn đã sử dụng Javascript để loại bỏ phần tử, yêu cầu "chỉ CSS" là tùy ý. – joequincy

6

Tôi đã làm việc trên thư viện thành phần cho javascript và tôi tự mình gặp sự cố này. Tôi có lợi ích của việc có thể ném một tấn javascript vào vấn đề này, nhưng vì bạn đã sử dụng một chút, hãy cân nhắc những điều sau đây cho một giải pháp giảm độ duyên dáng:

Khi loại bỏ bất kỳ nút thành phần/dom nào, hãy thêm một lớp được gọi là 'xóa'.

Sau đó, trong css bạn có thể xác định hình ảnh động bằng cách sử dụng lớp rằng:

.someElement.removing { 
    -webkit-animation: fadeOut 500ms; 
    -moz-animation: fadeOut 500ms; 
    animation: fadeOut 500ms; 
} 

Và trở lại trong javascript, chỉ sau khi bạn thêm 'loại bỏ' lớp, bạn sẽ có thể kiểm tra các 'hoạt hình 'css tài sản, và nếu nó tồn tại, sau đó bạn biết rằng bạn có thể móc vào' animationEnd 'và nếu nó không, sau đó chỉ cần loại bỏ các yếu tố ngay lập tức. Tôi nhớ thử nghiệm này một lúc trở lại, nó sẽ làm việc; Tôi sẽ xem liệu tôi có thể đào mã ví dụ không.

Cập nhật: Tôi đã đào kỹ thuật này và bắt đầu viết một plugin thực sự thú vị cho jQuery cho phép bạn sử dụng hoạt ảnh CSS3 cho các phần tử DOM đang bị xóa. Không yêu cầu Javascript bổ sung: http://www.github.com/arthur5005/jquery.motionnotion

Rất thử nghiệm, sử dụng rủi ro của riêng bạn, nhưng sẽ yêu một số trợ giúp và phản hồi. :)

+0

Rất thú vị. Khi bạn thêm hỗ trợ cho các hàm khác như 'append()' và 'prepend()', tôi sẽ bắt đầu sử dụng nó. So sánh với https://github.com/ai/transition-events như thế nào? –

+1

Xin chào Steve, đây là chủ yếu cho những người khác, tôi đã cập nhật plugin để hỗ trợ chắp thêm() và prepend(). :) –

-4

lý tưởng cho một cái gì đó giống như fadeIn và fadeOut bạn nên sử dụng hiệu ứng chuyển tiếp css hình ảnh động không css ..

+4

hoạt ảnh hoạt động trên chèn DOM, quá trình chuyển đổi không –

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