2014-06-29 11 views
5

Buduję aplikację AngularJS, która pokazuje i ukrywa element, przenosząc jego krycie. Element jest również obracany poprzez zastosowanie animacji klatki kluczowej CSS. Problemem, który mam, jest przejście lub animacja zacina się.Przejścia CSS zacinają się po zastosowaniu do elementu z animacją CSS

Gdy element ma krycie równe 1, a przejście zanika go do 0, element pojawia się, aby powrócić do kilku klatek. Jest to lepiej zademonstrowane w GIF. Możesz zobaczyć, jak cofa się tuż przed zmianą krycia.

To jest mój CSS.

.square { 
    width: 100px; 
    height: 100px; 
    margin: 50px; 
    background: black; 
} 

.appear.ng-hide-add { 
    -webkit-transition: opacity 300ms linear; 
    opacity: 1; 
} 

.appear.ng-hide-add.ng-hide-add-active { 
    opacity: 0; 
} 

.appear.ng-hide-remove { 
    -webkit-transition: opacity 300ms linear; 
    opacity: 0; 
} 

.appear.ng-hide-remove.ng-hide-remove-active { 
    opacity: 1; 
} 

@-webkit-keyframes rotate { 
    from { 
    -webkit-transform: rotate(0deg); 
    } 

    to { 
    -webkit-transform: rotate(360deg); 
    } 
} 

.rotate { 
    -webkit-animation: rotate 1.5s infinite linear; 
} 

To jest mój HTML.

<div ng-app="app" ng-init="show = true"> 
    <p>Toggle the opacity of the square. Sometimes the rotation is interrupted when the opacity transitions from 1 to 0.</p> 
    <button ng-click="show =!show">Toggle</button> 
    <div class="square appear rotate" ng-show="show"></div> 
</div> 

Możesz odtwarzać całość w tym codepen. Mam nadzieję, że ktoś wskaże mi właściwy kierunek.

+0

Próbowałem (jestem pewien, że zrobiłeś to samo) owijając kwadrat w innym elemencie i ukrywając/pokazując opakowanie, ale to nie wydaje się pomagać: http://codepen.io/anon/pen/DctGj –

+0

Tak, to też nie zadziałało. Skończyło się na twojej odpowiedzi. http://stackoverflow.com/a/24474564/106997 –

Odpowiedz

1

Oto jedno obejście tylko dla zabawy. Nieco mniej brzydki niż pierwszy, który zasugerowałem. Zmienić kolor tła pudełko krycie: http://codepen.io/anon/pen/DpuEh

HTML:

<div ng-app="app" ng-init="show = true"> 
    <button ng-click="show = !show">Toggle</button> 
    <div class="square appear rotate" ng-class="{'hidden': !show}"></div> 
</div> 

CSS:

.square { 
    width: 100px; 
    height: 100px; 
    margin: 50px; 
    -webkit-transition: background 300ms linear; 
    background: black; 
} 

.square.hidden { 
    background: rgba(0, 0, 0, 0); 
} 

Używam rgba aby ustawić przezroczystość tła. Samo ustawienie tła na white również działałoby w tym prostym przypadku.

+0

Dzięki Henrik. Zmiana na akceptowalną odpowiedź na pytanie, ponieważ jest to 100-procentowe rozwiązanie CSS. Jeśli możesz wykorzystać jQuery, możesz rozważyć zawijanie '.animate'. Jest gładszy po raz pierwszy i całkowicie gładki po tym czasie. Zobacz https://gist.github.com/tatey/3f1933d2d6d8b4dbe801 –

1

Jest to oczywiście błąd WebKit. Nie jest to oczywiście sposób zachowania CSS i zachowuje się tak, jak powinien, w Firefoksie, jeśli usuniesz prefiksy dostawcy. Zauważysz, że animacja zostanie zresetowana po zastosowaniu dodatkowych animacji/przejść. Jest to podobne do znanego błędu, który został niedawno naprawiony, w którym wielokrotne przejścia CSS stosowane w różnym czasie powodowały flashowanie układu. Zaleciłbym zgłoszenie błędu zespołowi WebKit, aby można go było naprawić.

+0

To tak naprawdę nie odpowiada na pytanie. Jeśli masz inne pytanie, możesz je zadać, klikając [Zadaj pytanie] (http://stackoverflow.com/questions/ask). Możesz również [dodać nagrodę] (http://stackoverflow.com/help/privileges/set-bounties), aby zwrócić większą uwagę na to pytanie. – ccjmne

+1

@ccjmne To nie jest poprawka nie, ale próbuję wskazać mu właściwy kierunek, o co prosił. Jest to oczywiście błąd przeglądarki i powinien zostać zgłoszony zespołowi WebKit. –

+0

Nie krytykuję jego pytania ani nie pytam o wyjaśnienia, mówię mu, że nie robi nic złego i że jest to wyraźnie błąd podobny do znanych błędów, które powinny zostać zgłoszone. Wyjaśniłem swoją odpowiedź w przypadku, który nie był jasny. –

0

Chciałbym rozważyć użycie translate3D na transformacji, aby wymusić akcelerację sprzętową.

-webkit-transform: translate3d(0,0,0); 

Wykorzystuje akcelerację sprzętową (GPU) dla przejść CSS.

+0

Dzięki za sugestię, ale to nie zadziałało. –

1

Ugly obejście, które może, ale nie musi być odpowiednie, w zależności od sytuacji: zamiast ukrywać element (shows the bug) lub pojemnik (also shows the bug), można zanikać na nim element w tle.

HTML:

<div ng-app="app" ng-init="show = false"> 
    <button ng-click="show =!show">Toggle</button> 
    <div class="appear" ng-show="show"></div> 
    <div class="square rotate"></div> 
</div> 

CSS:

.appear { 
    background: white; 
    width: 200px; 
    height: 200px; 
    position: absolute; 
    top: 30px; 
    left: 0; 
    z-index: 2; 
} 

Oczywiście może trzeba bardziej wyrafinowane CSS bardziej wyrafinowany układ, ale mam nadzieję, że masz pomysł.

CodePen: http://codepen.io/anon/pen/IwBHj

+0

Brzydki, ale geniusz. Na szczęście jest w tej chwili w jednym szablonie. Zastanowiłbym się nad zawinięciem tego w dyrektywie, jeśli będę musiał go ponownie użyć. Dzięki! –

Powiązane problemy