通过Vue自定义指令实现窗口拖拽

直接上代码

<template>
	<h1>这是背景</h1>
    <!-- 视频弹窗 -->
    <div class="hover-div" >
      <video class="hover-div-video" v-drag:[office] autoplay="autoplay" controls="controls" muted="muted" controlsList="nodownload" >
        <source src="http://127.0.0.1/test/video/test.mp4" type="video/mp4">
      </video>
    </div>
</template>

<script>
	export default {
		data() {
		    return {
		      collapsed: false,
		      realName: "",
		      welcomeText: "",
		      imgStr: "",
		      // 视频弹窗拖拽初始位置
		      office: {
		        right: 100,
		        top: 50
		      }
		    };
	    },
	    computed: {},
	    methods: {},
	    mounted() {},
		// 自定义指令: drag,用于拖拽组件
		directives: {
			drag: {
		      inserted: function (el, binding) {
		        el.style.position = "absolute";
			    	el.style.left = binding.arg.left + "px";
			        el.style.top = binding.arg.top + "px";
			        el.onmousedown = function (e) {
				        var x = e.clientX - el.offsetLeft;
			            var y = e.clientY - el.offsetTop;
				        document.onmousemove = function (eve) {
				        	el.style.left = eve.clientX - x + "px";
				            el.style.top = eve.clientY - y + "px";
				        }
				        document.onmouseup = function () {
				            document.onmousemove = null;
				            document.onmouseup = null;
				        }
		        	}
		        }
	    	}

		},

	}
</script>
<style lang="scss" scoped>
.hover-div {
  background: #ffffff;
  width: 17%;
  height: 20%;
  position: fixed;
  bottom: 5rem;
  right: 2rem;
  padding:5px;
  background-color:rgba(0,0,0,0);
  border-bottom-left-radius: 5px;
  border-bottom-right-radius: 5px;
  border-top-left-radius: 5px;
  border-top-right-radius:5px;
  .hover-div-video {
    width: 100%;
    height: 100%;
    object-fit: fill;
  }
}

</style>

在上述代码中,涉及到的各参数及样式效果如下:

  1. <video> 标签的属性:

    • autoplay="autoplay":该属性设置视频自动播放,当视频加载完成后会自动开始播放。
    • controls="controls":该属性显示视频的控制条,让用户可以控制视频的播放、暂停、音量等。
    • muted="muted":该属性将视频设置为静音播放,使得视频默认以静音方式进行播放。
    • controlsList="nodownload":该属性隐藏下载按钮,防止用户通过视频控件下载视频。
  2. v-drag:[office]

    • v-drag:这是一个自定义指令,用于实现窗口拖拽功能。
    • :office:这是指令的参数,通过 v-drag:[office]office 对象传递给拖拽指令,指定了视频弹窗的初始位置。
  3. data 选项中的 office 对象:

    • office 对象包含 righttop 两个属性,分别表示视频弹窗的初始位置距离右侧和顶部的像素值。在本例中,设置为 right: 100top: 50
  4. 模板中的样式:

    • .hover-div:这个类定义了视频弹窗的样式。具体样式包括白色背景、固定位置、底部距离为 5rem、右侧距离为 2rem、边框圆角等。
    • .hover-div-video:这个类定义了视频标签的样式,包括宽度和高度为 100%object-fit: fill 设置了视频的填充方式,保持视频的宽高比并填充整个容器。

总结:

以上代码实现了一个视频弹窗,并通过自定义指令 v-drag 实现了视频窗口的拖拽功能。视频弹窗有固定的样式,包括白色背景、固定位置、底部距离、右侧距离和边框圆角等。视频的播放、暂停、音量控制等操作可以通过控制条进行。

参考文章

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
实现小方块的拖拽效果,可以通过自定义指令实现。以下是实现步骤: 1. 在指令中绑定拖拽元素的事件监听器,包括mousedown、mousemove和mouseup事件。 2. 在mousedown事件中记录鼠标按下时的位置和拖拽元素的初始位置。 3. 在mousemove事件中计算鼠标移动的距离,并将拖拽元素的位置进行相应的调整。 4. 在mouseup事件中清除事件监听器。 下面是一个实现小方块拖拽效果的自定义指令的示例代码: ```javascript // 注册自定义指令 Vue.directive('drag', { bind: function (el, binding, vnode) { // 记录拖拽元素的初始位置 var initX, initY, startX, startY; // 鼠标按下时的事件处理函数 function mouseDownHandler(e) { initX = el.offsetLeft; initY = el.offsetTop; startX = e.clientX; startY = e.clientY; // 添加事件监听器 document.addEventListener('mousemove', mouseMoveHandler); document.addEventListener('mouseup', mouseUpHandler); } // 鼠标移动时的事件处理函数 function mouseMoveHandler(e) { var deltaX = e.clientX - startX; var deltaY = e.clientY - startY; // 计算拖拽元素的新位置 var newX = initX + deltaX; var newY = initY + deltaY; // 设置拖拽元素的新位置 el.style.left = newX + 'px'; el.style.top = newY + 'px'; } // 鼠标松开时的事件处理函数 function mouseUpHandler() { // 移除事件监听器 document.removeEventListener('mousemove', mouseMoveHandler); document.removeEventListener('mouseup', mouseUpHandler); } // 添加鼠标按下事件监听器 el.addEventListener('mousedown', mouseDownHandler); } }); ``` 使用该指令时,只需要在需要实现拖拽效果的小方块元素上添加v-drag指令即可: ```html <div v-drag class="drag-box"></div> ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值