2016-04-13 12 views
1

.test div numarasını, her tıklandığında saat yönünde 180 ° döndürmeye çalışıyorum. Ben ne yaptımUyarı modunun eklenmesi neden CSS rotasyon yönünü etkiler?

temelde: hayır rotasyon oluştu

  • ise 180 döndürün.
  • 180 ° döndürüldüyse, 360 ° döndürün. 360 döndürüldüğünde uğradıysa
  • , transform ve transition özelliklerini kaldırmak ve 180 döndürün.

$(".test").click(function(){ 
    var angle; 
    var matrix = $(this).css("-webkit-transform") 
    if (matrix == "none") { //div hasn't been rotated yet 
     angle = 0; 
    } 
    else { 
     var values = matrix.split('(')[1].split(')')[0].split(','); 
     var a = values[0]; //should be -1 if div is upside down, 1 if it is normal. 
     if(a == 1) { 
      $(this).removeAttr('style'); 
      angle = 0; 
     } 
     else { 
      angle = 180; 
     } 
    } 
    $(this).css({ 
     "-webkit-transform": "rotate("+(angle+180)+"deg)", 
     "-moz-transform": "rotate("+(angle+180)+"deg)", 
     "transform": "rotate("+(angle+180)+"deg)", 
     "-webkit-transition": "-webkit-transform 0.3s ease-in", 
    }); 
}); 

Bu ilk iki tıklama için çalışıyor, ancak 180 360 den dönen oymuş gibi üçüncü tıklamada div ben zaten olmasına rağmen, saat yönünün tersi yönde style özniteliği kaldırıldı.

İşte bir çalışma keman var: https://jsfiddle.net/wwny5q5d/3/

Şimdi, gerçekten merak var şey .css() çağırmadan önce alert veya debugger bir eklerseniz ben, saat yönünde onu istediğiniz gibi üçüncü dönme gider.

alert("Now it will always rotate clockwise") 
$(this).css({ 
    "-webkit-transform": "rotate("+(angle+180)+"deg)", 
    "-moz-transform": "rotate("+(angle+180)+"deg)", 
    "transform": "rotate("+(angle+180)+"deg)", 
    "-webkit-transition": "-webkit-transform 0.3s ease-in", 
}); 

Yani benim sorular şunlardır: Neden üçüncü bir tıklama benim div döndürme yönünde VE niye alert dahil o iş yapmak etmez ki? onun 360 tarzı div kaldırılmadan önce zaman keman olarak

+0

@Gothdo ben '.test' div bir grup vardır çünkü ben istemiyorum sayaç çeşit, kullanmadığınız sürece 0˚ veya 360˚ derecede olmak bunun ayırt edemez çünkü. Peki 180˚ veya 540˚'ya dönmek isteyip istemediğimi nasıl anlarım? – digglemister

+0

@Gothdo Takip ettiğimden emin değilim. Mevcut rotasyonuna sadece 180 eklediniz mi? Sorun şu ki, ne kadar döndürüldüğünü bilmiyorum, sadece eşdeğer mod360 olan döndürme matrisindeki değerleri biliyorum. – digglemister

+0

Evet, bakınız http://stackoverflow.com/questions/13592384/how-to-retrieve-the-angle-in-css3-rotate –

cevap

2

kullanın

this.style.cssText.match(/\((\d+)deg\)/)[1]) 

görebilirsiniz.

Bkz. JS Fiddle demo.

+0

Awesome, bunu yapacağım, yardım için gerçekten minnettarım. Orijinal kodumda rotasyon stil niteliğinin kaldırılmasından önce neden uygulandığına dair herhangi bir fikir var mı? – digglemister

+0

@snookieordie Çünkü 'style' öğesini kaldırdıktan hemen sonra * yeni stilleri ekliyorsunuz. SetTimeout (function() {}, 0) 'ile yeni stiller ayarlamayı geciktirdiyseniz, tarayıcı öğeyi yeniden boyayacak ve yeniden boyanan öğeye yeni stiller uygulayacaktır. –

+0

@snookieordie Daha iyi bir anlayış için size iki örnek bir JS Fiddle vereceğim. [Ilk] 'de (https://jsfiddle.net/03mpau55/)' div 'ikinci kez tıklarsanız, büyütmez, çünkü eski stilleri kaldırıldıktan hemen sonra yeni stiller uygulanır, böylece tarayıcı yorumlanır. "hiçbir şey değişmedi". Ancak, [ikinci] 'de (https://jsfiddle.net/schnkjhp/), eski stil tarayıcıyı kaldırdıktan sonra 'div' yeniden çizer ve bundan sonra yeni stiller uygulanır. –

0

, rotasyon div uygulanıyor. Bu yüzden açı 0 olarak ayarlanıyor ve sonra açı = 0'a göre 180'e dönüyor. Uyarı iletişim kutusu CSS ayarlanmadan önce bir gecikme ekliyor, bu da stilin kaldırılmasına izin veriyor, sonra açı 0'a, sonra CSS uygulanır. Yukarda @Gothdo'nun söylediği gibi, sıfırın sıfırlanması için sıfırdan 180'e sürekli olarak rotasyon eklemesi gerektiğine inanıyorum. Orijinal olmayan bilgisayarlı değeri almak için bu yapılır Here

+0

Stilin kaldırılmasından önce döndürmenin neden uygulandığı hakkında herhangi bir fikir var mı? Benim kodumdan bunun neden böyle olacağı açık değil.Ve gösterdiğiniz örnekle ilgili sorun, bir sayaca dayanmasıdır, her tıklama için 5'e "dönüşe" veya benzer bir şeye eklenir. Benim sorunum, eğer önlenebilirse 100 ayrı div için 100 ayrı sayaç almak istemiyorum. – digglemister

İlgili konular