vue项目实现按钮可随意移动

 更新时间:2022年03月30日 08:51:15   作者:帅_帅  
这篇文章主要为大家详细介绍了vue项目实现按钮可随意移动,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

vue项目中实现按钮可随意移动,供大家参考,具体内容如下

组件代码如下:

在项目中引入该组件即可

<template>
  <div v-show="hide" class="move-button" ref="moveBtn"
       @mousedown="btnDown"
       @touchstart="btnDown"
       @mousemove="btnMove"
       @touchmove="btnMove"
       @mouseup="btnEnd"
       @touchend="btnEnd"
       @touchcancel="btnEnd">
    <div class="button-mainbg">
    </div>
    </div>
</template>

<script>
export default {
    name: 'MoveButton',
    data() {
        return {
            hide: true,
            img: require('@/assets/img/moveButton.png'),
            flags: false,
            position: {
                x: 0,
                y: 0
            },
            nx: '',
            ny: '',
            dx: '',
            dy: '',
            xPum: '',
            yPum: '',
            isShow: false,
            moveBtn: {},
            timer: null,
            currentTop:0
        }
    },
    mounted() {
        this.moveBtn = this.$refs.moveBtn;
        window.addEventListener('scroll', this.hideButton);
    },
    beforeDestroy() {
        window.addEventListener('scroll', this.hideButton);
    },
    methods: {
        hideButton() {
            this.timer&&clearTimeout(this.timer);
            this.timer = setTimeout(()=>{
             this.handleScrollEnd();
            },300);
            this.currentTop = document.documentElement.scrollTop || document.body.scrollTop;
            this.hide = false;
        },
        handleScrollEnd(){
            let scrollTop = document.documentElement.scrollTop || document.body.scrollTop;
            if(scrollTop === this.currentTop){
            this.hide = true;
            clearTimeout(this.timer);
            }
        },

        // 实现移动端拖拽
      btnDown() {
            this.flags = true;
            let touch;
            if (event.touches) {
                touch = event.touches[0];
            } else {
                touch = event;
            }
            this.position.x = touch.clientX;
            this.position.y = touch.clientY;
            this.dx = this.moveBtn.offsetLeft;
            this.dy = this.moveBtn.offsetTop;
        },
      btnMove() {
            if (this.flags) {
                let touch;
                if (event.touches) {
                    touch = event.touches[0];
                } else {
                    touch = event;
                }
                this.nx = touch.clientX - this.position.x;
                this.ny = touch.clientY - this.position.y;
                this.xPum = this.dx + this.nx;
                this.yPum = this.dy + this.ny;
                let clientWidth = document.documentElement.clientWidth;
              let clientHeight = document.documentElement.clientHeight;
                if (this.xPum > 0 && this.xPum < (clientWidth - this.moveBtn.offsetWidth)) {
                    this.moveBtn.style.left = this.xPum + "px";
                }
                if (this.yPum > 0 && this.yPum < (clientHeight - this.moveBtn.offsetHeight)) {
                    this.moveBtn.style.top = this.yPum + "px";
                }

                //阻止页面的滑动默认事件
                document.addEventListener("touchmove", this.handler, {
                    passive: false
                });
            }
        },
        //鼠标释放时候的函数
        btnEnd() {
            this.flags = false;
            document.addEventListener('touchmove', this.handler, {
                passive: false
            });
        },
        handler(e) {
            if(this.flags){
                event.preventDefault();
            }else{
                return true
            }
        }
    }
}
</script>

<style lang="stylus" scoped>
.move-button {

    border-radius:50%;
    width: 50px;
    height: 50px;
    position: fixed;
    z-index: 10;

  color: #FFF;

  .button-mainbg{
    position: relative;
    width:50px;
    height:50px;
    border-radius:50%;
    background: url("../../assets/img/moveButton.png") no-repeat;
    background-size: 50px 50px;
  }


}
</style>

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

相关文章

  • vue前端传空值、空字符串的问题及解决

    vue前端传空值、空字符串的问题及解决

    这篇文章主要介绍了vue前端传空值、空字符串的问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • vue中对时间戳的处理方式

    vue中对时间戳的处理方式

    这篇文章主要介绍了vue中对时间戳的处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • vue-router重定向和路由别名的使用讲解

    vue-router重定向和路由别名的使用讲解

    今天小编就为大家分享一篇关于vue-router重定向和路由别名的使用讲解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • vue中el表单的简单查询方法

    vue中el表单的简单查询方法

    本文主要介绍了vue中el表单的简单查询方法,主要包括表单页面根据groupid 、type 、errortype进行数据过滤,感兴趣的可以了解一下
    2023-10-10
  • vue对象或者数组中数据变化但是视图没有更新问题及解决

    vue对象或者数组中数据变化但是视图没有更新问题及解决

    这篇文章主要介绍了vue对象或者数组中数据变化但是视图没有更新问题及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • vue常用指令实现学生录入系统的实战

    vue常用指令实现学生录入系统的实战

    本文主要介绍了vue常用指令实现学生录入系统的实战,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-02-02
  • vue-cli如何关闭Uncaught error的全屏提示

    vue-cli如何关闭Uncaught error的全屏提示

    这篇文章主要介绍了vue-cli如何关闭Uncaught error的全屏提示问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • vue将秒数转成"时分秒"格式实例代码

    vue将秒数转成"时分秒"格式实例代码

    在项目中,请求后台接口返回的值是秒,这篇文章主要给大家介绍了关于vue将秒数转成"时分秒"格式的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • Vue.js实现的计算器功能完整示例

    Vue.js实现的计算器功能完整示例

    这篇文章主要介绍了Vue.js实现的计算器功能,结合完整实例形式分析了vue.js响应鼠标事件实现基本的数值运算相关操作技巧,可实现四则运算及乘方、开方等功能,需要的朋友可以参考下
    2018-07-07
  • 使用Vue Router进行路由组件传参的实现方式

    使用Vue Router进行路由组件传参的实现方式

    Vue Router 为 Vue.js 应用提供了完整的路由解决方案,其中包括了组件间的数据传递功能,通过路由组件传参,我们可以轻松地在导航到新页面时传递必要的数据,本文将深入探讨如何使用 Vue Router 进行路由组件间的传参,并通过多个示例来展示其实现方式
    2024-09-09

最新评论