dragSize自用(vue中使用,拖拽改变侧边栏宽度)

dragSize.js 

// eg: <div v-dragSize="{'max':500,'min':20}"></div>
const touch = { lastTime: 0, interval: 300, startX: 0 }
let move = 0; let element; let min = 100; let max = 300
// move 是鼠标移动的距离,min和max是可拖动范围
function mousemove_(e) {
  if (!touch.init) return
  move = e.pageX - touch.startX
  element.style.width =
        touch.width + move + 'px'
  if (touch.width + move > max) {
    element.style.width = max + 'px'
  }
  if (touch.width + move < min) {
    element.style.width = min + 'px'
  }
}
function mouseup_() {
  if (!touch.init) return
  touch.init = false
  document.removeEventListener('mousemove', mousemove_)
  document.removeEventListener('mouseup', mouseup_)
}

export const dragSize = {
  bind: function(el, binding) {
    if (el) {
      element = el
      max = binding.value.max
      min = binding.value.min
      el.style.position = 'relative'
      const dom = document.createElement('DIV')
      dom.style.height = '100%'
      dom.style.width = '3px'
      dom.style.position = 'absolute'
      dom.style.top = '0px'
      dom.style.right = '0px'
      dom.style.cursor = 'col-resize'
      dom.style.backgroundColor = 'transparent'
      dom.style.userSelect = 'none'
      dom.style.touchAction = 'none'
      dom.addEventListener('mousedown', function(e) {
        const now = +new Date()
        if (now - touch.lastTime < touch.interval) {
          return (touch.init = false)
        }
        touch.init = true
        touch.startX = e.pageX
        touch.width = el.offsetWidth
        document.addEventListener(
          'mousemove', mousemove_,
          { passive: false }
        )
        document.addEventListener('mouseup', mouseup_)
      })

      el.appendChild(dom)
    }
  },
  unbind: function(el, binding) {
    document.removeEventListener('mousemove', mousemove_)
    document.removeEventListener('mouseup', mouseup_)
  }
}

main.js中引用

import { dragSize } from '_c/dragSize'
Vue.directive('dragSize', dragSize)

vue文件中使用

<el-aside class="team-box" v-dragSize="{'max':500,'min':220}">
</el-aside>

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个C# TreeView控件选择多个节点拖拽移动的示例代码: ```csharp private List<TreeNode> selectedNodes = new List<TreeNode>(); private Point mouseDownLocation; private void treeView1_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left && ModifierKeys == Keys.Control) { //记录用户选择的节点 selectedNodes.Clear(); foreach (TreeNode node in treeView1.SelectedNodes) { selectedNodes.Add(node); } //记录鼠标按下的位置 mouseDownLocation = e.Location; } } private void treeView1_MouseMove(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left && selectedNodes.Count > 0) { //如果移动了一定的距离,开始拖拽操作 if (Math.Abs(e.X - mouseDownLocation.X) > SystemInformation.DragSize.Width || Math.Abs(e.Y - mouseDownLocation.Y) > SystemInformation.DragSize.Height) { //开始拖拽操作 treeView1.DoDragDrop(selectedNodes, DragDropEffects.Move); } } } private void treeView1_DragOver(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(typeof(List<TreeNode>))) { //判断鼠标位置是否在TreeView控件上 Point targetPoint = treeView1.PointToClient(new Point(e.X, e.Y)); TreeNode targetNode = treeView1.GetNodeAt(targetPoint); if (targetNode != null && targetNode.IsVisible) { e.Effect = DragDropEffects.Move; //展开目标节点 targetNode.Expand(); } else { e.Effect = DragDropEffects.None; } } } private void treeView1_DragDrop(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(typeof(List<TreeNode>))) { //获取拖拽操作的源节点和目标节点 Point targetPoint = treeView1.PointToClient(new Point(e.X, e.Y)); TreeNode targetNode = treeView1.GetNodeAt(targetPoint); List<TreeNode> draggedNodes = (List<TreeNode>)e.Data.GetData(typeof(List<TreeNode>))); //循环将所有源节点移动到目标节点下面 foreach (TreeNode node in draggedNodes) { if (node.Parent != targetNode) { node.Remove(); targetNode.Nodes.Add(node); } } //选移动后的节点 treeView1.SelectedNodes = draggedNodes; } } ``` 在上述代码,我们首先在MouseDown事件记录用户选择的节点,并记录鼠标按下的位置。然后在MouseMove事件,如果移动了一定的距离,就开始拖拽操作。在DragOver事件,判断鼠标位置是否在TreeView控件上,并展开目标节点。在DragDrop事件,获取拖拽操作的源节点和目标节点,并循环将所有源节点移动到目标节点下面。最后,选移动后的节点。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值