2014-06-29 12 views
5

Sto costruendo un'applicazione AngularJS che mostra e nasconde un elemento spostando la sua opacità. L'elemento viene anche ruotato applicando un'animazione keyframe CSS. Il problema che sto affrontando è la transizione o l'animazione che balbetta.La transizione CSS viene interrotta dopo essere stata applicata all'elemento con animazione CSS

Quando l'elemento ha un'opacità pari a 1 e la transizione la sfuma a 0, l'elemento sembra tornare indietro di alcuni fotogrammi. Questo è meglio dimostrato in una GIF. Puoi vederlo saltare prima che cambi l'opacità.

Questo è il mio 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; 
} 

Questo è il mio codice 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> 

È possibile giocare con il tutto in questo codepen. Sperando che qualcuno possa indicarmi la giusta direzione.

+0

Ho provato (sono sicuro che l'hai fatto anche tu) avvolgendo il quadrato in un altro elemento e nascondendo/mostrando il wrapper, ma non sembra aiutare: http://codepen.io/anon/pen/DctGj –

+0

Sì, non ha funzionato neanche per me. Finito per andare con la tua risposta. http://stackoverflow.com/a/24474564/106997 –

risposta

1

Ecco uno soluzione più giusta per il gusto di farlo. Un po 'meno brutto del primo che ho suggerito. Modificare la casella colore di sfondo di opacità: 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); 
} 

sto usando rgba per impostare l'opacità di fondo. Anche l'impostazione dello sfondo su white avrebbe funzionato in questo semplice caso.

+0

Grazie Henrik. Cambiando questo alla risposta accettata per la domanda in quanto si tratta di una soluzione CSS al 100%. Se riesci a sfruttare jQuery, potresti prendere in considerazione la possibilità di inserire '.animate'. È più uniforme la prima volta e completamente liscia in seguito. Vedi https://gist.github.com/tatey/3f1933d2d6d8b4dbe801 –

1

Questo è evidentemente un bug di WebKit. Questo chiaramente non è come dovrebbe comportarsi il CSS, e si comporta come previsto in Firefox se si rimuovono i prefissi del venditore. Noterai che l'animazione si resetta quando vengono applicate animazioni/transizioni aggiuntive. Questo è simile a un bug noto che è stato recentemente risolto in cui più transizioni CSS applicate in momenti diversi causavano un layout flash. Consiglierei di segnalare il bug al team di WebKit in modo che possa essere riparato.

+0

Questo in realtà non risponde alla domanda. Se hai una domanda diversa, puoi richiederla facendo clic su [Invia domanda] (http://stackoverflow.com/questions/ask). Puoi anche [aggiungere una taglia] (http://stackoverflow.com/help/privileges/set-bounties) per attirare maggiormente l'attenzione su questa domanda. – ccjmne

+1

@ccjmne Non è una correzione, no, ma sto cercando di indicarlo nella giusta direzione, come ha chiesto. È chiaramente un bug del browser e dovrebbe essere segnalato al team di WebKit. –

+0

Non sto criticando la sua domanda o chiedendo chiarimenti, gli sto dicendo che non sta facendo nulla di sbagliato e che è chiaramente un bug, simile a bug conosciuti in passato, che dovrebbe essere segnalato. Ho chiarito la mia risposta nel caso in cui non fosse chiaro. –

0

Vorrei prendere in considerazione l'uso di translate3D sulla trasformazione per forzare l'accelerazione hardware.

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

Questo utilizza l'accelerazione hardware (GPU) per le transizioni CSS.

+0

Grazie per il suggerimento, ma non ha funzionato. –

1

Soluzione errata che può o non può essere adatta, a seconda della situazione: anziché nascondere l'elemento (shows the bug) o un contenitore (also shows the bug), è possibile dissolvenza in un elemento di sfondo su di esso.

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; 
} 

Ovviamente potrebbe essere necessario più sofisticati CSS per un layout più sofisticato, ma spero che si ottiene l'idea.

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

+0

Brutto, ma geniale. Per fortuna è contenuto in un modello al momento. Prenderò in considerazione l'idea di inserire questo in una direttiva se dovessi riutilizzarlo. Grazie! –