이번에는 JS 다중 객체 이동 구현 방법을 알려드리겠습니다. JS 다중 객체 이동 구현 시 주의 사항은 무엇인가요?
기본 단계
1. getElementsByTagName을 통해 여러 개체에 의해 이동할 요소를 얻습니다. 2. 그런 다음 for 루프가 요소를 순회하고 이벤트를 추가합니다.
3. 두 개의 매개 변수, "모션을 수행하는" 현재 요소와 목표값 목표
주의: 다중 객체 모션에서는 모든 것을 공유할 수 없습니다.
<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>
질문:
이동 속도가 상대적으로 빠르면 일부 리가 원래 상태로 돌아가지 못하고 중간에 갇히게 됩니다.모든 리가 타이머를 공유하기 때문입니다. 마우스가 첫 번째 li로 이동하면 startMove가 호출되어 타이머가 시작됩니다. 마우스가 li을 제거하면 li이 중간에 도달하면 타이머도 시작되어 li로 이동해야 합니다. 두 번째 li.첫 번째 타이머가 지워지고 이때 첫 번째 li가 중간에 멈춥니다.
이 문제를 해결하세요. 각 li에 변경 사항을 제어할 수 있는 자체 타이머가 있게 하세요. for 루프 중에 각 li
liTags[i].timer = null;// 给每个li都添加一个timer
에 대해 자체 타이머를 정의하세요. 그러면 starMove에서 매번 사용하는 타이머는 현재 li의 것이기 때문에 서로 간섭이 없을 것입니다. 여기의 이전 타이머는
(현재 개체의 자체 타이머)로 변경되었습니다. 여기에는 문제가 없습니다. 전체 코드는 다음과 같습니다:obj.timer
스타일 추가: <style> ul{list-style: none;} ul li{ margin: 10px; width: 200px;height: 50px; background: lightblue; } </style>
JS 코드 완성
<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>
이 기사의 사례를 읽은 후 방법을 마스터했다고 생각합니다. 더 흥미로운 정보를 보려면 PHP 중국어 웹사이트의 다른 관련 기사를 주목하세요. !
추천 자료:
기록 모드에서 새로 고칠 때 반사 없이 vue 경로 렌더링 페이지를 처리하는 방법vue.js 원활한 스크롤 효과를 얻기 위한 자세한 단계
위 내용은 JS에서 다중 객체 모션을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!