日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

vue實現div可拖動位置也可改變盒子大小的原理

瀏覽:185日期:2022-11-22 09:14:59

以下是效果圖:實現了div盒子在固定區域的拖動,也可改變盒子的高度和寬度,當超出邊距后無法繼續改變大小

vue實現div可拖動位置也可改變盒子大小的原理

這里說一下大致原理:拖動和改變大小是分開來操作的,接下來分別說一下

盒子拖動

這里用到了js的三個鼠標事件,分別是onmousedown(鼠標按下)、onmousemove(鼠標移動)以及onmouseup(鼠標松開),大致流程就是鼠標按下拖動圖標進行拖動時,動態獲取當前div的left和top再重新賦值給當前div的top、left值,當鼠標松開再清除事件,至于固定在某個區域內拖動,在賦值的時候判斷當前top及left值是否超過限制區域的值,如果超過給最大值最小值

盒子改變大小

這里用到的也是盒子拖動的三個事件,當鼠標移入盒子左邊框觸發mousemove事件,動態計算盒子寬度重新賦值,鼠標松開注銷mousrmove事件,我將寬度和高度改變分別封裝了組件,用的時候直接調用就好

博主用的vue寫的,這里展示的也是銅鼓vue書寫的,其他都是大同小異,知道原理就好

// index.vue<template> <!-- demo --> <div id='maxBoxId'> <div : : > <div class='drag-content'> <div class='content-text'> <!-- 拖拽圖標 --> <div class='drag-icon'> <i @mousedown.stop='dragDiv($event)' @mouseup.stop='dragUp($event)' ></i> </div> {{ moveInfo.text }} </div> <!-- 寬度改變組件 --> <ChangeWidth :moveId='moveInfo.moveId' index='0' @widthChange='changeWidth' @clearEvent='clearEvent' /> <!-- 高度改變組件 --> <ChangeHeight :moveId='moveInfo.moveId' index='1' @heightChange='heightChange' @clearEvent='clearEvent' /> </div> </div> </div></template> <script>import ChangeWidth from ’../component/ChangeWidth’import ChangeHeight from ’../component/ChangeHeight’export default { components: { ChangeWidth, ChangeHeight }, name: ’demo’, data() { return { moveInfo: { dragId: ’smallDragBoxId’, moveId: ’smallMoveBoxId’, text: ’我是拖動的小盒子’, width: 400, height: 100, // 上邊距和左邊距 coordinate: { x: 180, y: 10 } } } }, methods: { // 區塊拖動 dragDiv(el, index) { // dragId: 可拖動區域唯一標識 // moveId: 改變寬度組件唯一標識 const { dragId, coordinate } = this.moveInfo let obig = document.getElementById(’maxBoxId’) let osmall = document.getElementById(dragId) // 用于保存小的div拖拽前的坐標 osmall.startX = el.clientX - osmall.offsetLeft osmall.startY = el.clientY - osmall.offsetTop document.onmousemove = e => { let left, top left = e.clientX - osmall.startX top = e.clientY - osmall.startY osmall.style.left = left + ’px’ osmall.style.top = top + ’px’ coordinate.x = left coordinate.y = top if (left <= 0) { osmall.style.left = 0 + ’px’ coordinate.x = 0 } if (top <= 0) { osmall.style.top = 0 + ’px’ coordinate.y = 0 } if (left >= obig.offsetWidth - osmall.offsetWidth) { osmall.style.left = obig.offsetWidth - osmall.offsetWidth + ’px’ coordinate.x = obig.offsetWidth - osmall.offsetWidth } if (top >= obig.offsetHeight - osmall.offsetHeight) { osmall.style.top = obig.offsetHeight - osmall.offsetHeight + ’px’ coordinate.y = obig.offsetHeight - osmall.offsetHeight } } }, dragUp(el) { document.onmousemove = null document.onmouseup = null // 調用接口保存數據 }, // 改變drag寬度尺寸 changeWidth(params) { const { index, width } = params let left const { dragId } = this.moveInfo // let obig = document.getElementById(’maxBoxId’) let osmall = document.getElementById(dragId) let boxWidth = document.getElementById(’maxBoxId’).offsetWidth left = osmall.style.left const newWidth = this.moveInfo.width + width // outWidth拖動寬度時超出box的寬度 const outWidth = Number(left.slice(0, left.length - 2)) + Number(newWidth) - Number(boxWidth) // 如果超出box將截取留下的 if (outWidth >= 0) { this.moveInfo.width = Number(boxWidth) - Number(left.slice(0, left.length - 2)) } else { this.moveInfo.width = newWidth } // 設置div的最小寬度和最大寬度 if (this.moveInfo.width < 200) { this.moveInfo.width = 200 } if (this.moveInfo.width > 900) { this.moveInfo.width = 900 } }, // 改變drag高度 heightChange(params) { const { index, height } = params let top let osmall = document.getElementById(this.moveInfo.dragId) let boxHeight = document.getElementById(’maxBoxId’).offsetHeight top = osmall.style.top const newHeight = this.moveInfo.height + height // outHeight拖動寬度時超出box的高度 const outHeight = Number(top.slice(0, top.length - 2)) + Number(newHeight) - Number(boxHeight) // 如果超出box將截取留下的 if (outHeight >= 0) { this.moveInfo.height = Number(boxHeight) - Number(top.slice(0, top.length - 2)) } else { this.moveInfo.height = newHeight } // 設置div的最小寬度和最大寬度 if (this.moveInfo.height < 100) { this.moveInfo.height = 100 } if (this.moveInfo.height > 200) { this.moveInfo.height = 200 } }, // 清除鼠標事件 clearEvent() { document.onmousemove = null document.onmouseup = null } }}</script><style lang='scss' scoped>.demo { position: relative; width: 100%; z-index: 10; width: 1200px; background: red; height: 300px; margin-bottom: 1000px; margin-left: 100px; .drag-class { background: rgba(255, 255, 255, 0); position: absolute; .drag-content { position: relative; height: 100%; .content-text { border: 1px dashed #ffffff; font-size: 34px; color: #ffffff; margin-top: 5px; position: relative; height: 100%; .drag-icon { position: absolute; right: 10px; top: 5px; float: left; // margin-right: 10px; .down-dragger { cursor: move; font-size: 30px; color: #dbdce0; color: #ffffff; } } } } }}</style>

以下是改變大小的組件

<template> <!-- 拖動右邊距改變div寬度 --> <div : @mousedown='mouseDown'></div></template> <script>export default { name: ’ChangeWidth’, props: [’index’, ’moveId’], data() { return { lastX: ’’ } }, created() { document.addEventListener(’mouseup’, this.mouseUp) }, destroyed() { document.removeEventListener(’mouseup’, this.mouseUp) }, methods: { mouseDown(event) { document.addEventListener(’mousemove’, this.mouseMove) this.lastX = event.screenX }, mouseMove(e) { this.$emit(’widthChange’, { width: e.screenX - this.lastX, index: this.index }) this.lastX = e.screenX }, mouseUp() { this.lastX = ’’ document.removeEventListener(’mousemove’, this.mouseMove) this.$emit(’clearEvent’) } }}</script><style lang='less' scoped>.x-handle { width: 5px; cursor: e-resize; background: #2866f0; height: 30px; position: absolute; right: 0; top: 40%;}</style>

改變高度的組件原理和寬度一樣,避免代碼重復就不上傳了

上面就是大致流程和源碼。

總結

到此這篇關于vue實現div可拖動位置也可改變盒子大小的文章就介紹到這了,更多相關vue 實現div拖動位置內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Vue
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
亚洲欧美一级| 黄色成人精品网站| 午夜欧美巨大性欧美巨大| 国产精品亚洲综合久久| 日本欧美大码aⅴ在线播放| 美国欧美日韩国产在线播放| 一本色道精品久久一区二区三区| 欧美/亚洲一区| 久久精品国产www456c0m| 99精品在线观看| 一本色道精品久久一区二区三区| 99久久精品费精品国产| 欧美一区久久久| 欧美不卡视频| 99国产精品视频免费观看一公开| 香蕉成人久久| 日本亚洲视频在线| 欧美久久亚洲| 精品一区电影| 另类中文字幕国产精品| 图片区亚洲欧美小说区| 亚洲欧美在线综合| 欧美极品中文字幕| 中文字幕成在线观看| 女人av一区| 蜜桃91丨九色丨蝌蚪91桃色| 天堂精品久久久久| 精品国产欧美日韩| 免费精品国产的网站免费观看| 在线国产日韩| 精品一区二区三区视频在线播放| 久久激情一区| 中文字幕av亚洲精品一部二部 | 亚洲综合日韩| 婷婷精品在线观看| 捆绑调教美女网站视频一区| 久久久久免费av| 亚洲日本国产| 久久丁香四色| 九九在线精品| 亚洲一区有码| 国产不卡精品在线| 悠悠资源网久久精品| 久久精品凹凸全集| 久久久久国产一区二区| 亚洲毛片一区| 国产一区二区三区四区五区 | 日韩精品首页| 亚洲精品精选| 久久九九精品| 国产调教精品| 久久一区二区中文字幕| 涩涩涩久久久成人精品| 成人午夜亚洲| 日韩中文字幕不卡| 国产不卡av一区二区| 亚洲欧美不卡| 欧美国产专区| 巨乳诱惑日韩免费av| 国产福利资源一区| 9色精品在线| 日本一区二区高清不卡| 日韩中文字幕91| 香蕉视频成人在线观看| 国产精品一国产精品k频道56| 国产一区日韩欧美| 国产欧美日韩在线观看视频| 国产在线观看www| 中文字幕日本一区二区| 91视频久久| 日韩 欧美一区二区三区| 播放一区二区| 国产劲爆久久| 一本一道久久a久久| 日韩高清中文字幕一区二区| 日本午夜精品| 欧美/亚洲一区| 精品视频免费| 日本在线成人| 欧美日韩精品一本二本三本| 精品一二三区| 欧美日韩a区| 伊人久久亚洲影院| 日韩伦理福利| 麻豆传媒一区二区三区| 激情视频一区二区三区| 久久精品女人| 天堂va欧美ⅴa亚洲va一国产| 99久久婷婷这里只有精品| 国产精品午夜一区二区三区| 免费黄网站欧美| 日韩一级欧洲| 四虎影视精品| 精品国产乱码| 国产欧美在线| 欧美日本一区| 日韩精品免费一区二区夜夜嗨 | 免费视频一区二区三区在线观看 | 日本在线不卡视频一二三区| 午夜久久影院| 亚洲国产专区| 精品免费av在线| 亚洲天堂av影院| 91亚洲国产| 日本蜜桃在线观看视频| 免费在线观看一区| 国产精品一国产精品| 日韩av电影一区| 视频一区中文字幕精品| 免费一区二区视频| 免费日韩精品中文字幕视频在线| 激情五月综合| 亚洲精品网址| 亚洲女同中文字幕| 影音先锋久久| 亚洲一区激情| 午夜在线视频一区二区区别| 妖精视频成人观看www| 亚洲午夜精品久久久久久app| 免费一级欧美片在线观看网站 | 日韩制服丝袜先锋影音| 欧美高清一区| 欧美日韩国产一区二区三区不卡| 四虎884aa成人精品最新| 在线综合亚洲| 精品中文字幕一区二区三区| 欧美一区自拍| 亚洲aa在线| 日韩一二三区在线观看| 日本不卡的三区四区五区| 日本一区二区三区视频在线看| 免费久久99精品国产| 99国产精品久久久久久久成人热| 欧美日韩国产亚洲一区| 蜜臀久久99精品久久久画质超高清| 首页亚洲欧美制服丝腿| 亚洲精品黄色| 国产精品啊啊啊| 成人黄色av| 影视先锋久久| 亚洲欧美日韩综合国产aⅴ| 亚洲精品日韩久久| 国产九一精品| 国产精品原创| jiujiure精品视频播放| 亚洲黄色在线| 日本在线观看不卡视频| 国产伦精品一区二区三区在线播放 | 久久久精品五月天| 99视频一区| 国产伦精品一区二区三区视频| 精品亚洲a∨一区二区三区18| 亚洲精品88| 国产伦精品一区二区三区视频| 日韩一区亚洲二区| 激情久久99| 国产亚洲一区二区手机在线观看| 国模 一区 二区 三区| 免费视频久久| 久久不卡日韩美女| 精品亚洲免a| 激情欧美国产欧美| 亚洲精品一二三**| 成人精品久久| 蜜臀国产一区二区三区在线播放| 日韩高清中文字幕一区| 你懂的国产精品| 免费成人网www| 久久精品72免费观看| 最新中文字幕在线播放| 久久国产88| 精品色999| 亚洲免费精品| 欧美激情亚洲| 亚洲一区二区三区四区五区午夜 | 日韩精品1区2区3区| 免费亚洲一区| 精品91久久久久| 91欧美极品| 亚洲伊人精品酒店| 婷婷综合福利| 亚洲综合色婷婷在线观看| 亚州欧美在线| 国产精品一区二区中文字幕| 欧美日韩亚洲一区在线观看| 国产欧美日韩视频在线| 久久久9色精品国产一区二区三区| 亚洲我射av| 久久精品二区亚洲w码| 亚洲精品一区二区妖精| 国产精品magnet| 午夜欧美理论片| 精品高清久久| 四虎精品永久免费| 国产欧美日韩在线观看视频| 久久午夜精品一区二区| 欧美日一区二区| 欧美日一区二区三区在线观看国产免 | 青青草国产成人99久久| 视频福利一区|