vue实现拖拽

vue实现拖拽

方法一: 函数封装拖拽脚本
js脚本

export function dragBox (drag, wrap) {
  function getCss (ele, prop) {
    return parseInt(window.getComputedStyle(ele)[prop])
  }
  let initX
  let initY
  let dragable = false
  let wrapLeft = getCss(wrap, 'left')
  let wrapRight = getCss(wrap, 'top')

  drag.addEventListener('mousedown', function (e) {
    dragable = true
    initX = e.clientX
    initY = e.clientY
  }, false)

  document.addEventListener('mousemove', function (e) {
    if (dragable === true) {
      let nowX = e.clientX
      let nowY = e.clientY
      let disX = nowX - initX
      let disY = nowY - initY
      wrap.style.left = wrapLeft + disX + 'px'
      wrap.style.top = wrapRight + disY + 'px'
    }
  })
  drag.addEventListener('mouseup', function (e) {
    dragable = false
    wrapLeft = getCss(wrap, 'left')
    wrapRight = getCss(wrap, 'top')
  }, false)
}

页面使用

<template>
	<div id="boxFindWindow">
        <div
          v-show="show"
          id="findwindow"
        />
 	</div>
</template>
<script>
import { dragBox } from '@/utils/common'

	mounted () {
		this.$nextTick(() => {
        dragBox(document.querySelector('#findwindow'), document.querySelector('#boxFindWindow'))
      })
	}
</script>
<style>
	#boxFindWindow{
  position: absolute;
  top: 0px;
  left: 70%;
  cursor: move;
  z-index: 3000;
  #findwindow{
    border-color: #999;
    box-shadow: 0px 2px 3px -1px #333;
  }
}
</style

方法二: 封装vue指令实现拖拽
1.drag.js 拖拽指令的js代码

export default {
  install: Vue => {
    Vue.directive('drag', {
      // 只调用一次,指令第一次绑定到元素时调用,用这个钩子函数可以定义一个在绑定时执行一次的初始化动作
      bind: function () { },
      inserted: function (el, binding) {
        let dragable = false
        el.onmousedown = function (e) {
          dragable = true
          const dx = e.clientX - el.offsetLeft
          const dy = e.clientY - el.offsetTop
          el.onmousemove = function (e) {
            if (dragable) {
              e.stopPropagation()
              const left = e.clientX - dx
              const top = e.clientY - dy
              el.style.left = left + 'px'
              el.style.top = top + 'px'
            }
          }
          document.onmouseup = function (e) {
            dragable = false
            e.onmousemove = null
            document.mouseup = null
          }
          return false
        }
      },
      update: function () {
        // b被绑定元素所在的模板更新时调用,而不论绑定值是否变化。通过比较更新前后的绑定值,可以忽略不必要的模板更新
      },
      componentUpdated: function () {
        // 被绑定元素所在模板完成一次更新周期时调用
      },
      unbind: function () {
        // 只调用一次, 指令与元素解绑时调用
      }
    })
  }
}

2.inject.js 自定义组件和方法

import Vue from 'vue'
import drag from '@/plugins/drag'
Vue.use(drag)
export default {
  install (Vue) {
}

3.main.js中 引入自定义组件和方法

// initialize base framework
import Vue from 'vue'
import store from '@/plugins/store'
import inject from '@/plugins/inject'
import router from '@/plugins/router'
import App from './App'
// 注入自定义组件和方法
Vue.use(inject)
/* eslint-disable no-new */
new Vue({
  el: '#app',
  store,
  router,
  components: { App },
  template: '<App/>'
})


  1. 使用
<div v-if='isShowVideo' class="videoStyle" v-drag="greet">
</div>
### Vue 实现拖拽横向滚动效果 #### HTML 结构 HTML 部分定义了一个 `scroll-container` 容器和一个 `scroll-content` 子元素,后者包含了实际要滚动的内容。 ```html <div class="scroll-container"> <div class="scroll-content" ref="content"> <!-- 插槽内容 --> <slot></slot> </div> </div> ``` #### CSS 样式 CSS 负责确保内容不会换行并保持在同一行显示。同时也设置了当用户悬停准备拖拽时鼠标的样式变化。 ```css .scroll-container { overflow-x: auto; white-space: nowrap; /* 确保内部元素不换行 */ } .scroll-content { display: inline-block; } /* 改变鼠标指针形状以提示可以拖拽 */ .scroll-container:hover { cursor: grab; } ``` #### JavaScript 功能逻辑 在组件挂载完成后通过 `mounted()` 生命周期钩子函数添加必要的事件监听器来处理用户的交互行为。这些操作包括但不限于按下、移动以及释放鼠标按钮的动作捕捉,从而实现平滑的拖拽滚动体验[^1]。 ```javascript export default { name: 'DragScroll', mounted() { const content = this.$refs.content; let isDown = false; let startX, scrollLeft; content.addEventListener('mousedown', (e) => { isDown = true; startX = e.pageX - content.offsetLeft; scrollLeft = content.scrollLeft; }); window.addEventListener('mouseup', () => { isDown = false; }); window.addEventListener('mousemove', (e) => { if (!isDown) return; e.preventDefault(); const x = e.pageX - content.offsetLeft; const walk = (x - startX); content.scrollLeft = scrollLeft - walk; }); } }; ``` 上述代码展示了如何创建一个简单的基于 Vue 的自定义组件来进行拖拽式的水平方向上的滚动控制。此方法不仅适用于普通的 div 元素集合,也可以被扩展应用到更复杂的场景比如表格中的列头部分或者图片轮播展示等场合中去[^2]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值