2014-06-19 15 views
7

Mam siatkę bezwzględnie rozmieszczonych elementów div (siatka składa się z różnie ukształtowanych prostokątów, które pasują do siebie tworząc duży prostokąt).Jak przesuwać elementy div z poza ekranem do układu absolutnego za pomocą przejść CSS?

Próbuję ożywić wyświetlanie tej siatki, ponieważ wszystkie pojedyncze prostokąty "latają" do siatki poza ekranem. Tak więc prostokąty po lewej leją od lewej, te po prawej od prawej itd.

Używam przejść CSS3 i podczas lotu z góry lub z lewej działa idealnie, po prostu używam ujemnych marginesów do ustaw je na ekranie, a następnie animuj, aby zmienić na lewy margines (lub margines-górny) = 0 (np. pozycja prawidłowa/prawidłowa).

To wydaje się być bardziej sensowne niż używanie transformacji, ale proszę poprawić mnie, jeśli uważasz, że istnieje powód, dla którego transformacje będą działały/działają lepiej z jakiegokolwiek powodu?

Jednak to oczywiście nie zadziała, jeśli chodzi o margines prawy/marżowy, więc chciałem sprawdzić, czy ktoś może zasugerować, jaki jest najlepszy sposób na osiągnięcie tego od prawej i od dołu? Mogę sprawić, że rodzic się przepełni: ukryje i ożywi lewe/górne pozycje, które będą miały ten sam efekt, ale chciałem sprawdzić, czy istnieje ogólne rozwiązanie równoważne ujemnym marginesom, aby uniknąć potrzeby oddzielnych reguł/pozycji dla każdego wyłączonego i na ekranie wersja? np. przy użyciu ujemnych marginesów mogę zastosować ten sam ujemny margines do wszystkich pól, które wlatują z tej samej strony bez żadnego określonego elementu (ale jeśli animuję górną/lewą stronę, każdy element będzie potrzebował swojej własnej pozycji "poza ekranem" do ostatecznej pozycji, więc leci z odpowiedniego miejsca).

Alternatywnie, jeśli istnieje lepszy sposób w ogóle (CSS3 jest w porządku!), To bardzo chciałbym to usłyszeć!

Odpowiedz

20

Nie animuj z marginesami, zawsze animuj z transformacjami, to jest ich przeznaczenie. Oto wielki artykuł na ten temat od Paul Irish

Dlaczego ruchome elementy z translate() jest lepsze http://paulirish.com/2012/why-moving-elements-with-translate-is-better-than-posabs-topleft/

Zastosowanie overflow-x: ukryty ukryć div pochodzących z prawej strony.Oto skrzypce, które pokazałem, jak animować z transformacją bez określania wartości pikseli;

http://jsfiddle.net/P9GNS/3/

HTML

<div class="box-wrapper loading"><div class="box"></div></div> 
<div class="box-wrapper loading"><div class="box"></div></div> 
<div class="box-wrapper loading"><div class="box"></div></div> 
<div class="box-wrapper loading"><div class="box"></div></div> 
<div class="box-wrapper loading"><div class="box"></div></div> 
<div class="box-wrapper loading"><div class="box"></div></div> 

CSS

body { 
    overflow-x: hidden; 
} 


.box-wrapper { 
    -webkit-transition-duration: 600ms; 
    transition-duration: 600ms; 
} 


.box-wrapper.loading:nth-child(odd) { transform: translate(100%) } 
.box-wrapper.loading:nth-child(even) { transform: translate(-100%) } 


.box-wrapper:nth-child(odd) .box { background: orange } 
.box-wrapper:nth-child(even) .box { background: red } 


.box { 
    margin: auto; 
    width: 100px; 
    height: 100px; 
} 

JAVASCRIPT

$('.box-wrapper').each(function(index, element) { 

    setTimeout(function(){ 
     element.classList.remove('loading'); 
    }, index * 600); 

}); 
+0

Wielkie dzięki Michael, to jest idealne, moje złe, że nie próbuję używać transformacji jako pierwszej, która ma dużo więcej sensu i działa dokładnie tak, jak potrzeba. Dzięki jeszcze raz! – deshg

+0

Po prostu pytanie uzupełniające, to działa przy użyciu 100% transformacji, gdy owijki zajmują całą dostępną przestrzeń, ale próbuję przesunąć divs do innego elementu div, który zajmuje tylko część widoku. Oznacza to, że jeśli użyjesz 100%, nie pojawi się on poza ekranem (i nie mogę użyć przelewu ukrytego w pojemniku div, w przeciwnym razie nie będą latać z poza ekranem). Jaki jest najlepszy sposób, aby sobie z tym poradzić? Mogę oczywiście użyć transformacji 10000% lub podobnej, aby zapewnić, że jest poza ekranem (aby umożliwić wyświetlanie dużych ekranów), ale to nie wydaje się być właściwym sposobem radzenia sobie z nim? Dzięki! – deshg

+0

Możesz podać wartość piksela zamiast wartości procentowej. Musiałbym to zobaczyć, ponieważ to naprawdę zależy od tego, jak to wszystko wygląda. – Michael

2

Zazwyczaj transform: translate... zapewnia lepszą wydajność w większości przeglądarek, ponieważ próbują renderować animację za pomocą GPU.

Możesz sprawdzić te wyniki z jsperf.

W każdym razie innym dobrym rozwiązaniem (bez javascript) byłoby dołączenie animacji całkowicie w CSS z właściwością @keyframes i animation:.

Więcej informacji na ten temat można znaleźć pod numerem this article.

Z wytycznych można przeczytać

Zastosowanie CSS animacji klatka kluczowa lub CSS przejścia, jeśli w ogóle możliwe. Przeglądarka może zoptymalizować malowanie i komponowanie w tym czasie.

+0

Dzięki za szybką odpowiedź, chociaż jestem lekko zdezorientowany wytyczne mówią „U se animacja klatek kluczowych CSS lub przejścia CSS "ale czy transformacja daje lepszą wydajność? Przypuszczalnie jeśli używam klatek kluczowych lub transformacji, chociaż nadal mam ten sam problem z animowaniem pozycji górnych/lewych, a zatem muszę mieć ustawione pozycje na ekranie i poza nim dla każdego prostokąta (zamiast ogólnego marginesu dla wielu prostokątów)? Może to jedyny sposób, ale chciałem sprawdzić, czy istnieje bardziej ogólna alternatywa? Wielkie dzięki – deshg

+0

Próbowałem dać ci szybki jsbin z pożądanym efektem http://jsbin.com/qozinoqu/1/ – drinchev

+0

Dziękuję bardzo drinchev, to ma sens i to moja wina, że ​​nie próbuję transformacji. Teraz rozumiem! Dzięki :) – deshg

Powiązane problemy