Ce que j'essaie essentiellement de faire, c'est de donner une animation CSS à un élément lorsqu'il gagne une classe, puis de l'inverser lorsque je supprime la classe sans la lire lorsque le DOM affiche.
Violon ici: http://jsfiddle.net/bmh5g/
Comme vous pouvez le voir dans le violon, lorsque vous passez le bouton "Survolez-moi", #item
bascule. Lorsque vous cliquez avec le bouton de survol, #item
disparaît. Je veux que #item
retourne en arrière (idéalement, en utilisant la même animation mais en sens inverse). Est-ce possible?
HTML:
<div id='trigger'>Hover Me</div>
<div id='item'></div>
CSS:
#item
{
position: relative;
height: 100px;
width: 100px;
background: red;
-webkit-transform: perspective(350px) rotateX(-90deg);
transform: perspective(350px) rotateX(-90deg);
-webkit-transform-Origin: 50% 0%;
transform-Origin: 50% 0%;
}
#item.flipped
{
animation: flipper 0.7s;
animation-fill-mode: forwards;
-webkit-animation: flipper 0.7s;
-webkit-animation-fill-mode: forwards;
}
@keyframes flipper
{
0% { transform: perspective(350px) rotateX(-90deg); }
33% { transform: perspective(350px) rotateX(0deg); }
66% { transform: perspective(350px) rotateX(10deg); }
100% { transform: perspective(350px) rotateX(0deg); }
}
@-webkit-keyframes flipper
{
0% { -webkit-transform: perspective(350px) rotateX(-90deg); }
33% { -webkit-transform: perspective(350px) rotateX(0deg); }
66% { -webkit-transform: perspective(350px) rotateX(10deg); }
100% { -webkit-transform: perspective(350px) rotateX(0deg); }
}
Javascript:
$('#trigger').on({
mouseenter: function(){
$('#item').addClass('flipped');
},
mouseleave: function(){
$('#item').removeClass('flipped');
}
})
Je voudrais que le #item
commence par être masqué avec l'animation inverse par défaut. Ajoutez ensuite la classe pour lui donner l'animation et affichez le #item
. http://jsfiddle.net/bmh5g/12/
jQuery
$('#trigger').on({
mouseenter: function(){
$('#item').show();
$('#item').addClass('flipped');
},
mouseleave: function(){
$('#item').removeClass('flipped');
}
});
CSS
#item
{
position: relative;
height: 100px;
width: 100px;
background: red;
display: none;
-webkit-transform: perspective(350px) rotateX(-90deg);
transform: perspective(350px) rotateX(-90deg);
-webkit-transform-Origin: 50% 0%;
transform-Origin: 50% 0%;
animation: flipperUp 0.7s;
animation-fill-mode: forwards;
-webkit-animation: flipperUp 0.7s;
-webkit-animation-fill-mode: forwards;
}
Une autre approche, plutôt que d'utiliser display: none
, consiste à supprimer l'animation inversée avec une classe lors du chargement de la page, puis à supprimer cette classe avec le même événement que l'application normale (par exemple: flipper). Comme si ( http://jsfiddle.net/astrotim/d7omcbrz/1/ ):
CSS - en plus de l'image clé flipperUp publiée par Blake ci-dessus
#item.no-animation
{
animation: none;
}
jQuery
$('#trigger').on({
mouseenter: function(){
$('#item').removeClass('no-animation');
$('#item').addClass('flipped');
},
mouseleave: function(){
$('#item').removeClass('flipped');
}
})
$(selector)
Donc, vous faites à peu près cette var elements = $(selector);
pour mettre en cache.
Pourquoi?! Parce que si vous utilisez le code dans les réponses sur cette page tel quel, vous demanderez à chaque fois au DOM cette même collection d’éléments ($('#item')
). La lecture DOM est une opération coûteuse.
Par exemple, la réponse acceptée ressemblerait à quelque chose comme ceci:
var item = $('#item');
$('#trigger').on({
mouseenter: function(){
item.show();
item.addClass('flipped');
},
mouseleave: function(){
item.removeClass('flipped');
}
});
Je sais que vous avez demandé un exemple d'animation CSS, mais pour l'animation que vous souhaitiez créer (une carte ouverte), vous pouvez facilement l'obtenir à l'aide de transitions CSS:
#item {
width: 70px;
height: 70px;
background-color: black;
line-height: 1;
color: white;
}
#item+div {
width: 70px;
height: 100px;
background-color: blue;
transform: perspective(250px) rotateX(-90deg);
transform-Origin: 50% 0%;
transition: transform .25s ease-in-out
}
#item:hover+div {
transform: perspective(250px) rotateX(0);
}
<div id="item"></div>
<div></div>
Son animation en utilisant css donc pour le faire s'animer, vous devez créer une classe, disons .item-up qui effectue la transformation dans le sens opposé afin que vous supprimiez la classe précédente et ajoutiez la classe item-up et qui devrait animer ça va.
Je voudrais vous écrire un violon pour cela, mais je ne connais pas assez bien la syntaxe.
Fondamentalement, quand vous aurez besoin de:
@keyframes flipper
@keyframes flipper-up //This does the opposite of flipper
et
$('#trigger').on({
mouseenter: function(){
$('#item').removeClass('flipped-up');
$('#item').addClass('flipped');
},
mouseleave: function(){
$('#item').removeClass('flipped');
$('#item').addClass('flipped-up');
}
})
jsfiddle.net/bmh5g/3 avec l'aimable autorisation de Jake
Solution CSS de MDN et presque supportée par tous les navigateurs
.animation (animationName 10s facilité infinie alternative alternée à la fois en cours d'exécution;)