最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Vue實現(xiàn)dom元素拖拽并限制移動范圍的操作代碼

 更新時間:2023年12月04日 16:44:56   作者:Nicholson07  
這篇文章主要介紹了Vue實現(xiàn)dom元素拖拽并限制移動范圍的操作代碼,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下

需求

       dom元素拖拽并限制在父組件范圍內(nèi)

拖拽功能封裝

export const initVDrag = (vue) => {
	vue.directive('drag', (el) => {
		const oDiv = el // 當(dāng)前元素
		oDiv.onmousedown = (e) => {
			let target = oDiv
			while (
				window.getComputedStyle(target).position !== 'absolute' &&
				target !== document.body
			) {
				target = target.parentElement
			}
			let parent = target.parentNode
			document.onselectstart = () => {
				return false
			}
			if (!target.getAttribute('init_x')) {
				target.setAttribute('init_x', target.offsetLeft)
				target.setAttribute('init_y', target.offsetTop)
			}
			// e.clientX, e.clientY是鼠標(biāo)點擊的位置
			// target.offsetLeft, target.offsetTop是當(dāng)前元素左上角的位置
			// 計算鼠標(biāo)按下的位置距離當(dāng)前元素左上角的距離
			const disX = e.clientX - target.offsetLeft
			const disY = e.clientY - target.offsetTop
			// target.clientWidth, target.clientHeight是當(dāng)前元素的尺寸
			// parent.clientWidth, parent.clientHeight是父元素的尺寸
			// parent.offsetLeft, parent.offsetTop是父元素左上角的位置
			// 可移動范圍的位置
			const minX = parent.offsetLeft
			const maxX = parent.offsetLeft + parent.clientWidth - target.clientWidth
			const minY = parent.offsetTop
			const maxY = parent.offsetTop + parent.clientHeight - target.clientHeight
			document.onmousemove = (e) => {
				// 通過事件委托,計算移動的距離,e是最新的鼠標(biāo)位置,disX、disY是鼠標(biāo)剛點擊時的位置
				let l = e.clientX - disX
				let t = e.clientY - disY
				// 約束移動范圍在父元素區(qū)域內(nèi)
				if (l < minX) {
					l = minX
				} else if (l > maxX) {
					l = maxX
				}
				if (t < minY) {
					t = minY
				} else if (t > maxY) {
					t = maxY
				}
				// 給當(dāng)前元素樣式中的left和top賦值
				target.style.left = l + 'px'
				target.style.top = t + 'px'
			}
			document.onmouseup = (e) => {
				document.onmousemove = null
				document.onmouseup = null
				document.onselectstart = null
			}
			// 不return false的話,可能導(dǎo)致鼠標(biāo)黏連,鼠標(biāo)粘在dom上拿不下來,相當(dāng)于onmouseup失效
			return false
		}
	})
}

使用拖拽功能

        以vite為例:

vite-env.d.ts

...
declare module '@utils/directive/vDrag.js'
...

main.ts

...
import { createApp } from 'vue'
import { initVDrag } from '@/utils/directive/vDrag.js'
...
let instance: any = null
instance = createApp(App)
initVDrag(instance)
...

test.vue

<template>
    <div v-drag />
</template>

到此這篇關(guān)于Vue實現(xiàn)dom元素拖拽并限制移動范圍的文章就介紹到這了,更多相關(guān)vue dom元素拖拽內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 使用Vue-ECharts實現(xiàn)數(shù)據(jù)可視化圖表功能

    使用Vue-ECharts實現(xiàn)數(shù)據(jù)可視化圖表功能

    在前端開發(fā)中,經(jīng)常會遇到需要展示數(shù)據(jù)可視化的需求,比如柱狀圖、折線圖、餅圖等,這類需求不僅要求我們準(zhǔn)確地將數(shù)據(jù)呈現(xiàn)出來,還需要兼顧美觀與交互體驗,所以今天我們就來聊聊——Vue-ECharts,給大家介紹一下如何使用Vue-ECharts實現(xiàn)數(shù)據(jù)可視化圖表功能
    2025-05-05
  • Vue項目中使用v-for指令進行列表渲染以及優(yōu)化其性能

    Vue項目中使用v-for指令進行列表渲染以及優(yōu)化其性能

    Vue中v-for用于列表渲染,需配合key屬性提升性能,避免狀態(tài)混亂,優(yōu)化方法包括使用計算屬性、虛擬滾動、減少內(nèi)聯(lián)事件等,確保key唯一且非索引
    2025-07-07
  • Vue3 keep-alive用法及說明

    Vue3 keep-alive用法及說明

    這篇文章主要介紹了Vue3 keep-alive用法及說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2026-03-03
  • Vue實現(xiàn)購物車基本功能

    Vue實現(xiàn)購物車基本功能

    這篇文章主要為大家詳細(xì)介紹了Vue實現(xiàn)購物車的基本功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • 在vue-cli創(chuàng)建的項目中使用sass操作

    在vue-cli創(chuàng)建的項目中使用sass操作

    這篇文章主要介紹了在vue-cli創(chuàng)建的項目中使用sass操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • VUE-cli3使用 svg-sprite-loader

    VUE-cli3使用 svg-sprite-loader

    svg-sprite-loader 的插件,用來根據(jù)導(dǎo)入的 svg 文件自動生成 symbol 標(biāo)簽并插入 html,這篇文章主要介紹了VUE-cli3使用 svg-sprite-loader,需要的朋友可以參考下
    2018-10-10
  • vue項目中公用footer組件底部位置的適配問題

    vue項目中公用footer組件底部位置的適配問題

    footer為公用組件,其他頁面都需要引入。接下來通過本文給大家分享vue項目中公用footer組件底部位置的適配問題,需要的朋友可以參考下
    2018-05-05
  • VUE+elementui組件在table-cell單元格中繪制微型echarts圖

    VUE+elementui組件在table-cell單元格中繪制微型echarts圖

    這篇文章主要介紹了VUE+elementui組件在table-cell單元格中繪制微型echarts圖,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • 針對Vue路由history模式下Nginx后臺配置操作

    針對Vue路由history模式下Nginx后臺配置操作

    這篇文章主要介紹了針對Vue路由history模式下Nginx后臺配置操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-10-10
  • Vue如何優(yōu)雅地復(fù)制一行帶附件的表格數(shù)據(jù)

    Vue如何優(yōu)雅地復(fù)制一行帶附件的表格數(shù)據(jù)

    在做 Vue 項目的時候,大家是不是經(jīng)常遇到這樣的需求,點一下復(fù)制按鈕,把這行表格數(shù)據(jù)復(fù)制一份放在下方,除了附件字段之外其他都保留,所以本文我們就來看看如何優(yōu)雅地復(fù)制一行帶附件的數(shù)據(jù),不破壞原始數(shù)據(jù)結(jié)構(gòu)吧
    2025-09-09

最新評論

遂宁市| 凤山县| 阜城县| 安泽县| 保德县| 会同县| 青冈县| 甘洛县| 通河县| 遂宁市| 吕梁市| 鄱阳县| 景宁| 丹江口市| 余姚市| 海丰县| 板桥市| 额济纳旗| 汕尾市| 芒康县| 东辽县| 漳州市| 伊川县| 延长县| 白沙| 阿合奇县| 高清| 崇文区| 邯郸县| 望都县| 都兰县| 健康| 酒泉市| 雅安市| 吴川市| 南康市| 保靖县| 同江市| 义乌市| 奈曼旗| 岳普湖县|