首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

js触摸拖动切换div

基础概念

JavaScript 触摸拖动切换 div 是一种常见的交互设计,允许用户通过触摸屏幕来拖动元素,从而实现页面内容的切换。这种功能通常用于移动设备上的应用或网页,以提供更直观和便捷的用户体验。

相关优势

  1. 直观性:触摸拖动操作符合人类的直觉,用户无需学习复杂的指令即可使用。
  2. 响应性:实时反馈用户的操作,增强了交互的即时感。
  3. 灵活性:适用于多种场景,如图片轮播、页面导航等。

类型

  • 水平滑动:常见于图片轮播或标签页切换。
  • 垂直滑动:适用于内容较多的列表或卡片式布局。
  • 自由拖动:允许用户在任意方向上拖动元素。

应用场景

  • 移动应用界面:如新闻阅读器、社交媒体应用等。
  • 网页设计:网站的首页导航、产品展示页面等。
  • 游戏界面:某些互动性强的游戏会用到这种交互方式。

实现方法及示例代码

以下是一个简单的 JavaScript 示例,展示如何实现水平滑动切换 div

代码语言:txt
复制
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Touch Drag to Switch Divs</title>
<style>
  .container {
    display: flex;
    overflow: hidden;
    width: 100%;
  }
  .item {
    min-width: 100%;
    height: 200px;
    transition: transform 0.3s;
  }
  #item1 { background-color: red; }
  #item2 { background-color: green; }
  #item3 { background-color: blue; }
</style>
</head>
<body>

<div class="container" id="container">
  <div class="item" id="item1"></div>
  <div class="item" id="item2"></div>
  <div class="item" id="item3"></div>
</div>

<script>
  let startX = 0;
  let currentTranslate = 0;
  let prevTranslate = 0;
  let animationID = 0;
  const container = document.getElementById('container');
  const items = document.querySelectorAll('.item');

  container.addEventListener('touchstart', touchStart);
  container.addEventListener('touchmove', touchMove);
  container.addEventListener('touchend', touchEnd);

  function touchStart(event) {
    startX = event.touches[0].clientX;
    cancelAnimationFrame(animationID);
  }

  function touchMove(event) {
    const currentX = event.touches[0].clientX;
    currentTranslate = prevTranslate + currentX - startX;
    setTransform(currentTranslate);
  }

  function touchEnd() {
    const movedBy = currentTranslate - prevTranslate;
    if (movedBy < -100 && currentTranslate > -100) {
      currentTranslate -= window.innerWidth;
    } else if (movedBy > 100 && currentTranslate < 0) {
      currentTranslate += window.innerWidth;
    }
    prevTranslate = currentTranslate;
    setTransform(currentTranslate);
    animationID = requestAnimationFrame(smoothTransition);
  }

  function setTransform(translate) {
    container.style.transform = `translateX(${translate}px)`;
  }

  function smoothTransition() {
    setTransform(prevTranslate);
    if ((prevTranslate > -100 && currentTranslate < -100) || (prevTranslate < 0 && currentTranslate > 0)) {
      cancelAnimationFrame(animationID);
    } else {
      animationID = requestAnimationFrame(smoothTransition);
    }
  }
</script>

</body>
</html>

可能遇到的问题及解决方法

  1. 滑动不流畅
    • 原因:可能是由于页面重绘或回流导致的性能问题。
    • 解决方法:使用 transform 属性进行位移,因为它不会触发重绘和回流,性能更好。
  • 触摸事件与鼠标事件冲突
    • 原因:在桌面浏览器上测试时,触摸事件可能与鼠标事件同时触发。
    • 解决方法:可以通过检测用户代理(User Agent)来区分设备类型,或在事件处理函数中添加条件判断。
  • 边界处理不当
    • 原因:当用户滑动到边界时,可能会出现不自然的跳转或卡顿。
    • 解决方法:在 touchend 事件中添加逻辑,判断滑动的距离和方向,从而决定是否切换到下一个或上一个元素。

通过以上方法,可以实现一个基本的触摸拖动切换 div 的功能,并解决一些常见问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • WPF 多指触摸拖拽窗口 拖动修改窗口坐标

    在 WPF 中,如果是鼠标点击拖动窗口坐标,可以调用 Window 的 DragMove 方法,但是如果是触摸,就需要自己调用 Win32 的方法实现 在 WPF 中,调用 Window 的 DragMove...本文仅仅支持使用一个手指的移动,因为使用了 GetCursorPos 的方法 当然了,此时假装是支持多指拖动也是可以的,只需要在进行多指触摸的时候开启拖动就可以了,此时用户的交互上不会有很大的差别 在开始之前...,咱来封装一个类 DragMoveWindowHelper 用来在触摸下拖动窗口 public static class DragMoveWindowHelper { public...,拖动太快了,就丢失触摸设备了,触摸设备被你窗口后面的其他软件抓了 下面开始实现 DragMoveMode 也就是核心的通过触摸拖动窗口的逻辑 大概对外的接口方法实现请看代码 class...Window_PreviewMouseUp(object sender, MouseButtonEventArgs e) { Stop(); } 大概就完成了触摸拖动窗口的逻辑

    2.2K30

    移动端轮播图笔记

    1.触屏事件 1.1触屏事件概述 移动端浏览器兼容性好,我们不需要考虑以前JS的兼容问题,可以放心使用原生JS书写效果,但是移动端也有自己独特的地方,比如触屏事件touch(也叫触摸事件),Android...手指从一个DOM元素上移开时触发 1.2触摸事件对象(TochEvent) TouchEvent是一类描述手指在触摸平面(触摸屏、触摸板等)的状态变化的事件。...,从有到无变化 1.3移动端拖动元素 1.touchstart、touchmove、touchend可以实现拖动元素 2.但是拖动元素需要当前手指的坐标值,我们可以使用targetTouches[0]里面的...pageX和pageY 3.移动端拖动的原理:手指移动中,计算出手指移动的距离。...然后用盒子原来的位置+手指移动的距离 4.手指移动的距离:手指滑动中的位置减去手指刚开始触摸的位置 拖动元素三部曲: (1)触摸元素touchstart:获取手指初始坐标,同时获得盒子原来的位置

    2.5K21

    js动态添加div

    需要的时候调用就好了 思路 因为每个input标签的name如果相同的话, 在后端接收的时候会出错, 所以我的解决办法就是在name后加上一个数字, 后端用一个循环进行接收 点击第一行的添加 点击的时候, 将div...准备好, 添加到内容div中的第一个 点击每行的添加 将div添加到当前点击行后面一个 点击每行删除 删除当前div 实现 基本思路很简单, 只要在每个点击按钮上添加对应的点击事件, 将结果封装成类....我在封装的时候喜欢先想用的时候怎么用, 然后根据这个思路来想应该怎么封装, 思考如下 因为添加的div肯定是不同的, 是需要传的参数, 但是如果直接传div字符串也太丑了, 应该在页面直接写HTML,...'] || 'content_div_id'; var exampleDivId = params['example_div_id'] || 'example_div_id'; var...this = this; this.addButton.click(function () { _this.addFistItem(); }); // 删除示例div

    24.5K40

    移动端触屏事件

    触屏事件概述 移动端浏览器兼容性较好,我们不需要考虑以前 JS 的兼容性问题,可以放心的使用原生 JS 书写效果,但是移动端也有自己独特的地方。... //触摸事件对象 // 1.获取元素 // 2.手指触摸DOM元素事件 var div = document.querySelector('div' ); div.addEventL...移动端拖动元素 touchstart、touchmove、touchend可以实现拖动元素 但是拖动元素需要当前手指的坐标值 我们可以使用  targetTouches[0] 里面的pageX...和 pageY 移动端拖动的原理:    手指移动中,计算出手指移动的距离。...然后用盒子原来的位置 + 手指移动的距离 手指移动的距离:  手指滑动中的位置 减去  手指刚开始触摸的位置 拖动元素三步曲: (1) 触摸元素 touchstart: 获取手指初始坐标,同时获得盒子原来的位置

    2.9K30

    「JavaScript 」动画基础 - 03

    触摸事件对象重点我们看三个常见对象列表: 因为平时我们都是给元素注册触摸事件,所以重点记住 targetTocuhes 1.1.3 移动端拖动元素 touchstart、touchmove、touchend...可以实现拖动元素 但是拖动元素需要当前手指的坐标值 我们可以使用 targetTouches[0] 里面的pageX 和 pageY 移动端拖动的原理: 手指移动中,计算出手指移动的距离。...然后用盒子原来的位置 + 手指移动的距离 手指移动的距离: 手指滑动中的位置 减去 手指刚开始触摸的位置 拖动元素三步曲: 触摸元素 touchstart: 获取手指初始坐标,同时获得盒子原来的位置...该属性用于在元素中添加,移除及切换 CSS 类。...('div'); div.addEventListener('click', function() { alert(11); }) 1.5.

    1.2K20

    js实现拖动组件移动效果

    2015-04-15 14:06:09 今天我来给大家介绍一种js特效,这种特效是当你用鼠标点击组件移动到其他地方后,这个组件就定在了那个地方,这种效果通常用来做视图化排版的。...代码,主要是大体的div布局,我们在这里的组件用的是div,通过下面的js代码来实现组件的移动 js"></script...dragGhost.style.display = "block"; this.column.insertBefore(dragGhost,this); //记录每一列的左边距 在拖动过程中判断拖动对象所在的列会用到...= this//不能跟拖动元素自己比较 否则不能在本列向下移动 && top 拖动元素的上边距大的元素...CCCCCC;background:#CCCCCC;color:white;cursor:move;} 这样就可以实现组件的移动了,在上面这段代码中需要引入Drag.js

    10.1K20

    JavaScript——触屏事件

    概述 移动端浏览器兼容性较好,我们不需要考虑以前js的兼容性问题,可以放心的使用原生js书写效果,但是移动端也有自己独特的地方。比如触屏事件touch(也称触摸事件),Android和IOS都有。...正在触摸当前DOM元素上的手指的一个列表 changedTouches 手指状态发生了改变的列表,从无到有,从有到无变化 移动端拖动元素 touchstart、touchmove、touchend可以实现拖动元素...但是拖动元素需要当前手指的坐标值我们可以使用targetTouchies[0]里面的pageX和pageY 移动端拖动的原理:手指移动中,计算出手指移动的距离,然后用盒子原来的位置+手指移动的距离 手指移动的距离...:手指滑动中的位置减去手指刚开始触摸的位置 拖动元素三步曲: 触摸元素touchstart:获取手指初始坐标,同时获得盒子原来的位置 移动手指touchmove:计算手指的滑动距离,并且移动盒子 离开手指...>div> // (1) 触摸元素 touchstart: 获取手指初始坐标,同时获得盒子原来的位置 // (2) 移动手指 touchmove

    2.1K10

    触屏事件

    触屏事件概述 移动端浏览器兼容性较好,我们不需要考虑以前 JS 的兼容性问题,可以放心的使用原生 JS 书写效果,但是移动端也有自己独特的地方。...触摸事件对象(TouchEvent) TouchEvent 是一类描述手指在触摸平面(触摸屏、触摸板等)的状态变化的事件。...触摸事件对象重点我们看三个常见对象列表: 因为平时我们都是给元素注册触摸事件,所以重点记住 targetTocuhes 1.3.案例:移动端拖动元素 touchstart、touchmove、touchend...可以实现拖动元素 但是拖动元素需要当前手指的坐标值 我们可以使用  targetTouches[0] 里面的pageX 和 pageY 移动端拖动的原理:    手指移动中,计算出手指移动的距离...然后用盒子原来的位置 + 手指移动的距离 手指移动的距离:  手指滑动中的位置 减去  手指刚开始触摸的位置 拖动元素三步曲: (1) 触摸元素 touchstart: 获取手指初始坐标,同时获得盒子原来的位置

    73820

    【如果你要学JS XIV】—— 移动端常用事件-移动端touch触摸事件

    导绪移动端浏览器兼容性较好,不需要考虑JS的兼容性问题,可以放心的使用原生JS书写效果,但是移动端也有自己独特的地方。如触屏事件touch (也称触摸事件) , Android和IOS都有。...div>div> var div = document.querySelector('div'); // 手指触摸DOM事件 div.addEventListener...('我继续摸'); }) // 手指触摸离开DOM事件 div.addEventListener('touchend', function () {...DOM元素,他们两个是一样的,changedTouches 手指状态发生了改变的列表从无到有或者从有到无4.拖动元素1.touchstart,touchmove,touchend 可以实现拖动元素2.但是拖动元素需要当前手指的坐标值我们可以使用...targetTouches[0] 里面的pageX和pageY3.拖动的原理:手指移动计算出手指移动的距离,然后用盒子原来的位置+手指移动的距离4.手指移动的距离 = 手指滑动中的位置 - 手指刚开始触摸的位置

    55000
    领券