Maison  >  Article  >  interface Web  >  Partager des exemples de mouvements multi-objets à l'aide de JS

Partager des exemples de mouvements multi-objets à l'aide de JS

小云云
小云云original
2018-01-24 09:02:111263parcourir

Cet article présente principalement la méthode JS pour réaliser un mouvement multi-objets. Il analyse en détail les principes et les techniques de fonctionnement associées du javascript pour réaliser un mouvement multi-objets sous forme d'exemples. J'espère que cela pourra aider tout le monde.

Étapes de base

1 Obtenez les éléments à déplacer par plusieurs objets via getElementsByTagName
2. . Ensuite, la boucle for parcourt les éléments et ajoute des événements
3 Définissez la fonction startMove, qui nécessite deux paramètres, l'élément "en mouvement" actuel et la valeur cible target

Remarque : En mouvement multi-objets, tout ne peut pas être partagé


<script>
    window.onload = function(){
      var liTags = document.getElementsByTagName(&#39;li&#39;); // 第一步
      for(var i=0;i<liTags.length;i++){ // 第二步
         liTags[i].onmouseover = function () {
         startMove(this,400);
         }
         liTags[i].onmouseout = function () {
         startMove(this,200);
         }
      }
    }
    var timer = null;
    function startMove(obj,iTarget) { // 第三步,2个参数
      clearInterval(timer);
      timer = setInterval(function () {
        var iSpeed = (iTarget - obj.offsetWidth)/10;
        iSpeed = iSpeed>0 ?Math.ceil(iSpeed):Math.floor(iSpeed);// 缓冲运动注意取整处理
        if(obj.offsetWidth == iTarget){
          clearInterval(timer);
        }else{
          obj.style.width = obj.offsetWidth+iSpeed+&#39;px&#39;;
        }
      },30);
    }
</script>

Problème :

Lorsque la vitesse d'entrée et de sortie est relativement rapide, il apparaîtra que certains Li ne peuvent pas revenir à leur état d'origine et sont bloqués au milieu

C'est parce que tous les Li partagent une minuterie Lorsque la souris entre dans le premier Quand li, appelez startMove pour démarrer un chronomètre ; lorsque la souris supprime li, vous devez également démarrer un chronomètre pour ramener li à sa position d'origine. Lorsque li atteint la moitié du chemin, nous passons au second. li, et la minuterie sera effacée en premier. À ce moment-là, le premier li est resté bloqué à mi-chemin.

Résolvez ce problème :

Laissez chaque li avoir son propre timer pour contrôler ses modifications et définissez chaque li pendant la boucle for. Un de vos propres timers


Ensuite, la minuterie utilisée à chaque fois dans starMove est celle du courant actuel, il n'y aura donc aucune interférence les unes avec les autres.
liTags[i].timer = null;// 给每个li都添加一个timer

Le timer précédent ici a été remplacé par

(le timer de l'objet actuel) ; il n'y a pas de problème ici ;

obj.timer Le code complet est le suivant :


Ajouter un style :
<body>
<ul>
  <li></li>
  <li></li>
  <li></li>
  <li></li>
</ul>
</body>


Code js complet
<style>
    ul{list-style: none;}
    ul li{
      margin: 10px;
      width: 200px;height: 50px;
      background: lightblue;
    }
</style>


Regardons ensuite un exemple : mouvement multi-objets - changement de transparence
<script>
    window.onload = function(){
      var liTags = document.getElementsByTagName(&#39;li&#39;);
      for(var i=0;i<liTags.length;i++){
         liTags[i].timer = null;// 给每个li都添加一个timer
         liTags[i].onmouseover = function () {
         startMove(this,400);
         }
         liTags[i].onmouseout = function () {
         startMove(this,200);
         }
      }
    }
    function startMove(obj,iTarget) {
      clearInterval(obj.timer);
      obj.timer = setInterval(function () {
        var iSpeed = (iTarget - obj.offsetWidth)/10;
        iSpeed = iSpeed>0 ?Math.ceil(iSpeed):Math.floor(iSpeed);
        if(obj.offsetWidth == iTarget){
          clearInterval(obj.timer);
        }else{
          obj.style.width = obj.offsetWidth+iSpeed+&#39;px&#39;;
        }
      },30);
    }
</script>


Recommandations associées :
<script>
  window.onload = function () {
    var aImgs = document.getElementsByTagName(&#39;img&#39;);
    for(var i=0;i<aImgs.length;i++){
      aImgs[i].timer = null;
      aImgs[i].alpha = 100; // 把公用的alpha改成每个img对象都有的属性
      aImgs[i].onmouseover = function () {
        startMove(this,30);
      }
      aImgs[i].onmouseout = function () {
        startMove(this,100);
      }
    }
  }
  // var alpha = 100; 这里alpha在多物体运动里 不能公用
  function startMove(obj,iTarget) {
    clearInterval(obj.timer);
    var iSpeed = (iTarget - obj.alpha)/10;
      iSpeed = iSpeed>0 ? Math.ceil(iSpeed): Math.floor(iSpeed);
    obj.timer = setInterval(function(){
      if(obj.alpha == iTarget){
        clearInterval(obj.timer);
      }else{
        obj.alpha += iSpeed;
        obj.style.opacity =obj.alpha/100;
        obj.style.filter = &#39;alpha(opacity:&#39;+obj.alpha+&#39;)&#39;;
      }
    },30);
  }
</script>

Analyse des méthodes d'implémentation de mouvement multi-objets JavaScript_compétences Javascript

Explication d'exemples de mouvement uniforme basé sur js

Deux méthodes JS pour réaliser le mouvement de trajectoire parabolique d'une petite balle

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn