2016-04-13 50 views
1

Geçerli konumuna göre hareket etmek için dönüştürmeler kullanan bir CSS animasyonu var.CSS'deki dönüşümler nasıl birleştirilir?

CSS

fish { 
    animation: fishanimation 4s ease-in-out infinite alternate; 
} 

@keyframes fishanimation { 
    0% { 
    transform: translateY(20px); 
    } 

    100% { 
    transform: translateY(80px); 
    } 
} 

Şimdi dinamik javascript kullanarak ölçek ve rotasyon ayarlamak istiyorum ama bu çalışan css animasyon tarafından üzerine alır. dönüşümler kombine edilmez :(

Javascript

this.div.style.transform = "scale(0.4) rotate(45deg)"; 

mümkün ölçek ve rotasyon mevcut dönüşüm için geçerli olması mı bir şey gibi:?

element.transform = element.transform + "scale(0.4) rotate(34deg)"; 

DÜZENLEME:

Bu sorunun bir kopyası değil: how to combine css transforms. Bir öğenin zaten üzerine yazmak istemediğim bir dönüşümü olabilir. Aslında mevcut dönüşüm durumunun ne olduğunu bilmeden buna eklemek istiyorum. yorumladığı gibi

+0

Animasyon çalışırken, dönüşüme eklemek istediğiniz anlamına mı geliyor? – Harry

+1

Evet, stil sayfasında tanımladığım mevcut animasyon çalışmaya devam etmelidir. Ölçek ve döndürme gibi henüz css'de tanımlanmamış olan dönüşümleri değiştirmek istiyorum. – Kokodoko

+2

Animasyon başladığında ve çalışıyorsa, animasyon ana karelerin parçası olan özelliklerin denetimini alır ve bu nedenle, satır içi stiller aracılığıyla düzenleyemezsiniz. Ana kareleri yeniden yazmanız ve animasyonu yeniden yansıtmanız gerekir. Spesifikasyonda [burada] (https://www.w3.org/TR/css3-animations/#animations) (Bölüm 3'ün altındaki birinci paragraf) 'de belirtilmiştir. – Harry

cevap

2

, Bunu için bir animasyon kütüphanesi kullanmak tavsiye iyi bir örnek Velocity JS olduğunu. ** Click for Velocity JS website.

önerilen gibi bir kütüphane, bir seçenek değilse, o zaman okumak üzerinde!

Önceki dönüşümlerinizin üst kısmında birden fazla dönüşüm yapmak istiyorsanız, dönüşüm için matrix değerini kullanmanız gerekir. Matris ile ilgili işler biraz karmaşıklaşır. matris için parametreler bu sırada şunlardır: -:

fish { 
    animation: fishanimation 4s ease-in-out infinite alternate; 
} 

@keyframes fishanimation { 
    0% { 
    transform: matrix(1, 0, 0, 1, 0, 20); 
    } 

    100% { 
    transform: matrix(1, 0, 0, 1, 0, 80); 
    } 
} 

dinamik JavaScript Bunu değiştirmek için gerektirecektir bazı -

matrix(scaleX(),skewY(),skewX(),scaleY(),translateX(),translateY()); 

en Bahsettiğiniz ilk balık animasyon ile başlamaya örnek verelim hoş olmayan dize manipülasyonu ve elementin dönüşüm özelliğini elde etme (ki düşündüğünüzden daha garip). İşte bunu nasıl yapabileceğinize dair bir örnek.

function getTransformValues(obj) { 
    var transform = { 
     scaleX: 1, 
     skewX: 0, 
     skewY: 0, 
     scaleY: 1, 
     translateX: 0, 
     translateY: 0 
    }; 

    var matrix = obj.css("-webkit-transform") || 
       obj.css("-moz-transform") || 
       obj.css("-ms-transform")  || 
       obj.css("-o-transform")  || 
       obj.css("transform"); 

    if (matrix && matrix !== 'none') { 
     var values = matrix.split('(')[1].split(')')[0].split(','); 
     transform.scaleX = parseFloat(values[0]); 
     transform.skewY = parseFloat(values[1]); 
     transform.skewX = parseFloat(values[2]); 
     transform.scaleY = parseFloat(values[3]); 
     transform.translateX = parseFloat(values[4]); 
     transform.translateY = parseFloat(values[5]); 
    } 

    return transform; 
} 

var values = getTransformValues($('#test')); 
console.log(values); 
// Object {scaleX: 1, skewX: 0, skewY: 0, scaleY: 2, translateX: 50, translateY: 40} 

Şimdi örneğin, sadece istediğiniz birini değiştirerek yeni bir matris oluşturmaya başlayabilirsiniz bu değerleri var: -

var old = { 
    scaleX: 1, 
    skewX: 0, 
    skewY: 0, 
    scaleY: 2, 
    translateX: 50, 
    translateY: 40 
}; 

$('#test').css('transform', 'matrix(' + old.scaleX + ', ' + old.skewY + ', ' + old.skewX + ', ' + old.scaleY + ', ' + old.translateX + ', ' + old.translateY + ')'); 

Çıplak benimle ... İsterseniz olsun daha da karmaşık olan döndürme açısını manipüle etmeye başlayın. Bu cevap çok bogging önlemek için, sorunun bu kısmının aşağıdaki bağlantıda bir çözümü vardır: Böyle Hız JS, yazma sırasında en az olarak kütüphaneleri benimseyerek neden Get element -moz-transform:rotate value in jQuery

Umarım görebilirsiniz vardır hızlı, kolay, temiz ve pürüzsüz çapraz tarayıcı animasyon için gitmek için en iyi yol.

+0

Ayrıntılı açıklama için teşekkürler! – Kokodoko

+0

Dönüşte döndürme uygulandığında parseInt() 'ın iyi bir yaklaşım olamayacağını unutmayın (ve ** döndürmeyi düzenlemek istemiyorsanız bile gerçek dönüşümü korumak istiyorsunuz). Örneğin, bir "dönüşümü: döndür (3deg)" uygulamam varsa ve daha sonra değerini "$ element.css (" transform ")' ile kontrol edersek, o zaman matrisi alırız (0.99863, 0.052336, -0.052336, 0.99863). , 0, 0) "'. Görünüşe göre rotasyon dönüşümü, matrisin “eğriltme” yönleri için bile kayan nokta değerleri yapar. Bu yüzden bazı durumlarda 'parseFloat()' gibi bir şey kullanarak daha iyi şansımız olabilir. –

+0

İhtiyaç duyulan bir başka düzenleme de getTransformValues ​​() işlevidir. 'SkewY' değeri, değerlerden [1] gelir ve' skewX' değeri, değerlerden gelir [2]. Önceki yorumumda belirtildiği gibi, eğer bir "rotate" dönüşümü varsa, o zaman "skew" değerleri dolduruyor, bu yüzden 'skewX' ve 'skewY' yanlış değere sahip olmanız durumunda, döndürme, flip-flopped olacaktır. 'SkewY() 've' skewX() 'sırasının cevabın daha önce belirtildiğine dikkat edin. –