Meringkas Efek Animasi Beruntun/Berkelanjutan
Saat kita membuat efek animasi beruntun/berkelanjutan menggunakan .animate()
, biasanya kita akan melakukan ini:
$('div').animate({
width:100,
height:30
}, 1000).animate({
marginTop:200,
marginLeft:100
}, 1000).animate({
fontSize:30,
padding:40
}, 1000).animate({
borderWidth:10
}, 1000).animate({
marginTop:0
}, 1000); // dan seterusnya...
Implementasi di atas memang bekerja dan sama sekali tidak salah. Lihat hasilnya di sini:
Tapi sadarkah Anda bahwa properti-properti animasi yang tertulis di dalam .animate()
pada dasarnya hanyalah objek:
var anim = [
{ width:100, height:30 },
{ marginTop:200, marginLeft:100 },
{ fontSize:30, padding:40 },
{ borderWidth:10 },
{ marginTop:0 }
];
Ini memungkinkan kita untuk menerapkan properti-properti animasi tersebut satu per satu tanpa harus mendeklarasikan .animate()
berulang kali:
var anim = [
{ width:100, height:30 },
{ marginTop:200, marginLeft:100 },
{ fontSize:30, padding:40 },
{ borderWidth:10 },
{ marginTop:0 }
];
$.each(anim, function(i) {
$('div').animate(anim[i], 1000);
});
Atau cukup gunakan cara lama yang biasa digunakan untuk menangani array saat kita menggunakan JavaScript mentah seperti ini:
var anim = [
{ width:100, height:30 },
{ marginTop:200, marginLeft:100 },
{ fontSize:30, padding:40 },
{ borderWidth:10 },
{ marginTop:0 }
];
for (var i = 0, len = anim.length; i < len; i++) {
$('div').animate(anim[i], 1000);
}
Performa?
Saya tidak tahu apakah cara ini bisa mempercepat kerja animasi atau tidak (Saya malas mengetesnya). Tapi Saya pikir cara ini bisa mempermudah kita di dalam membangun deret animasi berlebih-lebihan tanpa harus mendeklarasikan jQuery .animate()
secara berlebihan. Selain itu, dengan cara mempopulasikan properti animasi di dalam array, maka ini memungkinkan kita untuk menciptakan gerak animasi yang berbeda-beda pada elemen yang berbeda dengan cara meletakkan array animasi ke dalam atribut elemen. Misalnya seperti ini:
<div data-animation="[{top:30},{left:50},{fontSize:30,borderWidth:10},{padding:30}]"></div>
Setelah itu, cukup gunakan method manipulasi atribut untuk mendapatkan nilai atribut pada masing-masing elemen. Konversi nilainya agar menjadi array (bukan string) dengan eval()
:
$('div').each(function() {
var anim = eval($(this).data('animation')), // Mengambil nilai atribut `data-animation` dari elemen
$div = $(this);
$.each(anim, function(i) {
$div.animate(anim[i], 1000);
});
});
Referensi: SO - jQuery .animate() with Direction That Created from an Array of Objects, But
Labels: JavaScript, jQuery, Lanjutan
9 Comments:
Thanks so much, my friend :-)
By Admin, at Sunday, December 30, 2012 at 1:05:00 AM GMT+7
Jadi lebih ringkas dan teratur ya mas, lebih enak juga bacanya, untuk kecepatan kayakna ga jauh beda kl cuma kodenya segitu 0:)
Btw itu kalo tuliasn "PERFECT" diganti "TAUFIK GANTENG" lebih keren kayakna ^_^
By Satyapradana, at Sunday, December 30, 2012 at 11:01:00 PM GMT+7
di sini yg ganteng mah :D
By Beben Koben, at Monday, December 31, 2012 at 9:09:00 PM GMT+7
diterangin jg kl emang gak ngerti dr dasar (kek ane), tetep rada loading bos :p
By Beben Koben, at Monday, December 31, 2012 at 9:12:00 PM GMT+7
agar efeknya langsung berjalan saat halaman selesai dimuat tanpa harus klik tombol "check me" bagaimana caranya..??
By Unknown, at Friday, March 1, 2013 at 6:55:00 AM GMT+7
Tidak perlu dimasukkan ke dalam event .on("click")
By Taufik Nurrohman, at Friday, March 1, 2013 at 7:44:00 AM GMT+7
This comment has been removed by the author.
By Unknown, at Saturday, March 2, 2013 at 1:34:00 PM GMT+7
maksudnya?? maaf belum begitu paham soal jva/jquery
apakah kode ini tidak perlu di masukan
$('button').click(function() {
By Unknown, at Saturday, March 2, 2013 at 1:36:00 PM GMT+7
<div data-animation="[{width:200},{height:10}]"></div>
<div data-animation="[{marginTop:100},{marginTop:0}]"></div>
<div data-animation="[{width:200},{marginTop:200}]"></div>
<script>
$('div[data-animation]').each(function() {
var anim = eval($(this).data('animation')),
$div = $(this);
$.each(anim, function(i) {
$div.animate(anim[i], 1000);
});
});
</script>
By Taufik Nurrohman, at Saturday, March 2, 2013 at 7:36:00 PM GMT+7
Post a Comment
<< Home