基于Vue怎么实现拖拉功能,定位的相关问题怎样解决
Admin 2022-06-14 群英技术资讯 897 次浏览
在实际应用中,我们有时候会遇到“基于Vue怎么实现拖拉功能,定位的相关问题怎样解决”这样的问题,我们该怎样来处理呢?下文给大家介绍了解决方法,希望这篇“基于Vue怎么实现拖拉功能,定位的相关问题怎样解决”文章能帮助大家解决问题。基于 vue
此功能核心思想就是通过 JavaScript 代码控制 node 在页面上的左边距与顶边距,不同的的样式定位方式有不同的解决方案
本方案采用position: absolute定位方式的解决方案
css 样式的核心代码
// 父容器核心样式 width: 100%; height: 100%;
// 子容器核心样式 position: absolute; top: 50%; left: 50%; transform: translate(-50%,-50%);
父容器通过width && height字段占满整个浏览器的可视范围,子容器通过position: absolute属性开启在父容器内的绝对定位,在通过top && left && transform: translate(-50%, -50%)属性控制子容器在父容器内的绝对位置
首先分解下,要实现 node 的移动需要哪些步骤和对应的 event 事件
只要使用 onMousedown、onMousemove和onMouseup 这三个事件,就可以实现最简单的移动
/*
* 在子容器创建的时候获取子容器相对于父容器的 top 和 left 位置
*/
mounted () {
this.left = this.$refs.fatherBox.offsetLeft
this.top = this.$refs.fatherBox.offsetTop
}
/*
* 鼠标按下时
* 1. 开启允许子容器移动的 flag
* 2. 记录鼠标点击时的位置信息
*/
mouseDown (e) {
// 设置允许弹窗移动的 flag
this.moveFlag = true
// 保存鼠标开始位置
this.startLeft = e.clientX - this.left
this.startTop = e.clientY - this.top
}
/*
* 鼠标移动时
* 1. 判断 flag 是否允许子容器移动
* 2. 设置弹框左边位置
* 3. 设置弹框右边位置
*/
move (e) {
// 判断 flag 是否允许移动
if (!this.moveFlag) return
// 设置弹框左边位置
this.left = e.clientX - this.startLeft
// 设置弹框右边位置
this.top = e.clientY - this.startTop
}
/*
* 鼠标按键弹起时
* 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 (
<ChildComponents
key={index}
ref={index}
zIndex={index}
visible={true}
backValue={this.backValue}
info={item}
width={600}
height={400}
/>
)
})
}
</div>
)
},
methods: {
backValue (left, top, zIndex) {
this.$refs[zIndex].$el.style.top = `${top}px`
this.$refs[zIndex].$el.style.left = `${left}px`
}
}
}
<!-- 父组件代码片段 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 值,或者子组件本身设置的默认值
* 2. 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
}
// 设置弹框左边位置
this.left = e.clientX - this.startLeft
// 设置弹框右边位置
this.top = e.clientY - this.startTop
// 调用回调函数把偏移量暴露给父组件
this.backValue(this.left, this.top, this.zIndex)
}
子组件还要设置一个当鼠标超出子容器时的 onmouseout 事件,用来防止不可预期的 bug 问题
mouseOut (e) {
this.moveFlag = false
}
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要介绍了CSS实现图片等比例缩小不变形,通过实例代码给大家介绍了css控制图片大小不变形的相关知识,需要的朋友参考下吧
这篇文章主要介绍了20个让你效率更高的CSS代码技巧(整理),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
现在很多网页都会添加弹窗效果,很多新手好奇要如何实现这个效果,以下图展示效果为了,也就是弹窗居中且背景半透明,这应该如何实现呢?下面就分享一个使用CSS实现的代码,感兴趣的朋友就继续往下看吧。
<div><p>1111</p></div>div{ width:980px;<br> background-color:#ccc;<br> height:300px;}p{width:100%;<br> /*width:auto;*/padding:10px;<br> background-color:#000;<br>}如果是p的width:100%,则说明p的width会得到980px就已经充满div区域,然后自己又有padd ...
这篇文章主要介绍了canvas绘制图片drawImage使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008