js仿QQ中对联系人向左滑动、滑出删除按钮的操作

 

101

102

 

纯js:

<!DOCTYPE html>

<html lang="en">

<head>

 <meta charset="UTF-8">

 <meta name="viewport" id="viewport" content="width=device-width, initial-scale=1">

 <title>html5向左滑动删除特效</title>

 <style>

 * {

  padding: 0;

  margin: 0;

  list-style: none;

 }

  

 header {

  background: #f7483b;

  border-bottom: 1px solid #ccc

 }

  

 header h2 {

  text-align: center;

  line-height: 54px;

  font-size: 16px;

  color: #fff

 }

  

 .list-ul {

  overflow: hidden

 }

  

 .list-li {

  line-height: 60px;

  border-bottom: 1px solid #fcfcfc;

  position: relative;

  padding: 0 12px;

  color: #666;

  background: #f2f2f2;

  -webkit-transform: translateX(0px);

 }

  

 .btn {

  position: absolute;

  top: 0;

  right: -80px;

  text-align: center;

  background: #ffcb20;

  color: #fff;

  width: 80px

 }

 </style>

 <script>

 /*

  * 描述:html5苹果手机向左滑动删除特效

  */

 window.addEventListener('load', function() {

  var initX; //触摸位置

  var moveX; //滑动时的位置

  var X = 0; //移动距离

  var objX = 0; //目标对象位置

  window.addEventListener('touchstart', function(event) {

   event.preventDefault();

   var obj = event.target.parentNode;

   if (obj.className == "list-li") {

    initX = event.targetTouches[0].pageX;

    objX = (obj.style.WebkitTransform.replace(/translateX\(/g, "").replace(/px\)/g, "")) * 1;

   }

   if (objX == 0) {

    window.addEventListener('touchmove', function(event) {

     event.preventDefault();

     var obj = event.target.parentNode;

     if (obj.className == "list-li") {

      moveX = event.targetTouches[0].pageX;

      X = moveX - initX;

      if (X >= 0) {

       obj.style.WebkitTransform = "translateX(" + 0 + "px)";

      } else if (X < 0) {

       var l = Math.abs(X);

       obj.style.WebkitTransform = "translateX(" + -l + "px)";

       if (l > 80) {

        l = 80;

        obj.style.WebkitTransform = "translateX(" + -l + "px)";

       }

      }

     }

    });

   } else if (objX < 0) {

    window.addEventListener('touchmove', function(event) {

     event.preventDefault();

     var obj = event.target.parentNode;

     if (obj.className == "list-li") {

      moveX = event.targetTouches[0].pageX;

      X = moveX - initX;

      if (X >= 0) {

       var r = -80 + Math.abs(X);

       obj.style.WebkitTransform = "translateX(" + r + "px)";

       if (r > 0) {

        r = 0;

        obj.style.WebkitTransform = "translateX(" + r + "px)";

       }

      } else { //向左滑动

       obj.style.WebkitTransform = "translateX(" + -80 + "px)";

      }

     }

    });

   }



  })

  window.addEventListener('touchend', function(event) {

   event.preventDefault();

   var obj = event.target.parentNode;

   if (obj.className == "list-li") {

    objX = (obj.style.WebkitTransform.replace(/translateX\(/g, "").replace(/px\)/g, "")) * 1;

    if (objX > -40) {

     obj.style.WebkitTransform = "translateX(" + 0 + "px)";

     objX = 0;

    } else {

     obj.style.WebkitTransform = "translateX(" + -80 + "px)";

     objX = -80;

    }

   }

  })

 })

 </script>

</head>



<body>

 <header>

  <h2>消息列表</h2>

 </header>

 <section class="list">

  <ul class="list-ul">

   <li id="li" class="list-li">

    <div class="con">

     你的快递到了,请到楼下签收

    </div>

    <div class="btn">删除</div>

   </li>

   <li class="list-li">

    <div class="con">

     哇,你在干嘛,快点来啊就等你了

    </div>

    <div class="btn">删除</div>

   </li>

  </ul>

 </section>

</body>



</html>

做成zepto插件
实际项目中,我们可能有很多个地方会用到这个功能。现在我们将这个功能做成zepto插件,方便后面使用。

这个插件,我们仅实现这个功能,然后传入参数(删除按钮的样式名),让程序在js中计算所需要滑动的距离,方便复用。

/**

 * zepto插件:向左滑动删除动效

 * 使用方法:$('.itemWipe').touchWipe({itemDelete: '.item-delete'});

 * 参数:itemDelete 删除按钮的样式名

 */

;

(function($) {

 $.fn.touchWipe = function(option) {

  var defaults = {

   itemDelete: '.item-delete', //删除元素

  };

  var opts = $.extend({}, defaults, option); //配置选项



  var delWidth = $(opts.itemDelete).width();



  var initX; //触摸位置

  var moveX; //滑动时的位置

  var X = 0; //移动距离

  var objX = 0; //目标对象位置

  $(this).on('touchstart', function(event) {

   event.preventDefault();

   var obj = this;

   initX = event.targetTouches[0].pageX;

   objX = (obj.style.WebkitTransform.replace(/translateX\(/g, "").replace(/px\)/g, "")) * 1;

   if (objX == 0) {

    $(this).on('touchmove', function(event) {

     event.preventDefault();

     var obj = this;

     moveX = event.targetTouches[0].pageX;

     X = moveX - initX;

     if (X >= 0) {

      obj.style.WebkitTransform = "translateX(" + 0 + "px)";

     } else if (X < 0) {

      var l = Math.abs(X);

      obj.style.WebkitTransform = "translateX(" + -l + "px)";

      if (l > delWidth) {

       l = delWidth;

       obj.style.WebkitTransform = "translateX(" + -l + "px)";

      }

     }

    });

   } else if (objX < 0) {

    $(this).on('touchmove', function(event) {

     event.preventDefault();

     var obj = this;

     moveX = event.targetTouches[0].pageX;

     X = moveX - initX;

     if (X >= 0) {

      var r = -delWidth + Math.abs(X);

      obj.style.WebkitTransform = "translateX(" + r + "px)";

      if (r > 0) {

       r = 0;

       obj.style.WebkitTransform = "translateX(" + r + "px)";

      }

     } else { //向左滑动

      obj.style.WebkitTransform = "translateX(" + -delWidth + "px)";

     }

    });

   }



  })

  $(this).on('touchend', function(event) {

   event.preventDefault();

   var obj = this;

   objX = (obj.style.WebkitTransform.replace(/translateX\(/g, "").replace(/px\)/g, "")) * 1;

   if (objX > -delWidth / 2) {

    obj.style.transition = "all 0.2s";

    obj.style.WebkitTransform = "translateX(" + 0 + "px)";

    obj.style.transition = "all 0";

    objX = 0;

   } else {

    obj.style.transition = "all 0.2s";

    obj.style.WebkitTransform = "translateX(" + -delWidth + "px)";

    obj.style.transition = "all 0";

    objX = -delWidth;

   }

  })



  //链式返回

  return this;

 };



})(Zepto);

touchWipe.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" id="viewport" content="width=device-width, initial-scale=1">
<title>html5向左滑动删除特效</title>
 
<style>
  *{ padding:0; margin:0; list-style: none;}
  header{ background: #f7483b; border-bottom: 1px solid #ccc}
  header h2{ text-align: center; line-height: 54px; font-size: 16px; color: #fff}
  .list-ul{ overflow: hidden}
  .list-li{ line-height: 60px; border-bottom: 1px solid #fcfcfc; position:relative;padding: 0 12px; color: #666;
    background: #f2f2f2;
    -webkit-transform: translateX(0px);
  }
  .btn{ position: absolute; top: 0; right: -80px; text-align: center; background: #ffcb20; color: #fff; width: 80px}
</style>
 
</head>
<body>
<header>
  <h2>消息列表</h2>
</header>
<section class="list">
  <ul class="list-ul">
    <li id="li" class="list-li">
      <div class="con">
        你的快递到了,请到楼下签收
      </div>
      <div class="btn">删除</div>
    </li>
    <li class="list-li">
      <div class="con">
        哇,你在干嘛,快点来啊就等你了
      </div>
      <div class="btn">删除</div>
    </li>
  </ul>
</section>
 
 
<script type="text/javascript" src="http://apps.bdimg.com/libs/zepto/1.1.4/zepto.min.js"></script>
<script type="text/javascript" src="zepto.touchWipe.js"></script>
<script type="text/javascript">
  $(function() {
  $('.list-li').touchWipe({itemDelete: '.btn'});
  });
 
</script>
</body>
</html>

 

转载于:https://my.oschina.net/yanyaya/blog/713723

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值