Bagaimana menjalankan dua animasi jQuery secara bersamaan?


211

Apakah mungkin menjalankan dua animasi pada dua elemen berbeda secara bersamaan? Saya perlu kebalikan dari pertanyaan ini animasi antrian Jquery .

Saya perlu melakukan sesuatu seperti ini ...

$('#first').animate({ width: 200 }, 200);
$('#second').animate({ width: 600 }, 200);

tetapi untuk menjalankan keduanya pada saat yang sama. Satu-satunya hal yang dapat saya pikirkan adalah menggunakan setTimeoutsatu kali untuk setiap animasi, tetapi saya tidak berpikir itu adalah solusi terbaik.


Erm ... sudahkah Anda mencobanya? Jika Anda menggunakan kode persis yang Anda miliki di sana, untuk pemahaman saya tentang cara animate()kerjanya, mereka harus berjalan secara bersamaan.
chaos

Ini dia - jsbin.com/axata . Tambahkan / edit untuk melihat kode
Russ Cam

Saya memiliki masalah nyata ketika menghidupkan properti CSS yang berbeda. Pertanyaan ini terlihat tua, dan saya taruh di JSFiddle, sepertinya kedua pendekatan tersebut berhasil. Apakah ini masih relevan? jsfiddle.net/AVsFe
valk

3
Dalam jquery saat ini, dan saya percaya sejak jQuery 1.4, kode di atas melakukan animasi keduanya secara bersamaan, karena fx queue dilampirkan ke elemen yang Anda panggil .animate () aktif, bukan antrian global.
Chris Moschini

Di atas jsbin sudah mati. jsfiddle yang sama, yang berfungsi: jsfiddle.net/b9chris/a8pwbhx1
Chris Moschini

Jawaban:


418

ya ada!

$(function () {
    $("#first").animate({
       width: '200px'
    }, { duration: 200, queue: false });

    $("#second").animate({
       width: '600px'
    }, { duration: 200, queue: false });
});

15
Terima kasih untuk ini, tidak tahu tentang queuevariabel itu!
Dotty

4
Bolehkah saya bertanya apa tujuan melewatkan fungsi ke jQuery?
pilau

13
@ Pilau Ini akan dieksekusi ketika dokumen siap. Ini adalah singkatan untuk $ (dokumen). Sudah (fungsi () {}); dan memungkinkan Anda untuk meletakkan kode javascript Anda sebelum definisi elemen Anda.
Raphael Michel

1
ya, Anda dapat makan mengatur antrian ke true / false, atau memberinya string (nama-antrian) dengan cara ini, kedua animasi menggunakan timer yang sama ...
AlexK

3
Bagaimana Anda menambahkan onComplete untuk ini?
jmchauv

19

Itu akan berjalan secara bersamaan ya. bagaimana jika Anda ingin menjalankan dua animasi pada elemen yang sama secara bersamaan?

$(function () {
    $('#first').animate({ width: '200px' }, 200);
    $('#first').animate({ marginTop: '50px' }, 200);
});

Ini akhirnya mengantri animasi. untuk menjalankannya secara bersamaan, Anda hanya akan menggunakan satu baris.

$(function () {
    $('#first').animate({ width: '200px', marginTop:'50px' }, 200);
});

Apakah ada cara lain untuk menjalankan dua animasi berbeda pada elemen yang sama secara bersamaan?


9

Saya yakin saya menemukan solusinya dalam dokumentasi jQuery:

Animasi semua paragraf ke gaya kiri 50 dan opacity 1 (buram, terlihat), menyelesaikan animasi dalam 500 milidetik. Ini juga akan melakukannya di luar antrian, artinya akan secara otomatis mulai tanpa menunggu gilirannya .

$( "p" ).animate({
  left: "50px", opacity: 1
}, { duration: 500, queue: false }); 

hanya menambahkan: queue: false.


1
Bagaimana cara mengintegrasikan fungsi lengkap yang satu ini? : s
Brainfeeder

8

Jika Anda menjalankan seperti di atas, mereka akan tampak berjalan secara bersamaan.

Berikut ini beberapa kode uji:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<script>
$(function () {
    $('#first').animate({ width: 200 }, 200);
    $('#second').animate({ width: 600 }, 200);
});
</script>
<div id="first" style="border:1px solid black; height:50px; width:50px"></div>
<div id="second" style="border:1px solid black; height:50px; width:50px"></div>

3

Meskipun benar bahwa panggilan beruntun untuk menghidupkan akan memberikan tampilan yang mereka jalankan pada saat yang sama, kebenaran mendasarnya adalah mereka memiliki animasi berbeda yang berjalan sangat dekat dengan paralel.

Untuk memastikan animasi benar-benar berjalan pada saat yang bersamaan, gunakan:

$(function() {
    $('#first').animate({..., queue: 'my-animation'});
    $('#second').animate({..., queue: 'my-animation'}).dequeue('my-animation');
});

Animasi lebih lanjut dapat ditambahkan ke antrian 'animasi-saya' dan semua dapat diinisiasi dengan memberikan animasi terakhir.

Salam, Anthony


2

Lihat posting blog yang brilian tentang menjiwai nilai dalam objek .. Anda kemudian dapat menggunakan nilai untuk menghidupkan apa pun yang Anda suka, 100% secara bersamaan!

http://www.josscrowcroft.com/2011/code/jquery-animate-increment-decrement-numeric-text-elements-value/

Saya telah menggunakannya seperti ini untuk meluncur masuk / keluar:

        slide : function(id, prop, from, to) {
            if (from < to) {
                // Sliding out
                var fromvals = { add: from, subtract: 0 };
                var tovals = { add: to, subtract: 0 };
            } else {
                // Sliding back in
                var fromvals = { add: from, subtract: to };
                var tovals = { add: from, subtract: from };
            }

            $(fromvals).animate(tovals, {
                duration: 200,
                easing: 'swing', // can be anything
                step: function () { // called on every step
                    // Slide using the entire -ms-grid-columns setting
                    $(id).css(prop, (this.add - this.subtract) + 'px 1.5fr 0.3fr 8fr 3fr 5fr 0.5fr');
                }
            });
        }

1
Tautan mati, menemukannya kembali di web.archive.org/web/20150101065437/http
PhiLho

0

Posting jawaban saya untuk membantu seseorang, jawaban berperingkat teratas tidak menyelesaikan keraguan saya.

Ketika saya menerapkan yang berikut [dari jawaban atas], animasi gulir vertikal saya hanya naik-turun:

$(function () {
 $("#first").animate({
   width: '200px'
}, { duration: 200, queue: false });

$("#second").animate({
   width: '600px'
}, { duration: 200, queue: false });
});

Saya merujuk ke: W3 Schools Set Interval dan itu memecahkan masalah saya, yaitu bagian 'Sintaks':

setInterval (fungsi, milidetik, param1, param2, ...)

Parameter saya pada formulir { duration: 200, queue: false }memaksa durasi nol dan hanya melihat parameter untuk panduan.

Yang panjang dan pendek, inilah kode saya, jika Anda ingin memahami mengapa ini bekerja, baca tautan atau analisis parameter interval yang diharapkan:

var $scrollDiv = '#mytestdiv';
var $scrollSpeed = 1000;
var $interval = 800;

function configureRepeats() {
   window.setInterval(function () {
       autoScroll($scrollDiv, $scrollSpeed);
   }, $interval, { queue: false });
};

Di mana 'autoScroll' adalah:

    $($scrollDiv).animate({
        scrollTop: $($scrollDiv).get(0).scrollHeight
    }, { duration: $scrollSpeed });

    //Scroll to top immediately 
    $($scrollDiv).animate({
        scrollTop: 0
    }, 0);

Selamat coding!

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.