이 기사의 예에서는 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('parent'); var content = document.getElementById('content') var startY = 0; // 初始位置 var lastY = 0; // 上一次位置 /** * 用于缓动的变量 */ var lastMoveTime = 0; var lastMoveStart = 0; var stopInertiaMove = false; // 是否停止缓动 parent.addEventListener('touchstart', function(e) { lastY = startY = e.touches[0].pageY; /** * 缓动代码 */ lastMoveStart = lastY; lastMoveTime = e.timeStamp || Date.now(); stopInertiaMove = true; }); 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; /** * 缓动代码 */ var nowTime = e.timeStamp || Date.now(); stopInertiaMove = true; if(nowTime - lastMoveTime > 300) { lastMoveTime = nowTime; lastMoveStart = 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', ''); var contentY = (parseInt(contentTop) + moveY); // 设置top值移动content content.style.top = contentY + 'px'; 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 중국어 웹사이트를 주목하세요!