首页 > 其他分享 >弹窗拖拽边界控制

弹窗拖拽边界控制

时间:2023-08-08 18:24:00浏览次数:34  
标签:el const 边界 app mousemove dragBind import 拖拽 弹窗

import {Directive,App} from "vue";
const getPxVal =(str: string) => {
    if(str && str.endsWith('px')) {
        return parseInt(str.substring(0,str.length-2))
    } else {
        return 0
    }
}
interface DragBind {
    mousemove: (e :MouseEvent) => void
    mousedown: (e :MouseEvent) => void
    mouseup: (e :MouseEvent) => void
}
const myDirective: Directive = {
    mounted(el: HTMLElement, binding, vnode, prevVnode) {
        console.log(binding)
        const title = el.children[0] as HTMLElement
        if (!title){
            return
        }

        let dragging: false;
        let dragPoint: {x:number,y:number,left:number,top: number}

        const dragBind = binding as unknown as DragBind
        dragBind.mousemove = (e: MouseEvent) => {
            const x = e.clientX - dragPoint.x
            const y = e.clientY - dragPoint.y
            debugger
            if(dragPoint.left+x<=0){
                el.style.left = '0px'
            }else{
                if(dragPoint.left+x+el.clientWidth >= document.documentElement.clientWidth){
                    el.style.left = (document.documentElement.clientWidth - el.clientWidth) +'px'
                }else{
                    el.style.left = (dragPoint.left + x) +'px'
                }
            }

            if(dragPoint.top+y<=0){
                el.style.top = '0px'
            }else{
                if(dragPoint.top+y+el.clientHeight >= document.documentElement.clientHeight){
                    el.style.top = (document.documentElement.clientHeight - el.clientHeight) +'px'
                }else{
                    el.style.top = (dragPoint.top + y) +'px'
                }

            }
        }
        dragBind.mousedown = (e: MouseEvent)=>{
            if (!dragging) {
                window.addEventListener('mousemove',dragBind.mousemove)
            }
            dragPoint = {
                x: e.clientX,y: e.clientY,left:getPxVal(el.style.left),top: getPxVal(el.style.top),
            }
        }
        dragBind.mouseup = (e: MouseEvent) => {
            console.log('mouseup')
            window.removeEventListener('mousemove',dragBind.mousemove)
            dragging = false
        }

        el.addEventListener('mousedown',dragBind.mousedown)
        el.addEventListener('mouseup',dragBind.mouseup)
    },
    unmounted(el: HTMLElement, binding) {
        const dragBind = binding as unknown as DragBind
        window.removeEventListener('mousemove',dragBind.mousemove)
        console.log('卸载')
    }
}

const applyApp = (app: App)=> {
    app.directive('dialog-x',myDirective)
}

export {
    applyApp
}
使用如下
import { createApp } from 'vue'

import { createPinia } from 'pinia'
import ElementPlus from 'element-plus'
// import 'element-plus/dist/index.css'
// import 'element-plus/theme-chalk/dark/css-vars.css'//这句是暗黑模式切换
import './el-custom.scss'

import router from './router/index2.ts'
import {applyApp} from "@/components/main/dialog/directive.ts";

import './style.css'
import App from './Main.vue'


const app = createApp(App)
applyApp(app)
const pinia = createPinia()
app.use(pinia)
app.use(ElementPlus)
app.use(router)
app.mount('#app')

标签:el,const,边界,app,mousemove,dragBind,import,拖拽,弹窗
From: https://www.cnblogs.com/xmyfsj/p/17615099.html

相关文章

  • 前后端数据传输的编码格式,Ajax提交json格式的数据,Ajax提交文件数据,AJax结合layer弹
    前后端数据传输的编码格式(contentType)#前后端数据传输的时候请求方式有2种:getpost我们不研究get请求的url?a=1&b=2#我们只研究post请求的编码格式三种编码格式:urlencodedform-datajson#可以通过哪些方式发送post请求form表单Ajaxpostman请求头中的Content-......
  • 微信小程序11 弹窗showToast,showLoading,showModal
    弹窗是相当常用的功能,在微信里用弹窗还是挺方便的。不同于我们写网页时,对于alert,confirm这些比较简陋的原生弹窗通常要引入第三方插件来美化,微信自带的弹窗效果还不错。放一个按钮,绑定showToast方法。<buttonbind:tap="showToast">点击弹窗1</button>Js方法通用showToast......
  • 2023年8月最新全国省市区县和乡镇街道行政区划矢量边界坐标经纬度地图数据 shp geojso
    发现个可以免费下载全国 geojson 数据的网站,推荐一下。支持全国、省级、市级、区/县级、街道/乡镇级以及各级的联动数据,支持导入矢量地图渲染框架中使用,例如:D3、Echarts等geojson数据下载地址:https://geojson.hxkj.vip该项目github地址:https://github.com/TangSY/echarts-m......
  • vue可拖拽悬浮按钮组件
    效果预览预览地址:http://120.79.163.94/JYeontuComponents/#/JHoverBtnView关键代码实现阻止默认拖动选择事件preventEvent(){ document.getElementById('j-hover-btn').ondragstart=function(){ returnfalse; }; document.getElementById('j-hover-btn').onselectstart......
  • 拖拽宫格vue-grid-layout详细应用及案例
    目录1、前言2、安装3、属性4、事件5、占位符样式修改6、案例1、前言vue-grid-layout是一个适用于vue的拖拽栅格布局库,功能齐全,适用于拖拽+高度/宽度自由调节的布局需求。本文将讲述一些常用参数和事件,以及做一个同步拖拽的Demo。效果动态图如下:2、安装vue2版本:npminstall......
  • javaee 泛型的上下边界和通配符的使用
    下边界packagecom.test.generic;importjava.util.Collection;publicclassTestGenericClass{ //泛型方法?extendsE:泛型的限定 publicstatic<E>voidmove(Collection<E>from,Collection<?superE>to) { for(Ee:from) { to.add(e......
  • 直播系统源代码,uniapp实现禁止video拖拽快进
    直播系统源代码,uniapp实现禁止video拖拽快进 <!--1.video标签--><videoid="myVideo"@timeupdate="videoFun":src="videourl"initial-time="initial_time"><script>exportdefault{data(){  //2.data数据部分return{videour......
  • Flutter 可以缩放拖拽的图片
    在pub上面找了下,没有发现一个效果跟微信一样的支持缩放拖拽效果的image,所以就自己撸了一个,之前写过Flutter什么功能都有的Image,于是就在这个上面新增了这个功能。主要功能:缩放拖拽在PageView里面缩放拖拽支持缩放拖拽image用法1.将extended_image的mode参数设置为ExtendedImageMod......
  • 全国各乡镇的边界数据,json格式适配echarts;
    湖南省的数据现有,联系我获取(免费、帮我看一下小程序);其他省份可通过联系我用脚本获取(要手动输入验证码),或者网站获取(tips:每个区县需要一个个手动下载,且每个下载需要输入验证码):https://www.poi86.com/ ......
  • fluent:壁面函数/边界层/y+
    速度边界层根据速度边界层理论:具有黏性的流体,经过壁面附近流速下降。所以在壁面处流体速度可以认为u=0,随着离壁面越来越远,流体速度也会增加。为什么要用壁面函数为了不划分更细的网格也可以捕捉到边界层速度,引入了壁面函数的说法,也就是y+。定义分母是运动粘度,其中y表示距离......