基于JS实现移动端向左滑动出现删除按钮功能

发布时间 - 2026-01-10 23:13:47    点击率:

最近在做移动端项目时,需要实现一个列表页面的每一项item向左滑动时出现相应的删除按钮,本来想着直接使用zepto的touch.js插件,因为之前实现相同的功能时用过这个插件,当时还挺好用的,直接使用它的swipeLeft和swipeRight方法即可,可是今天又开始做这个功能时,却发现这两个方法在使用时毫无效果,一点反应都没有。上网查资料,又下载了最新版本的zepto和touch.js,都没有用,也不知为什么?所以就弃用了这个插件。

下面是我后来实现后的代码,其实就是用了原生js的touch事件,再结合触摸点的坐标来判断左滑和右滑,

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
<title>js侧滑显示删除按钮</title>
<style>
*{margin:0;padding:0;}
body{font-size:.14rem;}
li{list-style:none;}
i{font-style:normal;}
a{color:#393939;text-decoration:none;}
.list{overflow:hidden;margin-top:.2rem;padding-left:.3rem;border-top:1px solid #ddd;}
.list li{overflow:hidden;width:120%;border-bottom:1px solid #ddd;}
.list li a{display:block;height:.88rem;line-height:.88rem;-webkit-transition:all 0.3s linear;transition:all 0.3s linear;}
.list li i{float:right;width:15%;text-align:center;background:#E2421B;color:#fff;}
.swipeleft{transform:translateX(-15%);-webkit-transform:translateX(-15%);}
</style>
<script>
//计算根节点HTML的字体大小
function resizeRoot(){
 var deviceWidth = document.documentElement.clientWidth,
  num = 750,
  num1 = num / 100;
 if(deviceWidth > num){
  deviceWidth = num; 
 }
 document.documentElement.style.fontSize = deviceWidth / num1 + "px";
}
//根节点HTML的字体大小初始化
resizeRoot();

window.onresize = function(){
 resizeRoot();
};
</script>
</head>
<body>
<section>
<div class="list">
 <ul>
  <li><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" >侧滑显示删除按钮1<i>删除</i></a></li>
  <li><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" >侧滑显示删除按钮2<i>删除</i></a></li>
  <li><a href="#" rel="external nofollow" rel="external nofollow" rel="external nofollow" >侧滑显示删除按钮3<i>删除</i></a></li>
 </ul>
</div>
<script>
//侧滑显示删除按钮
var expansion = null; //是否存在展开的list
var container = document.querySelectorAll('.list li a');
for(var i = 0; i < container.length; i++){ 
 var x, y, X, Y, swipeX, swipeY;
 container[i].addEventListener('touchstart', function(event) {
  x = event.changedTouches[0].pageX;
  y = event.changedTouches[0].pageY;
  swipeX = true;
  swipeY = true ;
  if(expansion){ //判断是否展开,如果展开则收起
   expansion.className = "";
  }  
 });
 container[i].addEventListener('touchmove', function(event){
  
  X = event.changedTouches[0].pageX;
  Y = event.changedTouches[0].pageY;  
  // 左右滑动
  if(swipeX && Math.abs(X - x) - Math.abs(Y - y) > 0){
   // 阻止事件冒泡
   event.stopPropagation();
   if(X - x > 10){ //右滑
    event.preventDefault();
    this.className = ""; //右滑收起
   }
   if(x - X > 10){ //左滑
    event.preventDefault();
    this.className = "swipeleft"; //左滑展开
    expansion = this;
   }
   swipeY = false;
  }
  // 上下滑动
  if(swipeY && Math.abs(X - x) - Math.abs(Y - y) < 0) {
   swipeX = false;
  }  
 });
}
</script>
</body>
</html>

也许大家也注意到了,在页面最开始部分加入了原生js对移动端自适应的实现,主要为了方便移动端页面在不同尺寸屏幕上的更好的展现,也是为了在误差很小的情况下能更好的将设计稿近乎完美的呈现在不同尺寸的屏幕上,主要使用到的单位是rem。

移动端自适应js

<script>
//计算根节点HTML的字体大小
function resizeRoot(){
 var deviceWidth = document.documentElement.clientWidth,
  num = 750,
  num1 = num / 100;
 if(deviceWidth > num){
  deviceWidth = num; 
 }
 document.documentElement.style.fontSize = deviceWidth / num1 + "px";
}
//根节点HTML的字体大小初始化
resizeRoot();

window.onresize = function(){
 resizeRoot();
};
</script>

原理其实很简单,就是根据不同屏幕来计算根节点html的font-size,再利用rem相对于根节点html的font-size来计算的原理来实现不同元素的大小、间距等。

也有人说其实不用这样的js来判断,直接用css3的响应式@media screen也可以,其实我认为在各种尺寸的安卓屏幕如此活跃的当下,@media screen处理起来就显得有些力不从心了。

效果图如下:

附下源码下载:

js_del_button().rar

以上所述是小编给大家介绍的基于JS实现移动端向左滑动出现删除按钮功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# js  # 向左滑动出现删除按钮  # js滑动出现删除按钮  # JS如何实现封装列表右滑动删除收藏按钮  # js仿QQ中对联系人向左滑动、滑出删除按钮的操作  # js通过更改按钮的显示样式实现按钮的滑动效果  # 原生JS实现滑动按钮效果  # 用了  # 小编  # 自适应  # 也有  # 在此  # 都没  # 屏幕上  # 这两个  # 我认为  # 给大家  # 人说  # 好用  # 相对于  # 最新版本  # 力不从心  # 来实现  # 所述  # 还挺  # 给我留言  # 时用 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  Win11怎么修改DNS服务器 Win11设置DNS加速网络【指南】  Linux系统命令中tree命令详解  Linux后台任务运行方法_nohup与&使用技巧【技巧】  ChatGPT怎么生成Excel公式_ChatGPT公式生成方法【指南】  如何正确下载安装西数主机建站助手?  Laravel如何实现多对多模型关联?(Eloquent教程)  Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程  Laravel如何发送系统通知?(Notification渠道示例)  如何用ChatGPT准备面试 模拟面试问答与职场话术练习教程  Laravel项目怎么部署到Linux_Laravel Nginx配置详解  佛山企业网站制作公司有哪些,沟通100网上服务官网?  JS中对数组元素进行增删改移的方法总结  UC浏览器如何设置启动页 UC浏览器启动页设置方法  网站建设整体流程解析,建站其实很容易!  详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)  如何快速搭建虚拟主机网站?新手必看指南  Laravel Eloquent模型如何创建_Laravel ORM基础之Model创建与使用教程  Laravel的HTTP客户端怎么用_Laravel HTTP Client发起API请求教程  php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】  Laravel如何配置任务调度?(Cron Job示例)  深圳网站制作的公司有哪些,dido官方网站?  如何用JavaScript实现文本编辑器_光标和选区怎么处理  再谈Python中的字符串与字符编码(推荐)  如何做网站制作流程,*游戏网站怎么搭建?  Bootstrap整体框架之JavaScript插件架构  Laravel的路由模型绑定怎么用_Laravel Route Model Binding简化控制器逻辑  PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】  Laravel如何实现全文搜索功能?(Scout和Algolia示例)  Python文件异常处理策略_健壮性说明【指导】  Linux系统运维自动化项目教程_Ansible批量管理实战  如何解决hover在ie6中的兼容性问题  Laravel怎么实现模型属性的自动加密  laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法  利用JavaScript实现拖拽改变元素大小  Python自然语言搜索引擎项目教程_倒排索引查询优化案例  Laravel如何创建和注册中间件_Laravel中间件编写与应用流程  Laravel如何构建RESTful API_Laravel标准化API接口开发指南  Swift开发中switch语句值绑定模式  如何用西部建站助手快速创建专业网站?  Laravel如何实现登录错误次数限制_Laravel自带LoginThrottles限流配置【方法】  黑客入侵网站服务器的常见手法有哪些?  如何在阿里云高效完成企业建站全流程?  阿里云高弹*务器配置方案|支持分布式架构与多节点部署  Laravel怎么在Blade中安全地输出原始HTML内容  javascript事件捕获机制【深入分析IE和DOM中的事件模型】  JavaScript如何操作视频_媒体API怎么控制播放  Laravel中DTO是什么概念_在Laravel项目中使用数据传输对象(DTO)  Laravel怎么定时执行任务_Laravel任务调度器Schedule配置与Cron设置【教程】