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

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

Feb 17, 2017 pm 05:14 PM

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

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

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

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

1. 스크롤

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

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

<p id="parent" style="overflow:scroll;>
  <p id='content'>内容区域</p>
</p>
로그인 후 복사

주의:

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

2) js 프로그래밍

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

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

단계 2: 터치 이벤트 수신

var parent = document.getElementById('parent');
parent.addEventListener('touchstart', function(e) {
  // do touchstart
});
parent.addEventListener('touchmove', function(e) {
  // do touchmove
});
parent.addEventListener('touchend', function(e) {
  // do touchend
});
로그인 후 복사

3단계: 롤링 코드 구현

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

4단계: 최적화

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

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

3) iScroll4 프레임워크 사용

var scroll = new iScroll('parent', {
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 &gt; 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 &gt; 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 &lt; 0) {
        return;
      }
      var moveY = (v + nowV)/2 * t;
      content.style.top = (contentY + moveY) + &quot;px&quot;;
      setTimeout(inertiaMove, 10);
    }
    inertiaMove();
  })(v, nowTime, contentY);
});
로그인 후 복사

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

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

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

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

뜨거운 기사 태그

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

JavaScript로 문자열 문자를 교체하십시오 JavaScript로 문자열 문자를 교체하십시오 Mar 11, 2025 am 12:07 AM

JavaScript로 문자열 문자를 교체하십시오

jQuery 날짜가 유효한지 확인하십시오 jQuery 날짜가 유효한지 확인하십시오 Mar 01, 2025 am 08:51 AM

jQuery 날짜가 유효한지 확인하십시오

jQuery는 요소 패딩/마진을 얻습니다 jQuery는 요소 패딩/마진을 얻습니다 Mar 01, 2025 am 08:53 AM

jQuery는 요소 패딩/마진을 얻습니다

상위 5 일 날짜 조작 JS 플러그인 상위 5 일 날짜 조작 JS 플러그인 Feb 28, 2025 am 12:34 AM

상위 5 일 날짜 조작 JS 플러그인

10 JQuery 플러그인을 확인할 가치가 있습니다 10 JQuery 플러그인을 확인할 가치가 있습니다 Mar 01, 2025 am 01:29 AM

10 JQuery 플러그인을 확인할 가치가 있습니다

10 JQuery Accordions 탭 10 JQuery Accordions 탭 Mar 01, 2025 am 01:34 AM

10 JQuery Accordions 탭

jQuery div에 스크롤 바를 추가합니다 jQuery div에 스크롤 바를 추가합니다 Mar 01, 2025 am 01:30 AM

jQuery div에 스크롤 바를 추가합니다

10 Ajax/JQuery Autocomplete 튜토리얼/플러그인 10 Ajax/JQuery Autocomplete 튜토리얼/플러그인 Feb 28, 2025 am 01:03 AM

10 Ajax/JQuery Autocomplete 튜토리얼/플러그인

See all articles