Öğeyi canlandırma dönüşümü döndürme


83

Bir jQuery ile bir öğeyi nasıl döndürürüm .animate()? Şu anda opaklığı doğru şekilde canlandıran aşağıdaki satırı kullanıyorum, ancak bu CSS3 dönüşümlerini destekliyor mu?

$(element).animate({
   opacity: 0.25,
   MozTransform: 'rotate(-' + -amount + 'deg)',
   transform: 'rotate(' + -amount + 'deg)'
});

1
CSS dönüşümlerini canlandıracak bir jQuery eklentisi var. Firefox, Chrome, Safari, Opera ve Internet Explorer'da çalışır. github.com/puppybits/QTransform
puppybits

Burada aynı konuyla bir aramada sona erdi ve eklentiyi indirdi; iyi çalışıyor, ancak benim yaptığım başka bir eklentide bu talimatla çakışmaya neden oldu: $ ("#" + self.id) .css ("transform", "scale (1)"); Bu satırı değiştirdim: elem.style [$. CssProps.transform] = val + '%'; buna: if (isNaN (val)) elem.style [$. cssProps.transform] = val; else elem.style [$. cssProps.transform] = val + '%'; Daha fazla açıklamaya gerek olmadığını düşünüyorum.
sergio0983

Yanıtlar:


96

Bildiğim kadarıyla, temel animasyonlar sayısal olmayan CSS özelliklerine animasyon uygulayamaz.

Bunu bir adım işlevi ve kullanıcıların tarayıcısı için uygun css3 dönüşümü kullanarak yapabileceğinizi düşünüyorum . CSS3 dönüşümü, tüm tarayıcılarınızı kapsamak için biraz zordur (örneğin, IE6, Matrix filtresini kullanmanız gerekir).

DÜZENLEME : işte webkit tarayıcılarında (Chrome, Safari) çalışan bir örnek: http://jsfiddle.net/ryleyb/ERRmd/

Yalnızca IE9'u desteklemek istiyorsanız , FireFox transformyerine kullanabilir -webkit-transformveya -moz-transformdestekleyebilirsiniz.

Kullanılan numara, umursamadığımız bir CSS özelliğini canlandırmak ( text-indent) ve ardından dönüşü yapmak için bir adım işlevinde değerini kullanmaktır:

$('#foo').animate(
..
step: function(now,fx) {
  $(this).css('-webkit-transform','rotate('+now+'deg)'); 
}
...

Bu, hem kod bakımı hem de hız açısından zahmetli bir çözümdür. Forget jQueryederken transforming, benim çözüm kontrol edin.
Dyin

Ya sabit değil, her zaman döndürmek için değişen bir değere sahipseniz?
edonbajrami

78

Ryley'in cevabı harika, ancak öğenin içinde bir metin var. Metni diğer her şeyle birlikte döndürmek için metin girintisi yerine border-spacing özelliğini kullandım.

Ayrıca, biraz açıklığa kavuşturmak için, öğenin tarzında başlangıç ​​değerinizi ayarlayın:

#foo {
    border-spacing: 0px;
}

Ardından animasyon yığınında, nihai değeriniz:

$('#foo').animate({  borderSpacing: -90 }, {
    step: function(now,fx) {
      $(this).css('transform','rotate('+now+'deg)');  
    },
    duration:'slow'
},'linear');

Benim durumumda saat yönünün tersine 90 derece dönüyor.

İşte canlı demo .


3
z-endeksini kullanmak, başka bir yerde kullanmıyorsanız da iyi bir seçenektir. ama bu konuda negatif gitmek istemezsiniz.
Sherzod

4
-Ms- ve -o- uzantılarını da eklemek isteyebilirsiniz ( css3please.com adresine bakın )
Joram van den Boezem

Ek özellikleri aynı anda nasıl canlandırabilirsiniz?
MadTurki

@MadTurki, sorunuzun cevabını aşağıya yazdım!
skagedal

5
jQuery aslında tüm -moz-, -webkit-, vb. öneklerini sizin için ekleyecek kadar akıllıdır, böylece bu kodu biraz basitleştirebilirsiniz. çok güzel cevap. +1
Octopus

49

Bence animatejQuery'ler, transitionherhangi bir 2D veya 3D özellikte bu tür bir animasyonu gerçekleştiren CSS3'e kıyasla biraz fazla kullanılıyor . Ayrıca korkarım ki, tarayıcıya bırakıp JavaScript adlı katmanı unutarak, özellikle animasyonlarla patlama yapmak istediğinizde, yedek CPU suyuna yol açabilir . Bu nedenle, JavaScript ile işlevselliği tanımladığınız için stil tanımlarının olduğu animasyonlara sahip olmayı seviyorum . JavaScript'e ne kadar çok sunum eklerseniz, daha sonra o kadar çok sorunla karşılaşacaksınız.

Yapmanız gereken tek şey, addClassCSS transitionözelliklerine sahip bir sınıf belirlediğiniz, canlandırmak istediğiniz öğeyi kullanmaktır . Sen sadece animasyon "aktive" kalır, saf sunum katmanında uygulanan .

.js

// with jQuery
$("#element").addClass("Animate");

// without jQuery library
document.getElementById("element").className += "Animate";

JQuery ile bir sınıf kolaylıkla kaldırılabilir veya kitaplık olmadan bir sınıf kaldırılabilir .

.css

#element{
    color      : white;
}

#element.Animate{
    transition        : .4s linear;
    color             : red;
    /** 
     * Not that ugly as the JavaScript approach.
     * Easy to maintain, the most portable solution.
     */
    -webkit-transform : rotate(90deg);
}

.html

<span id="element">
    Text
</span>

Bu, çoğu kullanım durumu için hızlı ve kullanışlı bir çözümdür.

Bunu, farklı bir stil (alternatif CSS özellikleri) uygulamak istediğimde ve stili anında global bir .5s animasyonuyla değiştirmek istediğimde de kullanıyorum. Şu şekilde bir BODYalternatif CSS'ye sahipken öğesine yeni bir sınıf ekliyorum :

.js

$("BODY").addClass("Alternative");

.css

BODY.Alternative #element{
    color      : blue;
    transition : .5s linear;
}

Bu şekilde, farklı CSS dosyaları yüklemeden animasyonlarla farklı stiller uygulayabilirsiniz. Bir class.


1
Sorun değil, ancak CSS3 geçişlerini destekleyen tarayıcılarla sınırlıdır . Yani IE8 veya IE9 yok. Bu pes etmek için oldukça büyük bir bölüm.
Ryley

11
@Ryley Kullanıcıların % 12'sinden bahsediyorsunuz . IE8 veya IE9 kullanıcıları% 5'in altındadır. Hala sunum katmanından ve işlevsellikten bahsettiğimizden, pes etmek çok büyük bir segment değil. Ziyaretçilerinizin yaklaşık% 5'i 3D animasyonlarınızı görmeyecek. Ayrıca bir tarayıcı (IE) desteklemiyorsa transition, kesinlikle dönüşümlerinizi de desteklemeyecektir.
Dyin

Bu tamamen doğru değil - transformIE9 tarafından destekleniyor. Ama vazgeçilecek en büyük kullanıcı grubu olmadığını kabul ediyorum (IE8).
Ryley

2
@Dyin Sabit bir% 12 değil, hedef demografinize bağlı. Google-analytics'e göre firmamın kullanıcılarının% 50'si IE8 kullanıyor. Anahtar, hedef kitlenizi tanımaktır. Söyleniyor: bravo dostum! Bu cevap ilk ikisinden çok daha iyidir. "İşlenmemiş elmas" olmanın yolu.
Ziggy

2
Bu, dinamik rotasyon değerlerini de hesaba katmaz.
Yuschick

19

Ryley ve atonyc ait cevaplar eklemek için, aslında gibi gerçek CSS özelliğini kullanmak gerekmez text-indexya border-spacing, ama bunun yerine gibi sahte CSS özelliğini belirtebilir rotationya my-awesome-property. Gelecekte gerçek bir CSS mülkü olma riskini taşımayan bir şey kullanmak iyi bir fikir olabilir.

Ayrıca, biri aynı anda diğer şeyleri nasıl canlandıracağını sordu. Bu her zamanki gibi yapılabilir, ancak stepişlevin her animasyonlu özellik için çağrıldığını unutmayın , bu nedenle mülkünüzü şu şekilde kontrol etmeniz gerekir:

$('#foo').animate(
    {
        opacity: 0.5,
        width: "100px",
        height: "100px",
        myRotationProperty: 45
    },
    {
        step: function(now, tween) {
            if (tween.prop === "myRotationProperty") {
                $(this).css('-webkit-transform','rotate('+now+'deg)');
                $(this).css('-moz-transform','rotate('+now+'deg)'); 
                // add Opera, MS etc. variants
                $(this).css('transform','rotate('+now+'deg)');  
            }
        }
    });

(Not: "Tween" nesnesinin belgelerini jQuery belgelerinde bulamıyorum; canlandırma belgeleri sayfasından , http://api.jquery.com/Types#Tween bağlantısı var ki bu bir bölüm Görünüşe göre yok. Tween prototipinin kodunu burada Github'da bulabilirsiniz ).


myRotationProperty nedir ... sizin tanımladığınız özel bir şey mi; ve neyin buna nowbağlı olduğu .
Muhammad Umer

@MuhammadUmer - evet, myRotationPropertyözel bir şey, uydurma, "sahte" bir CSS özelliği. nowbu adımda özellik değerindeki değişikliği belirten adım geri çağırma işlevinin ilk argümanıdır.
skagedal

sonra bu özelliği css'de de başlattınız. Ya da sıfır alırsa canlandırabilirsiniz.
Muhammad Umer

7

Sadece CSS geçişlerini kullanın:

$(element).css( { transition: "transform 0.5s",
                  transform:  "rotate(" + amount + "deg)" } );

setTimeout( function() { $(element).css( { transition: "none" } ) }, 500 );

Örnek olarak animasyonun süresini 0,5 saniyeye ayarlıyorum.

Not setTimeoutkaldırmak için transitionanimasyon bittikten sonra CSS özelliği (500 ms)


Okunabilirlik için satıcı öneklerini ihmal ettim.

Bu çözüm, tarayıcının ders dışı geçiş desteğini gerektirir.


Teşekkürler, benim için çalıştı. Ayrıca, kapanış parantezinizin arkasında bir noktalı virgül unuttunuz.
Devin Carpenter

@ Sorrow123444 Senin için çalıştığına sevindim. Eksik noktalı virgülü düzelttim, teşekkür ederim
Paolo

3

Sonsuz bir döngü animasyonu için jQuery'de CSS dönüşümünü kullanmak isteyen bu gönderiye rastladım. Bu benim için iyi çalıştı. Yine de ne kadar profesyonel olduğunu bilmiyorum.

function progressAnim(e) {
    var ang = 0;

    setInterval(function () {
        ang += 3;
        e.css({'transition': 'all 0.01s linear',
        'transform': 'rotate(' + ang + 'deg)'});
    }, 10);
}

Kullanım örneği:

var animated = $('#elem');
progressAnim(animated)

1
//this should allow you to replica an animation effect for any css property, even //properties //that transform animation jQuery plugins do not allow

            function twistMyElem(){
                var ball = $('#form');
                document.getElementById('form').style.zIndex = 1;
                ball.animate({ zIndex : 360},{
                    step: function(now,fx){
                        ball.css("transform","rotateY(" + now + "deg)");
                    },duration:3000
                }, 'linear');
            } 
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.