Saya menggunakan jQuery dan jQuery-ui dan ingin menghidupkan berbagai atribut pada berbagai objek.
Demi menjelaskan masalah ini di sini saya telah menyederhanakannya menjadi satu div yang berubah dari biru menjadi merah ketika pengguna mengatasinya.
Saya bisa mendapatkan perilaku yang saya inginkan saat menggunakan animate()
, namun ketika melakukannya, style yang saya animasikan harus ada dalam kode animasi dan terpisah dari style sheet saya. (lihat contoh 1 )
Alternatif menggunakan addClass()
dan removeClass()
tetapi saya belum dapat membuat kembali perilaku tepat yang bisa saya dapatkan animate()
. (lihat contoh 2 )
Contoh 1
Mari kita lihat kode yang saya miliki dengan animate()
:
$('#someDiv')
.mouseover(function(){
$(this).stop().animate( {backgroundColor:'blue'}, {duration:500});
})
.mouseout(function(){
$(this).stop().animate( {backgroundColor:'red'}, {duration:500});
});
ini menampilkan semua perilaku yang saya cari:
- Animasi dengan lancar antara merah dan biru.
- Tidak ada animasi 'overqueue-ing' ketika pengguna menggerakkan mouse mereka dengan cepat masuk dan keluar dari div.
- Jika pengguna menggerakkan mouse mereka keluar / masuk saat animasi masih diputar dengan mudah antara negara 'setengah' saat ini dan negara 'tujuan' baru.
Tapi karena perubahan style didefinisikan di animate()
saya harus mengubah nilai style di sana, dan tidak bisa hanya mengarahkannya ke stylesheet saya. 'Pemisahan' ini tentang di mana gaya didefinisikan adalah sesuatu yang benar-benar menggangguku.
Contoh 2
Ini adalah upaya terbaik saya saat ini untuk menggunakan addClass()
dan removeClass
(perhatikan bahwa agar animasi berfungsi, Anda memerlukan jQuery-ui):
//assume classes 'red' and 'blue' are defined
$('#someDiv')
.addClass('blue')
.mouseover(function(){
$(this).stop(true,false).removeAttr('style').addClass('red', {duration:500});
})
.mouseout(function(){
$(this).stop(true,false).removeAttr('style').removeClass('red', {duration:500});
});
Ini menunjukkan properti 1. dan 2. dari persyaratan awal saya, namun 3 tidak berfungsi.
Saya mengerti alasannya:
Saat menjiwai addClass()
dan removeClass()
jQuery menambahkan gaya sementara ke elemen, dan kemudian menambahkan nilai yang sesuai sampai mereka mencapai nilai-nilai kelas yang disediakan, dan hanya kemudian benar-benar menambah / menghapus kelas.
Karena itu saya harus menghapus atribut style, jika tidak, jika animasi dihentikan setengah jalan, atribut style akan tetap ada dan secara permanen akan menimpa nilai kelas apa pun, karena atribut style dalam tag memiliki kepentingan yang lebih tinggi daripada gaya kelas.
Namun ketika animasi setengah selesai belum menambahkan kelas baru, dan dengan solusi ini warna melompat ke warna sebelumnya ketika pengguna menggerakkan mouse mereka sebelum animasi selesai.
Yang saya inginkan idealnya adalah dapat melakukan sesuatu seperti ini:
$('#someDiv')
.mouseover(function(){
$(this).stop().animate( getClassContent('blue'), {duration:500});
})
.mouseout(function(){
$(this).stop().animate( getClassContent('red'), {duration:500});
});
Di mana getClassContent
hanya akan mengembalikan isi kelas yang disediakan. Poin kuncinya adalah bahwa dengan cara ini saya tidak harus menyimpan definisi gaya saya di semua tempat, tetapi dapat menyimpannya di kelas di stylesheet saya.
sumber
getClassContent
kelihatannya?Jawaban:
Karena Anda tidak khawatir tentang IE, mengapa tidak menggunakan transisi css untuk menyediakan animasi dan jQuery untuk mengubah kelas. Contoh langsung: http://jsfiddle.net/tw16/JfK6N/
sumber
- IE 10+ - Chrome 26+ - FireFox 16+ - Safari 6.1+ - Opera 12.1+
-webkit, -moz, -o hanya diperlukan untuk peramban yang lebih lama. Anda mungkin dapat meninggalkannya untuk menghemat ruang.Solusi lain (tetapi membutuhkan jQueryUI seperti yang ditunjukkan oleh Richard Neil Ilagan dalam komentar): -
addClass, removeClass dan toggleClass juga menerima argumen kedua; durasi waktu untuk berpindah dari satu kondisi ke kondisi lainnya.
Lihat jsfiddle: - http://jsfiddle.net/6hvZT/1/
sumber
xxxClass()
fungsi.xxxClass
animasi yang tweening dengan cara ini?Anda bisa menggunakan jquery ui's
switchClass
, Heres contoh:Atau lihat jsfiddle ini .
sumber
Anda hanya perlu jQuery UI effects-core (13KB), untuk mengaktifkan durasi penambahan (seperti yang ditunjukkan Omar Tariq)
sumber
Saya melihat ini tetapi ingin memiliki tingkat transisi yang berbeda untuk masuk dan keluar.
Inilah yang akhirnya saya lakukan:
Ini secara instan mengubah warna latar belakang ke # 5eb4fc dan kemudian perlahan-lahan kembali normal selama 2 detik.
Ini biola
sumber
Meskipun, pertanyaannya cukup lama, saya menambahkan info yang tidak ada dalam jawaban lain.
OP menggunakan stop () untuk menghentikan animasi saat ini segera setelah acara selesai. Namun, menggunakan campuran parameter yang tepat dengan fungsi akan membantu. misalnya. stop (true, true) atau stop (true, false) karena ini memengaruhi animasi yang antri dengan baik.
Tautan berikut menggambarkan demo yang menunjukkan berbagai parameter yang tersedia dengan stop () dan perbedaannya dari selesai ().
http://api.jquery.com/finish/
Meskipun OP tidak memiliki masalah menggunakan JqueryUI, ini untuk pengguna lain yang mungkin menemukan skenario serupa tetapi tidak dapat menggunakan JqueryUI / perlu untuk mendukung IE7 dan 8 juga.
sumber