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('li'); // 第一步 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+'px'; } },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 milieuC'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
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 :
<body> <ul> <li></li> <li></li> <li></li> <li></li> </ul> </body>
<style> ul{list-style: none;} ul li{ margin: 10px; width: 200px;height: 50px; background: lightblue; } </style>
<script> window.onload = function(){ var liTags = document.getElementsByTagName('li'); 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+'px'; } },30); } </script>
<script> window.onload = function () { var aImgs = document.getElementsByTagName('img'); 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 = 'alpha(opacity:'+obj.alpha+')'; } },30); } </script>
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!