vue3实现移动端滑动模块

 更新时间:2022年09月14日 15:26:50   作者:如光不息丶  
这篇文章主要为大家详细介绍了vue3实现移动端滑动模块,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了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;
}

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

相关文章

  • Vue3 style CSS 变量注入的实现

    Vue3 style CSS 变量注入的实现

    本文主要介绍了Vue3 style CSS 变量注入的实现,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧
    2021-07-07
  • Vue组件的Prop命名约定详解

    Vue组件的Prop命名约定详解

    这篇文章主要为大家介绍了Vue组件的Prop命名约定详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • 浅谈vue引用静态资源需要注意的事项

    浅谈vue引用静态资源需要注意的事项

    今天小编就为大家分享一篇浅谈vue引用静态资源需要注意的事项,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • clipboard在vue中的使用的方法示例

    clipboard在vue中的使用的方法示例

    这篇文章主要介绍了clipboard在vue中的使用的方法示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-10-10
  • Vue中以HTML形式显示内容并动态生成HTML代码的方法

    Vue中以HTML形式显示内容并动态生成HTML代码的方法

    有的时候我们想在vue中直接显示一个html的网页,如果用富文本方式,那么内容就会太多,那么怎么处理呢?这篇文章主要给大家介绍了关于Vue中如何以HTML形式显示内容并动态生成HTML代码的相关资料,需要的朋友可以参考下
    2024-03-03
  • js数组的 entries() 获取迭代方法

    js数组的 entries() 获取迭代方法

    这篇文章主要介绍了js数组的 entries() 获取迭代方法,entries() 方法返回一个数组的迭代对象,该对象包含数组的键值对 (key/value)。下面来详细介绍该neural,需要的朋友可以参考一下
    2021-10-10
  • 在vue-cli的组件模板里使用font-awesome的两种方法

    在vue-cli的组件模板里使用font-awesome的两种方法

    今天小编就为大家分享一篇在vue-cli的组件模板里使用font-awesome的两种方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-09-09
  • 深度解读vue-resize的具体用法

    深度解读vue-resize的具体用法

    这篇文章主要介绍了vue-resize深度解读,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Vue调用后端java接口的实例代码

    Vue调用后端java接口的实例代码

    今天小编就为大家分享一篇Vue调用后端java接口的实例代码,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-10-10
  • Vue3中reactive丢失响应式问题详解

    Vue3中reactive丢失响应式问题详解

    在vue3中,如果你用reactive声明了一个对象,用另一个对象直接给它赋值,那么它就会失去响应式,下面这篇文章主要给大家介绍了关于Vue3中reactive丢失响应式问题的相关资料,需要的朋友可以参考下
    2023-03-03

最新评论