Cliquez sur l'image dans l'extrait (agrandir la page entière) pour exécuter la transformation et regardez de plus près dans le coin inférieur droit lorsque la carte animée passe derrière, vous la verrez se chevaucher légèrement alors qu'elle ne devrait pas. Cela se produit lorsque j'applique z-index
sur chaque boîte div en CSS. Si je supprime z-index
, il n'y a pas de flash, mais j'ai besoin d'index z sur mes divs box. Sinon, je ne peux pas faire en sorte que la pile se comporte de la sorte lorsque je les mélange (sauf si je change l'ordre DOM que je ne veux pas). J'ai essayé avec un peu de backface-visibilité
en CSS mais sans chance. Comment puis-je me débarrasser de ce flash?
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <div class="box" id="a1"> <img src="http://interactivepixel.net/tst/01.jpg" alt="" /> </div> <div class="box" id="a2"> <img src="http://interactivepixel.net/tst/02.jpg" alt="" /> </div>
.box { position: absolute; width: 250px; padding: 10px; background: #fff; box-shadow: 1px 1px 5px #484848; left: 0; top: 0; height: 370px; box-sizing: content-box; transition-duration: 0.5s; transition-timing-function: ease; backface-visibility: hidden; } .box img { display: block; position: relative; backface-visibility: hidden; user-select: none; } #a1 { z-index: 0; transform: rotate(-4.5884deg); } #a2 { z-index: 1; transform: rotate(7deg); } .t { transform: translateX(370px) rotate(23deg) !important; } .t2 { transform: translateX(0) rotate(-7deg) !important; }
$('body').on('click', function() { var box = $('#a2') box.one("transitionend", function() { box.css("zIndex", -1).one("transitionend", function() { }).removeClass('t').addClass('t2') }).addClass('t') })
Cela se produit dans tous les navigateurs d'après ce que je peux voir.
4 Réponses :
Je pense que c'est simplement un problème d'ordre.
Placez simplement le .css ("zIndex", -1)
à côté du .addClass ('t')
:
de cette façon, le flash ne se produit pas puisque le z-index est appliqué avant la traduction arrière
$('body').on('click', function() { var box = $('#a2') box.one("transitionend", function() { box.removeClass('t').addClass('t2') }).css("zIndex", -1).addClass('t') })
Le correctif est en fait simple - ajoutez simplement Voir la démo ci-dessous: Pourquoi le scintillement? Notez que Lorsqu'elles sont animées, les valeurs du type de données sont interpolées
en utilisant des étapes complètes et discrètes. Le calcul est fait comme s'ils étaient
nombres réels à virgule flottante; la valeur discrète est obtenue en utilisant la
fonction de plancher. La vitesse de l'interpolation est déterminée par le
fonction de minutage associée à l'animation. Voir un exemple de comment vous pouvez animer C'est pourquoi vous avez le scintillement dans votre animation. transition-property: transform
parce que est ce que vous voulez transformer em> ( transition-property: all
est la valeur par défaut et z-index
est également transitioned ). <div class="container">
<div class="box"></div>
<div></div>
<div></div>
</div>
div {
position: absolute;
border: 1px solid;
}
.container div {
width: 100px;
height: 100px;
}
.container .box {
background-color: cadetblue;
z-index: 1;
animation: stack 5s infinite linear;
}
.box + div {
top: 10px;
left: 10px;
z-index: 1;
background-color: lightblue;
}
.box + div + div {
top: 20px;
left: 20px;
z-index: 2;
background-color: aliceblue;
}
@keyframes stack {
50% {
z-index: 3;
}
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<div class="box" id="a1">
<img src="http://interactivepixel.net/tst/01.jpg" alt="" />
</div>
<div class="box" id="a2">
<img src="http://interactivepixel.net/tst/02.jpg" alt="" />
</div>
z-index
est un entier et qu'il ne fait pas grand-chose sens de la transition - le type d'animation est entier selon MDN
:
z-index
:.box {
position: absolute;
width: 250px;
padding: 10px;
background: #fff;
box-shadow: 1px 1px 5px #484848;
left: 0;
top: 0;
height: 370px;
box-sizing: content-box;
transition-duration: 0.5s;
transition-timing-function: ease;
backface-visibility: hidden;
transition-property: transform; /* added */
}
.box img {
display: block;
position: relative;
backface-visibility: hidden;
user-select: none;
}
#a1 {
z-index: 0;
transform: rotate(-4.5884deg);
}
#a2 {
z-index: 1;
transform: rotate(7deg);
}
.t {
transform: translateX(370px) rotate(23deg) !important;
}
.t2 {
transform: translateX(0) rotate(-7deg) !important;
}
$('body').on('click', function() {
var box = $('#a2')
box.one("transitionend", function() {
box.css("zIndex", -1).removeClass('t').addClass('t2')
}).addClass('t')
});
Je viens de mettre à jour votre code avec la mise à jour jQuery
. En fait, je déplace simplement votre script box.css ("zIndex", -1) .addClass ('t');
dans la méthode setTimeout
. Essayez ceci, je pense que cela résoudra votre problème. Merci
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <div class="box" id="a1"> <img src="http://interactivepixel.net/tst/01.jpg" alt="" /> </div> <div class="box" id="a2"> <img src="http://interactivepixel.net/tst/02.jpg" alt="" /> </div>
.box { position: absolute; width: 250px; padding: 10px; background: #fff; box-shadow: 1px 1px 5px #484848; left: 0; top: 0; height: 370px; box-sizing: content-box; transition-duration: 0.5s; transition-timing-function: ease; backface-visibility: hidden; } .box img { display: block; position: relative; backface-visibility: hidden; user-select: none; } #a1 { z-index: 0; transform: rotate(-4.5884deg); } #a2 { z-index: 1; transform: rotate(7deg); } .t { transform: translateX(370px) rotate(23deg) !important; } .t2 { transform: translateX(0) rotate(-7deg) !important; }
$('body').on('click', function() { var box = $('#a2') box.one("transitionend", function() { box.one("transitionend").addClass('t2'); }) setTimeout(function(){ box.css("zIndex", -1).addClass('t'); }) })
J'ai essayé d'augmenter le z-index de l'image suivante et cela fonctionne.
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <div class="box" id="a1"> <img src="http://interactivepixel.net/tst/01.jpg" alt="" /> </div> <div class="box" id="a2"> <img src="http://interactivepixel.net/tst/02.jpg" alt="" /> </div>
.box { position: absolute; width: 250px; padding: 10px; background: #fff; box-shadow: 1px 1px 5px #484848; left: 0; top: 0; height: 370px; box-sizing: content-box; transition-duration: 0.5s; transition-timing-function: ease; backface-visibility: hidden; } .box img { display: block; position: relative; backface-visibility: hidden; user-select: none; } #a1 { z-index: 0; transform: rotate(-4.5884deg); } #a2 { z-index: 1; transform: rotate(7deg); } .t { transform: translateX(370px) rotate(23deg) !important; } .t2 { transform: translateX(0) rotate(-7deg) !important; }
$('body').on('click', function() { var box = $('#a2') var i=0; box.one("transitionend", function() { // increase the z-index $("#a1").css("zIndex", 99); box.css("zIndex", -1).one("transitionend", function() { }).removeClass('t').addClass('t2') }).addClass('t') })
Il n'y a pas de flash dans l'extrait de code ci-dessus.
Développez l'extrait de code en plein écran et regardez de plus près dans le coin inférieur droit lorsque la carte animée passe derrière, vous verrez qu'elle se chevauche légèrement quand elle ne le devrait pas. Au moins en chrome.
Parlez-vous du z-index ne faisant pas la transition au bon moment?