>  기사  >  웹 프론트엔드  >  JS+HTML5 휴대폰 개발 시 스크롤 및 관성 완화 구현 방법 분석

JS+HTML5 휴대폰 개발 시 스크롤 및 관성 완화 구현 방법 분석

高洛峰
高洛峰원래의
2017-02-17 17:14:051717검색

이 기사의 예에서는 JS+HTML5 휴대폰 개발에서 스크롤 및 관성 완화 구현 방법을 설명합니다. 참고할 수 있도록 모든 사람과 공유하세요. 자세한 내용은 다음과 같습니다.

1. 다음은 스크롤을 구현하는 세 가지 방법입니다.

1) 기본 CSS 속성 오버플로를 사용합니다. 스크롤 p id= 상위 스타일 = 오버플로: 스크롤; pid='content' 콘텐츠 영역/p /p 주의: 안드로이드에 버그가 있습니다. 스크롤한 후에는 상위 콘텐츠 영역으로 돌아갑니다. 해결 방법은 후자의 두 가지 방법을 사용하는 것입니다.

2) js 프로그래밍 구현 아이디어: 화면에서 손가락이 움직이기 전과 후의 위치 변화를 비교하고, 콘텐츠 요소 콘텐츠를 변경합니다.

1. 스크롤

다음은 다음과 같습니다. 세 가지 구현 방법:

1) 네이티브 사용 CSS 속성 오버플로: 스크롤

<p id="parent" style="overflow:scroll;>
  <p id=&#39;content&#39;>内容区域</p>
</p>

주의:

에 버그가 있습니다. Android에서는 스크롤 후 최상위 콘텐츠 영역으로 돌아갑니다. 해결책은 후자의 두 가지 방법을 사용하여

2) js 프로그래밍

을 구현하는 것입니다. 아이디어: 전후 위치 변경을 비교합니다. 콘텐츠 요소의 위치를 ​​변경하기 위해 화면에서 손가락을 움직입니다.

1단계: 부모의 오버플로를 숨김으로 설정하고, 콘텐츠의 위치를 ​​상대 위치로 설정하고, 상단을 0으로 설정합니다.

단계 2: 터치 이벤트 수신

var parent = document.getElementById(&#39;parent&#39;);
parent.addEventListener(&#39;touchstart&#39;, function(e) {
  // do touchstart
});
parent.addEventListener(&#39;touchmove&#39;, function(e) {
  // do touchmove
});
parent.addEventListener(&#39;touchend&#39;, function(e) {
  // do touchend
});

3단계: 롤링 코드 구현

/**
 * 这里只实现垂直滚动
 */
var parent = document.getElementById(&#39;parent&#39;);
var content = document.getElementById(&#39;content&#39;)
var startY = 0; // 初始位置
var lastY = 0; // 上一次位置
parent.addEventListener(&#39;touchstart&#39;, function(e) {
  lastY = startY = e.touches[0].pageY;
});
parent.addEventListener(&#39;touchmove&#39;, function(e) {
  var nowY = e.touches[0].pageY;
  var moveY = nowY - lastY;
  var contentTop = content.style.top.replace(&#39;px&#39;, &#39;&#39;);
  // 设置top值移动content
  content.style.top = (parseInt(contentTop) + moveY) + &#39;px&#39;;
  lastY = nowY;
});
parent.addEventListener(&#39;touchend&#39;, function(e) {
  // do touchend
  var nowY = e.touches[0].pageY;
  var moveY = nowY - lastY;
  var contentTop = content.style.top.replace(&#39;px&#39;, &#39;&#39;);
  // 设置top值移动content
  content.style.top = (parseInt(contentTop) + moveY) + &#39;px&#39;;
  lastY = nowY;
});

4단계: 최적화

위 코드는 PC보다 휴대폰에서 더 잘 실행됩니다.

최적화 부분은 다음을 참조하세요.

3) iScroll4 프레임워크 사용

var scroll = new iScroll(&#39;parent&#39;, {
hScrollbar: false,
vScrollbar: true,
checkDOMChanges : true
});

프레임워크 공식 웹사이트: http: //www.php.cn/

2. 관성 완화

아이디어: 마지막 시간 동안 화면을 스와이프하는 손가락의 평균 속도 v를 감소 함수에 따라 v로 변경하고, 이동할 수 없거나 v<=0

/**
 * 这里只实现垂直滚动
 */
var parent = document.getElementById(&#39;parent&#39;);
var content = document.getElementById(&#39;content&#39;)
var startY = 0; // 初始位置
var lastY = 0; // 上一次位置
/**
 * 用于缓动的变量
 */
var lastMoveTime = 0;
var lastMoveStart = 0;
var stopInertiaMove = false; // 是否停止缓动
parent.addEventListener(&#39;touchstart&#39;, function(e) {
  lastY = startY = e.touches[0].pageY;
  /**
   * 缓动代码
   */
  lastMoveStart = lastY;
  lastMoveTime = e.timeStamp || Date.now();
  stopInertiaMove = true;
});
parent.addEventListener(&#39;touchmove&#39;, function(e) {
  var nowY = e.touches[0].pageY;
  var moveY = nowY - lastY;
  var contentTop = content.style.top.replace(&#39;px&#39;, &#39;&#39;);
  // 设置top值移动content
  content.style.top = (parseInt(contentTop) + moveY) + &#39;px&#39;;
  lastY = nowY;
  /**
   * 缓动代码
   */
  var nowTime = e.timeStamp || Date.now();
  stopInertiaMove = true;
  if(nowTime - lastMoveTime > 300) {
    lastMoveTime = nowTime;
    lastMoveStart = nowY;
  }
});
parent.addEventListener(&#39;touchend&#39;, function(e) {
  // do touchend
  var nowY = e.touches[0].pageY;
  var moveY = nowY - lastY;
  var contentTop = content.style.top.replace(&#39;px&#39;, &#39;&#39;);
  var contentY = (parseInt(contentTop) + moveY);
  // 设置top值移动content
  content.style.top = contentY + &#39;px&#39;;
  lastY = nowY;
  /**
   * 缓动代码
   */
  var nowTime = e.timeStamp || Date.now();
  var v = (nowY - lastMoveStart) / (nowTime - lastMoveTime); //最后一段时间手指划动速度
  stopInertiaMove = false;
  (function(v, startTime, contentY) {
    var dir = v > 0 ? -1 : 1; //加速度方向
    var deceleration = dir*0.0006;
    var duration = v / deceleration; // 速度消减至0所需时间
    var dist = v * duration / 2; //最终移动多少
    function inertiaMove() {
      if(stopInertiaMove) return;
      var nowTime = e.timeStamp || Date.now();
      var t = nowTime-startTime;
      var nowV = v + t*deceleration;
      // 速度方向变化表示速度达到0了
      if(dir*nowV < 0) {
        return;
      }
      var moveY = (v + nowV)/2 * t;
      content.style.top = (contentY + moveY) + "px";
      setTimeout(inertiaMove, 10);
    }
    inertiaMove();
  })(v, nowTime, contentY);
});

할 때까지 v를 변경합니다.

이 글이 jQuery 프로그래밍에 종사하는 모든 분들께 도움이 되기를 바랍니다.

JS+HTML5 휴대폰 개발에서 스크롤 분석 및 관성 완화 구현 방법과 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!

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