vô hiệu hóa nganimate cho một số phần tử


96

Tôi đang sử dụng các mô-đun ngAnimate, nhưng tất cả của tôi ng-if, ng-show, vv, bị ảnh hưởng bởi điều đó, tôi muốn tận dụng ngAnimate đối với một số yếu tố được lựa chọn. Đối với hiệu suất và một số lỗi trong các yếu tố hiển thị và ẩn rất nhanh.

cảm ơn.


1
Thêm một số mã ví dụ của vấn đề.
táo tợn vào

Một trong những vấn đề là lực lượng ngAnimate display:blocktrên tất cả các bộ lặp của bạn:ng-hide-add-active, .ng-hide-remove { display: block!important; }
Somatik

Câu hỏi tốt hơn nên đặt ra là "làm cách nào để xác định CSS của mình để làm cho ngAnimate hoạt động chính xác cho các phần tử bị ẩn mà không cần hoàn thành vòng lặp hoạt ảnh đầy đủ". Câu trả lời tốt nhất là từ Chris Barr dưới đây.
Eric

Câu trả lời:


53

Chỉ cần thêm cái này vào CSS của bạn. Tốt nhất nếu đó là quy tắc cuối cùng:

.no-animate {
   -webkit-transition: none !important;
   transition: none !important;
}

sau đó thêm no-animatevào lớp phần tử bạn muốn vô hiệu hóa. Thí dụ:

<div class="no-animate"></div>

2
Nếu bạn đang sử dụng sass, bạn không cần "-webkit-chuyển: none quan trọng;!"
Marwen Trabelsi

15
Xin lưu ý rằng câu trả lời này sai vì NÓ CHIA TẤT CẢ CÁC ĐỘNG VẬT, không chỉ những gì được xử lý bởi Angular.
stackular

1
Bạn đã thử chưa? cho tôi xem một mẫu mã của bạn. Nó làm việc cho tôi và hơn sáu người đã chấp thuận nó
David Addoteye

2
Tôi đã thêm một .no-animate, .no-animate-children *quy tắc để trẻ bìa, vv
Kimball Robinson

1
@DavidAddoteye giải pháp này không khả thi nếu bạn có ng-show hoặc ng-if trên một phần tử có quá trình chuyển đổi .. Ý tôi là .. nếu tôi có trình quay bộ nạp chỉ hiển thị trong khi yêu cầu http và không xuất hiện khi yêu cầu được giải quyết, hãy thêm lớp này sẽ dẫn đến không có hoạt ảnh nào cả !, câu trả lời của michael là ok, nhưng quá tẻ nhạt để triển khai và bạn nên cố gắng tránh các bộ chọn css trong bộ điều khiển. Tạo một chỉ thị là OK, nhưng nhìn vào câu trả lời của Blowsie, bạn sẽ thấy rằng nhóm AngularJS đã cung cấp một cách linh hoạt để giải quyết vấn đề này;)
edrian 17/02

106

Nếu bạn muốn bật hoạt ảnh cho các phần tử cụ thể (thay vì tắt chúng cho các phần tử cụ thể), bạn có thể sử dụng $ animateProvider để định cấu hình các phần tử có tên lớp cụ thể (hoặc regex) để tạo hoạt ảnh.

Đoạn mã dưới đây sẽ kích hoạt hoạt ảnh cho các phần tử có angular-animatelớp:

var myApp = angular.module("MyApp", ["ngAnimate"]);
myApp.config(function($animateProvider) {
  $animateProvider.classNameFilter(/angular-animate/);
})

Đây là ví dụ đánh dấu bao gồm angular-animatelớp để bật hoạt ảnh:

<div ng-init="items=[1,2,3,4,5,6,7,8,9]">
  <input placeholder="Filter with animations." ng-model="f" /> 
  <div class="my-repeat-animation angular-animate" ng-repeat="item in items | filter:f track by item" >
    {{item}}
  </div>
</div>

Ví dụ về Plunker được mượn và sửa đổi từ blog này , nơi chỉ bộ lọc đầu tiên có hình ảnh động (do có angular-animatelớp).

Xin lưu ý rằng tôi đang sử dụng angular-animatelàm ví dụ và nó hoàn toàn có thể định cấu hình bằng cách sử dụng .classNameFilterchức năng.


5
Bạn đã cứu ngày của tôi. Cảm ơn bạn rất nhiều
gustavohenke

Đây là giải pháp thanh lịch nhất vì nó yêu cầu chọn tham gia hoạt ảnh và các yếu tố hoạt ảnh được phân biệt rõ ràng với các yếu tố khác theo tên lớp.
Nikola M.

2
Đây phải là giải pháp được chấp nhận. Hoạt động hoàn hảo và tiết kiệm ngày của tôi!

9
sử dụng /^(?:(?!ng-animate-disabled).)*$/regex để vô hiệu hóa annimation với ng-animate-disabledlớp.
IcanDivideBy0

Giải pháp tuyệt vời! Tôi có một bảng được phân trang với 20 hàng mỗi trang. Một phần ba thời gian để chuyển trang đã được sử dụng bởi trình duyệt xử lý các lớp css hoạt ảnh thậm chí không được sử dụng.
Kevin

81

Có hai cách để bạn có thể tắt hoạt ảnh trong AngularJS nếu bạn có mô-đun ngAnimate làm phụ thuộc vào mô-đun của bạn:

  1. Tắt hoặc bật hoạt ảnh trên toàn cầu trên dịch vụ $ animate:

    $animate.enabled(false);
  2. Tắt các hoạt ảnh cho một phần tử cụ thể - đây phải là phần tử cho góc đó sẽ thêm các lớp css animationstate (ví dụ: ng-enter, ...)!

    $animate.enabled(false, theElement);

Kể từ phiên bản Angular 1.4, bạn nên đảo ngược các đối số:

$animate.enabled(theElement, false);

Tài liệu cho$animate .


2
Điều này không hoạt động trên các phần tử cụ thể như mong đợi. Nếu tôi tắt các hoạt ảnh trên toàn cục và sau đó bật nó trên một phần tử cụ thể, nó không hoạt động.
Kushagra Gour

1
Câu trả lời này nên được xóa hoặc chỉnh sửa để chỉ định phiên bản Angular mà nó thực sự hoạt động. Đối với 1.2.10, nó chắc chắn không hoạt động để kích hoạt chọn lọc hoạt ảnh cho một số phần tử nhất định, đó là toàn bộ điểm của câu hỏi AFAICT.
Trindaz

Có ai biết nếu Tùy chọn 2 đang hoạt động trên phiên bản 1.2.25?
khorvat 19/09

1
Chỉ cần nhìn vào tài liệu ( docs.angularjs.org/api/ng/service/$animate ) thì có vẻ như «phần tử» là tham số đầu tiên được chuyển cho hàm được kích hoạt.
DanielM

49

Để tắt ng-animate cho các phần tử nhất định, bằng cách sử dụng lớp CSS, theo mô hình Angular animate, bạn có thể định cấu hình ng-animate để kiểm tra lớp bằng regex.

Cấu hình

    var myApp = angular.module("MyApp", ["ngAnimate"]);
    myApp.config(function($animateProvider) {
        $animateProvider.classNameFilter(/^(?:(?!ng-animate-disabled).)*$/);
    })

Sử dụng

Đơn giản chỉ cần thêm ng-animate-disabledlớp vào bất kỳ phần tử nào bạn muốn được ng-animate bỏ qua.


Tín dụng http://davidchin.me/blog/disable-nganimate-for-selected-elements/


7
Tôi nghĩ đây là cách chính xác nhất để lọc hành vi của ngannimate!
edrian

6
Nó là giá trị cuộn cho câu trả lời này.
Jossef Harush

Tôi có thể xác nhận rằng với phiên bản AngularJS mới nhất, đây chắc chắn là giải pháp tốt nhất cho vấn đề.
Adam Reis

44

cảm ơn, tôi đã viết một chỉ thị mà bạn có thể đặt trên phần tử

CoffeeScript:

myApp.directive "disableAnimate", ($animate) ->
  (scope, element) ->
    $animate.enabled(false, element)

JavaScript:

myApp.directive("disableAnimate", function ($animate) {
    return function (scope, element) {
        $animate.enabled(false, element);
    };
});

Đây là một cách tiếp cận khá tiện lợi, không phải lúc nào cũng rõ ràng về cách truy cập đối tượng phần tử và với một số cách tiếp cận khác, tôi e rằng mình sẽ làm lộn xộn các bộ điều khiển của mình với Javascript tham chiếu cố định một hoặc một số phần tử được xác định trong một mẫu . Điều này giống như một sự tách biệt tuyệt vời của những mối quan tâm, kudo!
Mattygabe

2
Thứ tự tham số được đảo ngược trong $ animate.enabled, nếu ai đó đang thắc mắc tại sao điều này lại vô hiệu hóa tất cả hoạt ảnh. Hoạt động như một sự quyến rũ nếu bạn sử dụng$animate.enabled(element,false);
gss

Xin lỗi, tôi thấy điều đó chỉ áp dụng cho 1.4.x +, mã ở trên đúng với các phiên bản trước.
gss

19

Tôi đã thấy rằng nó $animate.enabled(false, $element);sẽ hoạt động cho các phần tử sử dụng ng-showhoặc ng-hidenhưng nó sẽ không hoạt động cho các phần tử sử dụng ng-ifvì một số lý do! Giải pháp cuối cùng tôi đã sử dụng là chỉ làm tất cả trong CSS, điều mà tôi đã học được từ chuỗi này trên GitHub .

CSS

/* Use this for transitions */
.disable-animations.ng-enter,
.disable-animations.ng-leave,
.disable-animations.ng-animate {
  -webkit-transition: none !important;
  transition: none !important;
}

/* Use this for keyframe animations */
.disable-animations.ng-animate {
  -webkit-animation: none 0s;
  animation: none 0s;
}

SCSS

.disable-animations {
  // Use this for transitions
  &.ng-enter,
  &.ng-leave,
  &.ng-animate {
    -webkit-transition: none !important;
    transition: none !important;
  }
  // Use this for keyframe animations
  &.ng-animate {
    -webkit-animation: none 0s;
    animation: none 0s;
  }
}

Trường hợp của tôi là với ngAnimate được tải, một lớp như .loading.ng-hide sẽ ở trên màn hình cho đến khi hoàn tất một vòng lặp hoạt ảnh đầy đủ. Đây là câu trả lời rõ ràng nhất, vì về cơ bản, nó chỉ cung cấp cấu hình phù hợp cho ngAnimate và sử dụng nó bình thường. Điều này thích hợp hơn để định cấu hình sai, sau đó vô hiệu hóa nó. Vì vậy, +1 cho bạn, ước gì tôi có thể cung cấp nhiều hơn để thậm chí điểm số ở đây.
Eric

Đây là câu trả lời khó nhất. Làm với css sẽ tốt hơn là làm với js.
manas

Vui lòng xem câu trả lời của @Blowsie, đó là cách chung chung và đúng đắn hơn để giải quyết vấn đề này
edrian 17/02/16

3

Tôi KHÔNG muốn sử dụng ngAnimate trên của tôi ng-if, vì vậy đây sẽ là giải pháp của tôi:

[ng-if] {
  .ng-enter, .ng-leave, .ng-animate {
    -webkit-transition: none !important;
    transition: none !important;
  }
}

Chỉ đăng điều này như một gợi ý khác!


2

Tôi có một danh sách mà từ đó cái đầu tiên libị ẩn bằng cách sử dụng ng-hide="$first". Sử dụng ng-enterkết quả lihiển thị trong nửa giây trước khi biến mất.

Dựa trên giải pháp của Chris Barr, mã của tôi bây giờ trông giống như sau:

HTML

<ol>
    <li ng-repeat="item in items"
        ng-hide="$first"
        ng-class="{'no-animate' : $first}">
    </li>
</ol>

CSS

.no-animate.ng-enter,
.no-animate.ng-leave,
.no-animate.ng-animate {
        transition: none !important; /* disable transitions */
        animation: none 0s !important; /* disable keyframe animations */
}

li.ng-enter {
    opacity: 0;
    transition: opacity 0.3s ease-out;
}
li.ng-enter-active {
    opacity: 1;
}

/* I use Autoprefixer. If you don't, please include vendor prefixes. */

0

Tôi biết rằng đó là một câu trả lời bị trì hoãn, nhưng ở đây chúng tôi sử dụng trong MainController:

// disable all animations
$animate.enabled(false);

Nhưng vấn đề là khi chúng tôi tắt tất cả các hoạt ảnh, ui-select được định cấu hình thành opacity: 0.

Vì vậy, điều cần thiết là đặt opacity thành 1 bằng CSS:

.ui-select-choices {
    opacity: 1 !important;
}

Thao tác này sẽ đặt độ mờ một cách chính xác và ui-select sẽ hoạt động.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.