文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

vue3实现移动端滑动模块

2024-04-02 19:55

关注

本文实例为大家分享了vue3实现移动端滑动模块的具体代码,供大家参考,具体内容如下

需要实现的需求如下

直接上代码

HTML:

<div class="container" id="container">
  <div class="controlDiv" id="controlDiv">
    <div 
      class="centerCircle" 
      id="centerCircle" 
      @touchstart="start" 
      @touchmove="move" 
      @touchend="end">
    </div>
  </div>
</div>

javascript:

import {defineComponent, onMounted} from "vue";
export default defineComponent({
  setup(prop,content) {
    let controlDiv ='' //控制器容器元素
    let circleDiv = '' //中心圆元素
    //最大宽高
    let maxW = 0
    let maxH = 0
    //初始触摸点
    let oL = 0
    let oT = 0
    //相对屏幕的初始触摸点
    let touchClientX = 0 
    let touchClientY = 0

    onMounted(() => {
      controlDiv = document.querySelector('#controlDiv') //控制器容器元素
      circleDiv = document.querySelector('#centerCircle') //中心圆元素
      console.log(circleDiv.offsetWidth, circleDiv.offsetHeight)

      //限制最大宽高,不让滑块出去
      maxW = controlDiv.offsetWidth
      maxH = controlDiv.offsetHeight
    })

    //手指触摸开始,记录div的初始位置
    const start = (e) => {
      var ev = e || window.event;
      var touch = ev.targetTouches[0];
      //初始位置
      oL = touch.clientX - circleDiv.offsetLeft
      oT = touch.clientY - circleDiv.offsetTop

      touchClientX = touch.clientX
      touchClientY = touch.clientY

      console.log(oL, oT)
      //阻止浏览器滑动默认行为
      document.addEventListener('touchmove', defaultEvent, { passive: false })
    }

    //手指滑动并改变滑块位置
    const move = (e) => {
      var ev = e || window.event
      var touch = ev.targetTouches[0]
      var oLeft = touch.clientX - oL
      var oTop = touch.clientY - oT

      //判断是否超出边界
      if(oLeft - 30 < 0) {
          oLeft = 30
      } else if(oLeft + 30 >= maxW) {
          oLeft = maxW-30
      }
      if(oTop - 30 < 0) {
          oTop = 30
      } else if(oTop + 30 >= maxH) {
          oTop = maxH-30
      }

      //通过正切函数
      let tan = (150 - oTop)/(oLeft - 150)
      // console.log(tan)

      // circleDiv.style.transition = '.1s all' //动画效果(体验不佳,不建议使用)

      //判断中心位置上下左右20px范围可随意滑动
      if(Math.abs(oLeft - 150) >= 20 || Math.abs(150 - oTop)>= 20){
        // 通过正切函数判断滑块该在X轴上移动或是y轴上移动
        if((tan <= -1) || (tan >= 1)){ //y轴
          circleDiv.style.top =  oTop + 'px'
          circleDiv.style.left =  150 + 'px'
        }else if((tan > -1) || (tan < 1)){ //x轴
          circleDiv.style.top = 150 + 'px'
          circleDiv.style.left = oLeft + 'px'
        }
      }else{
        circleDiv.style.top =  oTop + 'px'
        circleDiv.style.left = oLeft + 'px'
      }
    }

    //手指抬起
    const end = (e) => {
      //回弹初始点
      circleDiv.style.left = (touchClientX -  oL) + 'px'
      circleDiv.style.top = (touchClientY - oT) + 'px'

      //恢复浏览器滑动默认行为
      document.removeEventListener("touchmove", defaultEvent, { passive: true })
    }

    //阻止默认事件
    function defaultEvent(e) {
      e.preventDefault();
    }

    return { start, move, end }
  }
});

CSS:

.controlDiv{
  position: relative;
  width: 300px;
  height: 300px;
  background: #ebebeb;
  margin: 200px auto;
  border-radius: 50%;
 }
.centerCircle{
  width: 65px;
  height: 65px;
  background: #fff;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
  border-radius: 50%;
  box-shadow:0px 0px 30px #a7a7a7;
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-前端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯