nonaktifkan nganimate untuk beberapa elemen

96

Saya menggunakan modul ngAnimate, tapi semua saya ng-if, ng-show, dll, dipengaruhi oleh itu, saya ingin memanfaatkan ngAnimate untuk beberapa elemen yang dipilih. Untuk performa dan beberapa bug pada elemen yang menampilkan dan menyembunyikan sangat cepat.

Terima kasih.

drtobal
sumber
1
Tambahkan beberapa contoh kode masalah.
cheekybastard
Salah satu masalahnya adalah bahwa ngAnimate memaksa display:blockpada semua repeater Anda:ng-hide-add-active, .ng-hide-remove { display: block!important; }
Somatik
Pertanyaan yang lebih baik untuk ditanyakan adalah "bagaimana saya bisa mendefinisikan CSS saya agar ngAnimate berfungsi dengan benar untuk elemen yang tersembunyi tanpa menyelesaikan loop animasi penuh". Jawaban terbaik adalah dari Chris Barr di bawah ini.
Eric

Jawaban:

53

Cukup tambahkan ini ke CSS Anda. Lebih baik jika itu adalah aturan terakhir:

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

lalu tambahkan no-animateke kelas elemen yang ingin Anda nonaktifkan. Contoh:

<div class="no-animate"></div>
David Addoteye
sumber
2
Jika Anda menggunakan sass, Anda tidak memerlukan "-webkit-transition: none!
Important
15
Harap dicatat bahwa jawaban ini salah karena ITU MENONAKTIFKAN SEMUA ANIMASI, bukan hanya yang ditangani oleh Angular.
stackular
1
Apakah kamu sudah mencobanya biarkan saya melihat contoh kode Anda. Ini bekerja untuk saya dan lebih dari enam orang yang telah menyetujuinya
David Addoteye
2
Saya menambahkan .no-animate, .no-animate-children *aturan untuk mencakup anak-anak, dll
Kimball Robinson
1
@DavidAddoteye solusi ini tidak dapat dijalankan jika Anda memiliki ng-show atau ng-if over sebuah elemen dengan transisi .. Maksud saya .. jika saya memiliki pemintal loader yang muncul hanya selama permintaan http dan menghilang ketika permintaan diselesaikan, menambahkan kelas ini tidak akan menghasilkan animasi sama sekali !, jawaban michael oke, tetapi terlalu membosankan untuk diterapkan, dan Anda harus mencoba menghindari pemilih css di pengontrol. Membuat direktif tidak apa-apa, tetapi melihat jawaban Blowsie Anda akan menemukan bahwa tim AngularJS telah memberikan cara yang fleksibel untuk menangani masalah ini;)
edrian
106

Jika Anda ingin mengaktifkan animasi untuk elemen tertentu (bukan menonaktifkannya untuk elemen tertentu), Anda dapat menggunakan $ animateProvider untuk mengonfigurasi elemen dengan nama kelas tertentu (atau regex) untuk dianimasikan.

Kode di bawah ini akan mengaktifkan animasi untuk elemen yang memiliki angular-animatekelas:

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

Berikut adalah contoh markup yang menyertakan angular-animatekelas untuk mengaktifkan animasi:

<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>

Contoh Plunker dipinjam dan dimodifikasi dari blog ini dimana hanya filter pertama yang memiliki animasi (karena angular-animateberkelas).

Harap dicatat bahwa saya menggunakan angular-animatesebagai contoh dan itu sepenuhnya dapat dikonfigurasi menggunakan .classNameFilterfungsi tersebut.

Gloopy
sumber
5
Anda menyelamatkan hari saya. Terima kasih banyak
gustavohenke
Ini adalah solusi paling elegan karena memerlukan keikutsertaan untuk animasi, dan elemen animasi dengan jelas dibedakan dari yang lain berdasarkan nama kelas.
Nikola M.
2
Ini harus menjadi solusi yang diterima. Bekerja dengan sempurna dan menyelamatkan hari saya!
9
gunakan /^(?:(?!ng-animate-disabled).)*$/regex untuk menonaktifkan annimation dengan ng-animate-disabledkelas.
IcanDivideBy0
Solusi bagus! Saya memiliki tabel paginasi dengan 20 baris per halaman. Sepertiga dari waktu untuk berpindah halaman dikonsumsi oleh browser yang memproses kelas css animasi yang bahkan tidak digunakan.
Kevin
81

Ada dua cara untuk menampilkan animasi di AngularJS jika Anda memiliki modul ngAnimate sebagai dependensi pada modul Anda:

  1. Nonaktifkan atau aktifkan animasi secara global pada layanan $ animate:

    $animate.enabled(false);
  2. Nonaktifkan animasi untuk elemen tertentu - ini harus menjadi elemen untuk sudut itu akan menambahkan kelas css keadaan animasi (misalnya ng-enter, ...)!

    $animate.enabled(false, theElement);

Pada versi Angular 1.4 Anda harus membalikkan argumen:

$animate.enabled(theElement, false);

Dokumentasi untuk$animate .

michael
sumber
2
Ini tidak berfungsi pada elemen tertentu seperti yang diharapkan. Jika saya mematikan animasi secara global dan kemudian mengaktifkannya pada satu elemen tertentu, itu tidak berfungsi.
Kushagra Gour
1
Jawaban ini harus dihapus atau diedit untuk menentukan versi Angular mana yang sebenarnya berfungsi. Untuk 1.2.10 pasti tidak berfungsi untuk mengaktifkan animasi secara selektif untuk elemen tertentu, yang merupakan inti dari pertanyaan AFAICT.
Trindaz
Adakah yang tahu jika Opsi 2 bekerja pada versi 1.2.25?
khorvat
1
Hanya dengan melihat dokumentasinya ( docs.angularjs.org/api/ng/service/$animate ) tampaknya «elemen» adalah parameter pertama yang akan diteruskan ke fungsi yang diaktifkan.
DanielM
49

Untuk menonaktifkan ng-animate untuk elemen tertentu, menggunakan kelas CSS, yang mengikuti paradigma animasi Angular, Anda dapat mengonfigurasi ng-animate untuk menguji kelas menggunakan regex.

Config

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

Pemakaian

Cukup tambahkan ng-animate-disabledkelas ke elemen apa pun yang ingin Anda abaikan dengan ng-animate.


Kredit http://davidchin.me/blog/disable-nganimate-for-selected-elements/

Blowsie
sumber
7
Menurut saya ini adalah cara paling tepat untuk memfilter perilaku ngannimate!
edrian
6
Layak untuk menelusuri jawaban ini.
Jossef Harush
Saya dapat mengonfirmasi bahwa dengan versi AngularJS terbaru, ini jelas merupakan solusi terbaik untuk masalah tersebut.
Adam Reis
44

terima kasih, saya menulis arahan yang dapat Anda tempatkan di elemen

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);
    };
});
pengguna1750709
sumber
Ini adalah pendekatan yang cukup bagus, tidak selalu jelas cara mengakses objek elemen, dan dengan beberapa pendekatan lain, saya khawatir saya akan mengacaukan pengontrol saya dengan referensi keras Javascript satu atau beberapa elemen yang ditentukan dalam template . Ini terasa seperti pemisahan perhatian yang hebat, pujian!
Mattygabe
2
Urutan parameter dibalik di $ animate.enabled, jika ada yang bertanya-tanya mengapa ini menonaktifkan semua animasi. Bekerja seperti pesona jika Anda menggunakan$animate.enabled(element,false);
gss
Maaf saya melihat itu hanya berlaku untuk 1.4.x +, kode di atas benar untuk versi sebelumnya.
gss
19

Saya telah menemukan itu $animate.enabled(false, $element);akan berfungsi untuk elemen yang menggunakan ng-showatau ng-hidetetapi tidak akan berfungsi untuk elemen yang digunakan ng-ifkarena alasan tertentu! Solusi yang akhirnya saya gunakan adalah melakukan semuanya di CSS, yang saya pelajari dari utas ini di 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;
  }
}
CBarr
sumber
Kasus saya adalah dengan ngAnimate dimuat, kelas seperti .loading.ng-hide akan tetap berada di layar sampai loop animasi penuh selesai. Ini adalah jawaban terbersih, karena pada dasarnya ini hanya memberikan konfigurasi yang tepat ke ngAnimate dan menggunakannya secara normal. Ini lebih disukai daripada salah konfigurasi, lalu menonaktifkannya. Jadi +1 untuk Anda, semoga saya bisa memberi lebih untuk meratakan skor di sini.
Eric
Ini adalah jawaban yang paling sulit. Melakukannya dengan css lebih baik daripada mengotak-atik js.
manas
Silakan lihat jawaban @Blowsie, itu adalah cara yang lebih umum dan benar untuk menangani ini
edrian
3

Saya TIDAK ingin menggunakan ngAnimate di milik saya ng-if, jadi ini akan menjadi solusi saya:

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

Posting ini sebagai saran lain!

Betty St
sumber
2

Saya memiliki daftar dari mana yang pertama lidisembunyikan menggunakan ng-hide="$first". Menggunakan ng-enterhasil liyang ditampilkan selama setengah detik sebelum menghilang.

Berdasarkan solusi Chris Barr, kode saya sekarang terlihat seperti ini:

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. */
robro
sumber
0

Saya tahu bahwa ini adalah balasan yang tertunda, tetapi di sini kami menggunakan MainController:

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

Tetapi masalahnya adalah ketika kita menonaktifkan semua animasi, ui-pilih dikonfigurasikan ke opacity: 0.

Jadi, perlu untuk mengatur opacity menjadi 1 menggunakan CSS:

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

Ini akan mengatur opacity dengan benar dan ui-select akan bekerja.

David Branco
sumber