HTML 拖拉功能的实现代码

本文关键讲解了HTML 拖拖拉拉作用的完成代码,文中给各位讲解的特别详尽,对我们的学习培训或工作中具备一定的参考参考使用价值,必须的小伙伴能够参考下

根据 vue

此作用核心内容便是根据 JavaScript 代码操纵 node 在界面上的左侧距与顶部距,不一样的的样式定位方式有不一样的解决方案

本方法选用position: absolute定位方式的解决方案

css 样式的关键代码
1
2
3
4
// 父容器核心样式

width: 100%;
height: 100%;

1
2
3
4
5
// 子容器核心样式
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%,-50%);

父容器通过width && height字段占满整个浏览器的可视范围,子容器通过position: absolute属性开启在父容器内的绝对定位,在通过top && left && transform: translate(-50%, -50%)属性控制子容器在父容器内的绝对位置

JavaScript 逻辑控制的核心代码
首先分解下,要实现 node 的移动需要哪些步骤和对应的 event 事件

子容器创建时,在父容器内的绝对位置
鼠标按键按下时,onmousedown 事件
鼠标移动时,onmousemove 事件
鼠标按键弹起时,onmouseup 事件
只要使用 onMousedown、onMousemove和onMouseup 这三个事件,就可以实现最简单的移动

1
2
3
4
5
6
7
8
/*

  • 在子容器创建的时候获取子容器相对于父容器的 top 和 left 位置
    */

mounted () {
this.left = this. r e f s . f a t h e r B o x . o f f s e t L e f t t h i s . t o p = t h i s . refs.fatherBox.offsetLeft this.top = this. refs.fatherBox.offsetLeftthis.top=this.refs.fatherBox.offsetTop
}

1
2
3
4
5
6
7
8
9
10
11
12
13
/*

  • 鼠标按下时
    1. 开启允许子容器移动的 flag
    1. 记录鼠标点击时的位置信息
      */

mouseDown (e) {
// 设置允许弹窗移动的 flag
this.moveFlag = true
// 保存鼠标开始位置
this.startLeft = e.clientX - this.left
this.startTop = e.clientY - this.top
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/*

  • 鼠标移动时
    1. 判断 flag 是否允许子容器移动
    1. 设置弹框左边位置
    1. 设置弹框右边位置
      */

move (e) {
// 判断 flag 是否允许移动
if (!this.moveFlag) return

// 设置弹框左边位置
this.left = e.clientX - this.startLeft
// 设置弹框右边位置
this.top = e.clientY - this.startTop

}

1
2
3
4
5
6
7
8
/*

  • 鼠标按键弹起时
    1. 关闭允许子容器移动的 flag
      */

mouseUp (e) {
this.flag = false
}

通过这几个方法就可以获取鼠标按下移动时,鼠标的top 和 left 的偏移量,通过把这偏移量暴露出去给父组件,父组件实时设置子组件的 top 和 left 值,来使得子容器跟随鼠标的移动

父组件部分代码
父组件通过设置子组件的 ref、zIndex 值,而且父组件的 backValue 方法会从子组件接收 zIndex 值,通过 zIndex 来识别具体的子组件实例

/*

  • 父组件代码片段 jsx 版
    */

export default {
props: {
playList: {
type: Array,
required: true
}
},
render () {
return (
<div style={{width: ‘100%’, height: ‘100%’}} ref={‘father’}>
{
this.playList && this.playList.map((item, index) => {
return (

)
})
}

)
},
methods: {
backValue (left, top, zIndex) {
this. r e f s [ z I n d e x ] . refs[zIndex]. refs[zIndex].el.style.top = ${top}px
this. r e f s [ z I n d e x ] . refs[zIndex]. refs[zIndex].el.style.left = ${left}px
}
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

<!-- 父组件代码片段 vue 文件版 -->
 
<template>
  <div
    ref="father"
    style"width: 100%, height: 100%"
  >
    <ChildComponents
      v-for="(item, index) in playList"
      :key="index"
      :ref="index"
      :visible="true"
      :z-index="index"
      :back-value="backValue"
      :info="item"
      :close="close"
      :width="600"
      :height="400"
    />
  </div>
</template>
<script>
export default {
  components: {
    VideoPlayerModal
  },
  props: {
    playList: {
      type: Array,
      required: true
    }
  },
  methods: {
    backValue (left, top, zIndex) {
      this.$refs[zIndex][0].$el.style.top = `${top}px`
      this.$refs[zIndex][0].$el.style.left = `${left}px`
    }
  }
}
</script>

设置子组件的围栏范围
这个功能只需要在 onmousemove 事件中进行判断 子容器的 top 和 left 是否超出浏览器的可视范围

/*

    1. this.width 数据为父组件传递进来的 width 值,或者子组件本身设置的默认值
    1. this.height 数据为父组件传递进来的 height 值,或者子组件本身设置的默认值
      */

move (e) {
// 判断 flag 是否允许移动
if (!this.moveFlag) return

// 判断是否超出左边视图
if (this.$refs.fatherBox.offsetLeft < this.width / 2) {
// 禁止弹框移动
this.moveFlag = false
// 设置弹框左边位置
this.left = this.width / 2 + 10
// 调用回调函数把偏移量暴露给父组件
this.backValue(this.left, this.top, this.zIndex)
return
}

  // 判断是否超出右边视图
  if (this.$refs.fatherBox.offsetLeft > document.body.clientWidth - this.width / 2) {
    // 禁止弹框移动
    this.moveFlag = false
    // 设置弹框右边位置
    this.left = document.body.clientWidth - this.width / 2 - 10
    // 调用回调函数把偏移量暴露给父组件
    this.backValue(this.left, this.top, this.zIndex)
    return
  }

  // 判断是否超出顶部视图
  if (this.$refs.fatherBox.offsetTop < this.height / 2 + 70) {
    // 禁止弹框移动
    this.moveFlag = false
    // 设置弹框顶部位置
    this.top = this.height / 2 + 70 + 10
    // 调用回调函数把偏移量暴露给父组件
    this.backValue(this.left, this.top, this.zIndex)
    return
  }

  // 判断是否超出底部视图
  if (this.$refs.fatherBox.offsetTop > document.body.clientHeight - this.height / 2 - 50) {
    // 禁止弹框移动
    this.moveFlag = false
    // 设置弹框底部位置
    this.top = document.body.clientHeight - this.height / 2 - 50 - 10
    // 调用回调函数把偏移量暴露给父组件
    this.backValue(this.left, this.top, this.zIndex)
    return
       ( http://www.qlyl1688.com/articles/ycxzsq1302.html )
  }

  // 设置弹框左边位置
  this.left = e.clientX - this.startLeft
  // 设置弹框右边位置
  this.top = e.clientY - this.startTop

  // 调用回调函数把偏移量暴露给父组件
  this.backValue(this.left, this.top, this.zIndex)

}

子组件还要设置一个当鼠标超出子容器时的 onmouseout 事件,用来防止不可预期的 bug 问题

1
2
3
mouseOut (e) {
this.moveFlag = false
}

转自脚本之家

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: WPF 拖拉控件的代码可以通过实现 Thumb 和 DragDelta 事件来实现。在 Thumb 控件上添加 PreviewMouseLeftButtonDown 事件,添加 DragDelta 事件,在 DragDelta 事件中获取拖拽的 delta 值,然后更新控件的位置即可。 ### 回答2: WPF(Windows Presentation Foundation)是Microsoft开发的一种图形用户界面技术,可以构建富交互式的应用程序。在WPF中,实现控件拖拉代码可以使用拖放机制来完成。 首先,我们需要在XAML中定义一个需要拖拉的控件。例如,我们可以在Grid布局中添加一个Button控件,如下所示: ```xml <Grid> <Button Content="拖动我" Width="100" Height="50" DragEnter="Button_DragEnter" DragLeave="Button_DragLeave" MouseMove="Button_MouseMove"/> </Grid> ``` 接下来,在后台的C#代码中,我们需要处理拖放事件和鼠标移动事件。首先,我们需要定义拖动的起始位置和保存拖动的数据。 ```csharp private Point startPoint; private DataObject dataObject; ``` 然后,在鼠标移动事件(Button_MouseMove)中,我们可以获取鼠标的当前位置,并计算出拖动的距离。然后,我们可以在DataObject中保存相关的数据。 ```csharp private void Button_MouseMove(object sender, MouseEventArgs e) { if (e.LeftButton == MouseButtonState.Pressed) { Point currentPoint = e.GetPosition(null); Vector distance = startPoint - currentPoint; if (Math.Abs(distance.X) > SystemParameters.MinimumHorizontalDragDistance || Math.Abs(distance.Y) > SystemParameters.MinimumVerticalDragDistance) { dataObject = new DataObject(); dataObject.SetData("Button", sender as Button); DragDrop.DoDragDrop(sender as DependencyObject, dataObject, DragDropEffects.Move); } } } ``` 接下来,我们需要处理拖入和拖出事件(DragEnter和DragLeave)。在这些事件中,我们可以设置相关控件的效果,例如改变鼠标指针的样式。 ```csharp private void Button_DragEnter(object sender, DragEventArgs e) { Button button = e.Data.GetData("Button") as Button; button.Background = Brushes.Red; } private void Button_DragLeave(object sender, DragEventArgs e) { Button button = e.Data.GetData("Button") as Button; button.Background = Brushes.Transparent; } ``` 最后,在XAML中,我们需要给需要接受拖放的控件添加相应的事件处理程序。例如,我们可以给Grid布局添加拖放事件处理程序: ```xml <Grid AllowDrop="True" DragEnter="Grid_DragEnter" DragOver="Grid_DragOver" Drop="Grid_Drop"> <!-- 添加其他需要的控件 --> </Grid> ``` 在事件处理程序中,我们可以获取拖放的数据,并根据需要进行相应的操作。例如,我们可以将Button控件从原来的位置移动到拖放的位置。 ```csharp private void Grid_DragEnter(object sender, DragEventArgs e) { if (e.Data.GetDataPresent("Button")) { e.Effects = DragDropEffects.Move; } else { e.Effects = DragDropEffects.None; } } private void Grid_DragOver(object sender, DragEventArgs e) { if (e.Data.GetDataPresent("Button")) { e.Effects = DragDropEffects.Move; } else { e.Effects = DragDropEffects.None; } } private void Grid_Drop(object sender, DragEventArgs e) { if (e.Data.GetDataPresent("Button")) { Button button = e.Data.GetData("Button") as Button; Grid grid = sender as Grid; if (grid != null) { // 移动Button控件到拖放的位置 grid.Children.Add(button); } } } ``` 通过以上代码,我们可以实现WPF中控件的拖拉功能。在鼠标移动过程中,我们设置了一定的拖动距离阈值,保证只有在鼠标移动一定距离之后,才会触发拖放操作。在处理拖放事件时,我们可以根据不同的情况进行相应的操作,例如改变控件的效果、位置等。 ### 回答3: WPF(Windows Presentation Foundation)是一种用于创建可视化用户界面的微软技术。要实现控件拖拉功能,可以按照以下步骤进行编写代码: 1. 创建一个WPF应用程序,可以在XAML文件中添加所需的控件,如按钮、文本框等。 2. 在XAML文件中为控件设置拖拉功能。可以使用拖拉事件(DragEnter、DragOver、DragDrop等)和拖拉操作(DoDragDrop)。 ``` <Button Content="拖拉我" DragEnter="Button_DragEnter" DragOver="Button_DragOver" Drop="Button_Drop" /> ``` 3. 在代码文件中实现拖拉功能的事件处理程序。例如,在Button_DragEnter事件中设置允许拖拉的数据类型,并改变鼠标指针样式;在Button_DragOver事件中处理拖拉过程中的操作,如将控件随着鼠标移动;在Button_Drop事件中处理拖放完成后的操作,如将拖拽的数据提取出来并在相应位置进行处理。 ``` private void Button_DragEnter(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.Text)) { e.Effects = DragDropEffects.Copy; } else { e.Effects = DragDropEffects.None; } } private void Button_DragOver(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.Text)) { e.Effects = DragDropEffects.Copy; } else { e.Effects = DragDropEffects.None; } } private void Button_Drop(object sender, DragEventArgs e) { if (e.Data.GetDataPresent(DataFormats.Text)) { string data = (string)e.Data.GetData(DataFormats.Text); // 在此处处理拖放完成后的操作 } } ``` 4. 运行应用程序,可以在应用程序中拖动控件,并实现相应的拖拉功能。 以上是一个简单的示例代码,可以根据具体需求进行修改和扩展。拖拉功能可以帮助用户在界面上简化操作,并提升用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值