2017-02-10 1 views
0

Je veux faire les choses suivantes:transition CSS position ne fonctionne pas du tout lorsqu'il est réglé avec JavaScript

  1. montrent un élément div;
  2. le déplacer dans une position initiale;
  3. définir les propriétés de transition;
  4. déplacez-le vers la position cible en utilisant la transition CSS.

Un exemple minimal:

function bla() { 
 
    /* 
 
    var obj = $('#box'); 
 
    obj.css("left", "200px"); 
 
    obj.css("display", "initial"); 
 
    obj.addClass("trans"); 
 
    obj.css("left", "500px"); 
 
    */ 
 

 
    var elem = document.getElementById('box'); 
 
    elem.style.left = "200px"; 
 
    elem.style.display = "initial"; 
 
    elem.className = "box trans"; 
 
    elem.style.left = "500px"; 
 
}
#btn { 
 
    position: fixed; 
 
    top: 60px; 
 
    left: 0px; 
 
    width: 50px; 
 
    height: 50px; 
 
    background-color: #FEDCBA; 
 
} 
 
.box { 
 
    display: none; 
 
    position: fixed; 
 
    top: 0px; 
 
    left: 0px; 
 
    width: 50px; 
 
    height: 50px; 
 
    background-color: #ABCDEF; 
 
} 
 
.box.trans { 
 
    -webkit-transition: left 2s; 
 
    -moz-transition: left 2s; 
 
    transition: left 2s; 
 
}
<div id="box" class="box"></div> 
 
<div id="btn" onclick="bla()">click here</div>

JSFiddle.

Cela ne fonctionne pas du tout. Qu'est-ce qui ne va pas?

Si je mets l'élément initialement visible, je reçois une transition en douceur à partir de l'origine left:0 qui est tout à fait étrange parce que je cède elem.style.left = "200px";avant ajouter réellement les propriétés de transition ...

+0

Si vous utilisez CSS transforme, ne serait-il plus facile de coller vos nouveaux styles dans une classe et simplement ajouter cette classe? – DBS

+0

Malheureusement, je ne peux pas parce que je dois caluler la position. – DyingSoul

Répondre

0

Je ne peux pas expliquer Pourquoi. Peut-être que quelqu'un pourrait, je serais curieux aussi, mais avec un travail de temporisation.

setTimeout(function(){ 
    elem.style.left = "500px"; 
},1); 

Il est probablement trop rapide assignant des propriétés gauche 500 et la transition pour enregistrer l'ancien emplacement 200?

https://jsfiddle.net/StepBaro/s82rj48q/2/

+0

Oui, j'ai pensé que cela pourrait être une chose de synchronisation .. mais cela n'a pas de sens parce que cela viole l'ordre des appels. Quand je mets la position à 200 alors il devrait définir la position. Il ne faut pas attendre avec le changement après les prochaines instructions .. – DyingSoul

+0

Evidemment les instructions fonctionnent simultanément. J'ai essayé de remplacer le timeout par une très longue boucle, et ça ne marche pas, je pense que ça ne rafraîchit pas le dom, je ne sais pas si vous avez d'autres solutions. Ou jquery, mais c'est la même logique https://jsfiddle.net/StepBaro/s82rj48q/9/ – Baro

0

Il est parce que vous avez le div caché, il faut d'abord l'afficher, puis ajouter la transition, c'est pourquoi il a besoin du retard.

+0

Oui c'est pourquoi j'appelle 'elem.style.display =" initial ";' d'abord l'afficher. Je change même de position après l'avoir affichée. – DyingSoul

+0

Oui, mais vous faites les deux choses en même temps –

+0

Vous pouvez lier l'animation au changement d'affichage. Une fois que vous l'affichez, lancez l'animation.Mais vous devez absolument l'afficher d'abord, sinon il fera les deux choses en même temps. –

0

Vous devriez éviter d'utiliser le style en javascript, il suffit de changer de classe les années mettent toute votre animation dans votre fichier css.

Vous ne pouvez pas mettre transition avec display: none;, vous devez utiliser opacity: 0; à la place.

function bla() 
 
{ 
 
\t var obj = $('#box'); 
 
\t obj.toggleClass("trans"); 
 
}
#btn 
 
{ 
 
    position:fixed; 
 
    top:60px; 
 
    left:0px; 
 
    width:50px; 
 
    height:50px; 
 
    background-color:#FEDCBA; 
 
} 
 

 
.box 
 
{ 
 
    opacity: 0; 
 
    position:fixed; 
 
    top:0px; 
 
    left:0px; 
 
    width:50px; 
 
    height:50px; 
 
    background-color:#ABCDEF; 
 
    -webkit-transition: transform 2s,opacity 2s; 
 
    transition: transform 2s,opacity 2s; 
 
} 
 

 
.box.trans 
 
{ 
 
    opacity: 1; 
 
    -ms-transform: translate(500px,0); /* IE 9 */ 
 
    -webkit-transform: translate(500px,0); /* Safari */ 
 
    transform: translate(500px,0); 
 
\t 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div id="box" class="box"> 
 
</div> 
 
<div id="btn" onclick="bla()"> 
 
click here 
 
</div>