>  기사  >  웹 프론트엔드  >  JS에서 다중 객체 모션을 구현하는 방법

JS에서 다중 객체 모션을 구현하는 방법

php中世界最好的语言
php中世界最好的语言원래의
2018-04-13 10:52:391411검색

이번에는 JS 다중 객체 이동 구현 방법을 알려드리겠습니다. JS 다중 객체 이동 구현 시 주의 사항은 무엇인가요?

기본 단계

1. getElementsByTagName을 통해 여러 개체에 의해 이동할 요소를 얻습니다. 2. 그런 다음 for 루프가 요소를 순회하고 이벤트를 추가합니다.
3. 두 개의 매개 변수, "모션을 수행하는" 현재 요소와 목표값 목표

주의: 다중 객체 모션에서는 모든 것을 공유할 수 없습니다.

<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>

질문:

이동 속도가 상대적으로 빠르면 일부 리가 원래 상태로 돌아가지 못하고 중간에 갇히게 됩니다.

모든 리가 타이머를 공유하기 때문입니다. 마우스가 첫 번째 li로 이동하면 startMove가 호출되어 타이머가 시작됩니다. 마우스가 li을 제거하면 li이 중간에 도달하면 타이머도 시작되어 li로 이동해야 합니다. 두 번째 li.첫 번째 타이머가 지워지고 이때 첫 번째 li가 중간에 멈춥니다.

이 문제를 해결하세요. JS에서 다중 객체 모션을 구현하는 방법각 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(&#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>

다음으로 예를 살펴보겠습니다. 다중 객체 모션 - 투명도 변경

<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>

이 기사의 사례를 읽은 후 방법을 마스터했다고 생각합니다. 더 흥미로운 정보를 보려면 PHP 중국어 웹사이트의 다른 관련 기사를 주목하세요. !

추천 자료:

기록 모드에서 새로 고칠 때 반사 없이 vue 경로 렌더링 페이지를 처리하는 방법

vue.js 원활한 스크롤 효과를 얻기 위한 자세한 단계

위 내용은 JS에서 다중 객체 모션을 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.