ホームページ  >  記事  >  ウェブフロントエンド  >  ネイティブ JS を使用して Web アプリのスライディング効果 (慣性スライディング、スライディング リバウンド) をカプセル化する_JavaScript スキル

ネイティブ JS を使用して Web アプリのスライディング効果 (慣性スライディング、スライディング リバウンド) をカプセル化する_JavaScript スキル

WBOY
WBOYオリジナル
2016-05-16 16:49:412393ブラウズ

IE 6.0、FF 1.5、Safari 2.0、Opera 9.0と互換性のあるPCモバイル端末慣性アシスト、スライドリバウンド

ファサードモード

コードをコピー コードは次のとおりです:

window.onload = function() {
 /*测试数据*/
 var insert = '';
 for (var i = 0; i < 80; i++) {
insert += '
滑动测试 ' + i + '
';
 }
 document.getElementById("moveArea").innerHTML = insert;
 /*测试数据   */
 var at = new appTouch({
  tContain : 'appArea', //必选:滑动区域id
  tMove : 'moveArea', //必选:移动区域id
  tScroller : 'scroller', //必选:自定义滚动条
  tScrollerArea : 'scrollerArea'//必选:滚动条区域
 }, onmoveend);
 //到顶/底回调
 function onmoveend(m) {
  //console.log(m);
 }

}
/*=====================
 * 名称: appTouch
 * 功能: web app滑动模拟组件
 * 参数: 相关配置
 ======================*/
var appTouch = function(config, callback) {
 this.touchContain = config.tContain;
 this.touchMove = config.tMove;
 this.touchScroller = config.tScroller;
 this.touchScrollerArea = config.tScrollerArea;
 this.callbackfn = callback;
 this.move();
}

appTouch.prototype = {
 move : function(e) {
  var monitor = document.getElementById(this.touchContain), //监听容器
  target = document.getElementById(this.touchMove), //移动目标
  scroller = document.getElementById(this.touchScroller), //自定义滚动条
  scrollerArea = document.getElementById(this.touchScrollerArea), //滚动条区域
  sheight = monitor.offsetHeight / target.offsetHeight * monitor.offsetHeight, //自定义滚动条的长度
  st = (target.offsetHeight - monitor.offsetHeight) / (monitor.offsetHeight - sheight), //移动块对应滚轮单位长度
  tslow = 4, //到顶/底减基数
  tMove = 0, //滑块到顶top值
  tMoveL = tMove + 140, //到顶允许下拉范围
  bMove = monitor.offsetHeight - target.offsetHeight, //滑块到底top值
  bMoveL = bMove - 140, //到底允许上滑范围
  callbackfn = this.callbackfn, //回调函数
  flg = false, //标记是否滑动
  startY, //标记起始位置
  startTop, //标记滑动起始时的高度值
  move = 0;
  //移动距离
  //鼠标事件注册
  addEvent(monitor, 'mousedown', moveStart);
  addEvent(monitor, 'mousemove', moveIn);
  addEvent(monitor, 'mouseup', moveEnd);
  addEvent(window, 'mousemove', moveIn);
  addEvent(window, 'mouseup', moveEnd);
  //移动设备触摸事件注册
  addEvent(monitor, 'touchstart', moveStart);
  addEvent(monitor, 'touchmove', moveIn);
  addEvent(monitor, 'touchend', moveEnd);
  /**
   *外观/门面模式包装
   */
  /*事件监听 */
  function addEvent(el, type, fn) {
   if (el.addEventListener) {
    el.addEventListener(type, fn, false);
   } else if (el.attachEvent) {
    el.attachEvent('on' + type, fn);
   } else {
    el['on' + type] = fn;
   }
  }

  //取消浏览器默认行为
  function stop(e) {
   //Opera/Chrome/FF
   if (e.preventDefault)
    e.preventDefault();
   //IE
   e.returnValue = false;
  }

  //包装结束
  /**
   *操作函数
   */
  //惯性缓动参数
  var lastMoveTime = 0;
  var lastMoveStart = 0;
  var stopInertiaMove = false;
  /*移动触发*/
  function moveStart(e) {
   stop(e);
   flg = true;
   if (e.touches)
    e = e.touches[0];
   startY = e.clientY;
   startTop = target.style.top || 0;
   //惯性缓动
   lastMoveStart = startY;
   lastMoveTime = new Date().getTime();
   stopInertiaMove = true;
   scrollerArea.style.visibility = 'visible';

  }

  /*移动过程中*/
  function moveIn(e) {
   if (flg) {
    stop(e);
    if (e.touches)
     e = e.touches[0];
    move = e.clientY - startY + parseInt(startTop);
    if (move > tMove) {
     (move - tMove) / tslow + tMove > tMoveL ? move = tMoveL : move = (move - tMove) / tslow + tMove

} else if (move < bMove)
(move - bMove) / tslow bMove < bMoveL ? move = (move - bMove) / tslow bMove;
= move 'px';
scroller.style.top = -move / st 'px';
//慣性緩和
var nowTime = new Date().getTime();
stopInertiaMove = true;
if (nowTime - lastMoveTime > 300) {
lastMoveTime = nowTime;
lastMoveStart = e.clientY;
}
}
}

/*移動終了*/
function moveEnd(e) {
stop(e);
if (e.touches)
e = e.touches[0];
//慣性イージング
var contentTop = target.style.top.replace('px', '');
var contentY = (parseInt(contentTop) e.clientY - lastMoveStart);
var nowTime = new Date().getTime();
var v = (e.clientY - lastMoveStart) / (nowTime - lastMoveTime);
//最後の期間の指のスワイプ速度
stopInertiaMove = false;
(function(v, startTime, contentY) {
var dir = v > 0 ? -1 : 1;
//加速方向
var deceleration = dir * 0.005;
function inertiaMove ( ) {
if (stopInertiaMove)
return;
var nowTime = new Date().getTime();
var t = nowTime - startTime;
var nowV = v t * 減速; 🎜> var moveY = (v nowV)​​ / 2 * t;
// 速度方向の変化は、速度が 0 に達したことを示します
if (dir * nowV > 0) {
if (move > tMove ) {
callbackfn('トップへ');
target.style.top = tMove 'px';
scroller.style.top = tMove 'px';
} else if (move < ; bMove) {
callbackfn('end');
target.style.top = bMove 'px';
scroller.style.top = -bMove / st 'px' ;
}
setTimeout(function() {
if (!stopInertiaMove)
scrollerArea.style.visibility = 'hidden';
}, 4000);
return;
}
move = contentY moveY;
if (move > tMove) {
t /= 20;
move = (move - tMove) / 10 tMove;
} else if ( move < bMove) {
t /= 20;
move = (move - bMove) / 10 bMove;
}
target.style.top = move "px";
.style.top = -move / st 'px';
setTimeout(inertiaMove, 10);
}

inertiaMove();

})(v, nowTime, contentY);
move = 0;
flg = false;
}

//操作が終了します

/**
*関連する初期化
*/
//スクロールバーの長さの初期化
scroller.style.height = sheight 'px';
//初期化が終了します

},

otherInteract : function() {
//その他の関数拡張
}
}

IE hack css


コードをコピー コードは次のとおりです:

body,html {背景色:#333;マージン: 0;高さ: 100%;行の高さ: 2.0;フォントファミリー: 'Microsoft YaHei'; overflow-y:hidden;}
#contain{margin: 0 auto;位置:相対;幅: 100%;最大幅: 480ピクセル; _幅: 480ピクセル;高さ: 100%;カーソル: ポインタ !重要;}
#appArea{位置: 絶対;幅: 100%;高さ: 100%;オーバーフロー: 非表示;  背景色: #fff;}
#topInfo{位置: 絶対;トップ: 60px;幅: 100%;高さ:60ピクセル;テキスト整列: 中央;フォントサイズ: 18px; }
#bottomInfo{位置: 絶対;ボトム: 0;幅: 100%;}
#scrollerArea{位置: 絶対;右: 0;幅: 1.5%;高さ: 100%;可視性: 非表示;}
#scroller{位置: 絶対;トップ:0;幅: 100%;  背景色: #aaa;}
#moveArea{位置: 絶対;上:0px;幅: 100%;背景色: #ddd;}

HTML代码

复制代码代码如下:







滑動回弹







ロゴまたはアニメーション


いくつかの情報 2014-4-28









声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。