>  기사  >  웹 프론트엔드  >  js 등속운동을 기반으로 한 설명 예시

js 등속운동을 기반으로 한 설명 예시

小云云
小云云원래의
2018-01-15 13:51:251300검색

이 글에서는 주로 균일한 동작(사이드바, 페이드 인 및 페이드 아웃)을 기반으로 한 예시 설명을 제공합니다. 편집자님이 꽤 좋다고 생각하셔서 지금 공유하고 모두에게 참고용으로 드리도록 하겠습니다. 편집자를 따라 살펴보겠습니다. 모두에게 도움이 되기를 바랍니다.

JavaScript에서 요소(예: p)를 이동시키는 방법은 무엇입니까?

기본 스타일을 설정하고 p 위치를 확인하세요(물론 여백 변경을 사용하여 요소의 이동 효과를 만들 수도 있습니다).

<style>
    p {
      width: 100px;
      height: 100px;
      background: red;
      position: absolute;
      left: 0px;
    }
</style>

기본 구조:

   <input type="button" value="动起来"/>
   <p id="box"></p>

이 버튼을 클릭하면 다음을 수행해야 합니다. p 움직일 때, 실제로는 p의 왼쪽 값이 계속 변하도록 하는 것을 의미합니다. 그러면 p가 이동 효과를 가지게 됩니다. 먼저 왼쪽 값을 변경한 다음 계속 변경되도록 합니다

window.onload = function(){
    var oBtn = document.querySelector( "input" ),
      oBox = document.querySelector( '#box' );
    oBtn.onclick = function(){
      oBox.style.left = oBox.offsetLeft + 10 + 'px';
    }
  }

그런 다음 버튼을 클릭할 때마다 , p의 왼쪽 값은 원본에 10px를 추가합니다. 여기에서는 왼쪽에 10px를 더한 값을 얻기 위해 비인터라인 스타일을 얻는 방법을 사용할 수도 있습니다. 이 방법도 효과를 얻을 수 있습니다.

function css(obj, attr) {
  if (obj.currentStyle) {
    return obj.currentStyle[attr];
  } else {
    return getComputedStyle(obj, false)[attr];
  }
}
window.onload = function () {
  var oBtn = document.querySelector("input"),
    oBox = document.querySelector('#box');
  oBtn.onclick = function () {
    oBox.style.left = parseInt( css( oBox, 'left' ) ) + 10 + 'px';
  }
}

offsetLeft와 비인터라인 스타일 왼쪽 값을 얻는 것의 차이점은 무엇인가요?

offsetLeft에는 px 단위가 없지만 왼쪽에는 px 단위가 있습니다.

oBtn.onclick = function () {
    // alert( css( oBox, 'left' ) ); //0px
    alert( oBox.offsetLeft ); //0
  }

이제 p를 클릭하여 이동하면 계속 이동하게 놔두는데 어떻게 해야 할까요? 타이머 추가

  oBtn.onclick = function () {
    setInterval( function(){
      oBox.style.left = oBox.offsetLeft + 10 + 'px';
    }, 1000 / 16 );
  }

버튼을 클릭하면 p가 계속 왼쪽으로 움직입니다. 어떻게 하면 멈출 수 있을까요? 중지하려면 반드시 조건이 필요합니다. 예를 들어 500px에 도달하면 중지하도록 요청합니다

var timer = null;
  oBtn.onclick = function () {
    timer = setInterval( function(){
      if ( oBox.offsetLeft == 500 ) {
        clearInterval( timer );
      }else {
        oBox.style.left = oBox.offsetLeft + 10 + 'px';
      }
    }, 1000 / 16 );
  }

이렇게 하면 500px에서 p 중지를 만들 수 있습니다. 여기서 단계 크기를 10에서 7 또는 8로 변경하면 왜요? 500px의 판정조건은 건너뛰게 되기 때문에

0, 7, 14, 21....280, 287, 294, 301, ...490, 497, 504. 497부터 504까지는 500px를 건너뛰므로 p 멈출 수 없다면 어떻게 해야 할까요? 판정 조건을 수정하면 됩니다.

oBtn.onclick = function () {
  timer = setInterval( function(){
    if ( oBox.offsetLeft >= 500 ) {
      oBox.style.left = 500 + 'px';
      clearInterval( timer );
    }else {
      oBox.style.left = oBox.offsetLeft + 7 + 'px';
    }
  }, 1000 / 16 );
}

타이머를 지우려면 조건을 >=500으로 변경하고, 500px에서 강제로 멈추려면 oBox.style.left = 500 + 'px' 코드도 추가하세요. 그렇지 않으면 p가 멈추지 않습니다. 500px인데 504px입니다. p가 움직이는 동안 계속 버튼을 클릭하면 p가 매번 10px를 추가하는 대신 가속되기 시작하는 것을 알 수 있습니다. 버튼을 클릭할 때마다 타이머가 켜지고, 버튼을 클릭할 때마다 타이머가 켜지기 때문이다. 이렇게 하면 여러 개의 타이머가 중첩되고, 속도도 중첩되므로 p. 가속되기 시작하면 10px의 속도를 유지해야 합니다. 이는 타이머가 겹치지 않도록 하는 것을 의미하며, 이는 타이머가 켜져 있는지 확인하는 것을 의미합니다. 무엇을 해야 합니까?

oBtn.onclick = function () {
  clearInterval( timer );
  timer = setInterval( function(){
    if ( oBox.offsetLeft >= 500 ) {
      oBox.style.left = 500 + 'px';
      clearInterval( timer );
    }else {
      oBox.style.left = oBox.offsetLeft + 7 + 'px';
    }
  }, 1000 / 16 );
}

타이머가 항상 켜져 있는지 확인하려면 버튼을 클릭할 때마다 이전 타이머를 지우기만 하면 됩니다. 이 시점에서 가장 기본적인 균일 모션 구조가 완성됩니다. function

    function animate(obj, target, speed) {
        clearInterval(timer);
        timer = setInterval(function () {
          if (obj.offsetLeft == target) {
            clearInterval(timer);
          } else {
            obj.style.left = obj.offsetLeft + speed + 'px';
          }
        }, 30);
      }

이 기능을 만든 후 작은 애플리케이션을 만들어 보겠습니다.

http://www.jiathis.com/getcode

이 웹사이트를 열면 오른쪽에 사이드바 효과가 있는 것을 볼 수 있습니다(공유). 이런 종류의 특수 효과는 웹사이트에서 매우 일반적입니다

<!DOCTYPE html>
<html>
<head lang="en">
  <meta charset="UTF-8">
  <title>侧边栏 - by ghostwu</title>
  <style>
    #box {
      width: 150px;
      height: 300px;
      background: red;
      position: absolute;
      left: -150px;
      top: 50px;
    }

    #box p {
      width: 28px;
      height: 100px;
      position: absolute;
      right: -28px;
      top: 100px;
      background: green;
    }
  </style>
  <script>
    window.onload = function () {
      var timer = null;
      var oBox = document.getElementById("box");
      oBox.onmouseover = function () {
        animate(this, 0, 10);
      }
      oBox.onmouseout = function () {
        animate(this, -150, -10);
      }
      function animate(obj, target, speed) {
        clearInterval(timer);
        timer = setInterval(function () {
          if (obj.offsetLeft == target) {
            clearInterval(timer);
          } else {
            obj.style.left = obj.offsetLeft + speed + 'px';
          }
        }, 30);
      }
    }
  </script>
</head>
<body>
<p id="box">
  <p>分享到</p>
</p>
</body>
</html>

다시 와 페이드 인 및 페이드 아웃 효과:

마우스를 위로 올리면 투명도가 1

<!doctype html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>淡入淡出 - by ghostwu</title>
  <style>
    img {
      border: none;
      opacity: 0.3;
      filter: alpha(opacity:30);
    }
  </style>
  <script>
    window.onload = function () {
      var timer = null;
      var oImg = document.getElementById("img");
      oImg.onmouseover = function(){
        animate( this, 100, 10 );
      }
      oImg.onmouseout = function(){
        animate( this, 30, -10 );
      }
      //alpha=30 --> 100
      function animate(obj, target, speed) {
        clearInterval(timer);
        var cur = 0;
        timer = setInterval(function () {
          cur = css( obj, 'opacity') * 100;
          if( cur == target ){
            clearInterval( timer );
          }else {
            cur += speed;
            obj.style.opacity = cur / 100;
            obj.style.filter = "alpha(opacity:" + cur + ")";
          }
        }, 30);
      }

      function css(obj, attr) {
        if (obj.currentStyle) {
          return obj.currentStyle[attr];
        } else {
          return getComputedStyle(obj, false)[attr];
        }
      }
    }
  </script>
</head>
<body>
<img src="./img/h4.jpg" alt="" id="img"/>
</body>
</html>

관련 권장 사항:

html5 캔버스를 사용하여 균일하게 만드는 방법 Motion

js를 사용하여 단계 크기 지정 한 방향의 균일한 동작

균일한 모션을 달성하기 위한 JS 코드 예제_javascript 기술

위 내용은 js 등속운동을 기반으로 한 설명 예시의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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