可移动框 弹窗 可拖拽的组件

电脑端:

<template><divv-if="show"ref="infoBox"@mousedown.stop="mouseDownHandler"class="info-box":style="styleObject"><slot></slot></div>
</template>
<script>
export default {name: "InfoBox",props: {width: {type: String,required: false,default: "29.9rem"},height: {type: String,required: false,default: "20.8rem"},show: {type: Boolean,// required: false,default: false}},data() {return {styleObject: {width: "400px",height: "300px"},// show: true,isMove: false};},mounted() {this.styleObject = {height: this.$props.height,width: this.$props.width};},methods: {mouseDownHandler(e) {const currentPosition = {x: this.$refs.infoBox.offsetLeft,y: this.$refs.infoBox.offsetTop};const startPosition = { x: e.clientX, y: e.clientY }; //获取当前点击位置console.log(currentPosition, startPosition);this.isMove = true;//注册鼠标移动事件document.addEventListener("mousemove", event_move => {if (!this.isMove) return;const offsetX = event_move.clientX - startPosition.x,offsetY = event_move.clientY - startPosition.y;// console.log(offsetX, offsetY);//修改弹框位置this.$refs.infoBox.style.left = `${currentPosition.x + offsetX}px`;this.$refs.infoBox.style.top = `${currentPosition.y + offsetY}px`;});//注册鼠标抬起事件document.addEventListener("mouseup", () => {this.isMove = false;});},mousemoveHandler() {},mouseUpHandler() {}}
};
</script>
<style lang="scss" scoped>
.info-box {// .box-size(400px,300px);position: absolute;top: 50%;left: 50%;transform: translate(-50%, -50%);// background: red;// border: 1px solid #3374ac;z-index: 999999;.nav {padding: 5px 10px;height: 35px;justify-content: space-between;.title {user-select: none; //禁止选中标题文字padding: 0px 5px;font-family: "AliMaMa";font-style: italic;font-size: 18px;color: #cee9f5;background-image: linear-gradient(to top, #00c6ff, #8affd2);/* 线性渐变背景,方向向上 */-webkit-background-clip: text;/* 背景被裁剪成文字的前景色 */-webkit-text-fill-color: transparent;/* 文字填充颜色变透明 */}.close {font-size: 20px;cursor: pointer;&:hover {color: rgb(0, 201, 252);}}}
}
</style>

移动端:

<template><divref="drawable":style="{left: left, top: top}"class="draggable-box"@touchstart="touchstart"@touchend="touchend"@touchmove="mousemove"><slot /><!-- <div style="width:30px;height:30px;border:1px solid red;background:red">11111111111111111111</div> --></div>
</template>
<script>
export default {name: "DrawableBox",props: {top: String,left: String,isOnlyLeft: Boolean,isOnlyRight: Boolean},data() {return {flag: false};},methods: {touchstart() {this.flag = true;// 禁用页面滚动条document.getElementById("app").style = "overflow: hidden;";this.$refs.drawable.style.transition = "none";},touchend() {this.flag = false;this.$refs.drawable.style.transition = "all 0.2s";document.getElementById("app").style = "overflow: auto;";let left = this.$refs.drawable.offsetLeft;let screenWidth = window.screen.width;let oWidth = this.$refs.drawable.offsetWidth;// 判断是回到左边还是右边// if (left + oWidth / 2 <= screenWidth / 2) {//   this.$refs.drawable.style.left = "0px";// } else {//   this.$refs.drawable.style.left = screenWidth - oWidth + "px";// }},mousemove(e) {// 禁止默认行为,防止在微信上打开和下拉冲突e.preventDefault();if (this.flag) {let clientY = e.targetTouches[0].clientY;let clientX = e.targetTouches[0].clientX;let offsetHeight = this.$refs.drawable.offsetHeight;let offsetWidth = this.$refs.drawable.offsetWidth;let top = clientY - offsetHeight / 2;let left = clientX - offsetWidth / 2;// 屏幕得宽度let screenWidth = window.screen.width;let screenHeight = window.screen.height;let maxTop = screenHeight - offsetHeight;let maxLeft = 0;const halfWidth = screenWidth / 2;if (this.isOnlyLeft) {maxLeft = halfWidth - offsetWidth / 2;} else {maxLeft = screenWidth - offsetWidth;}if (top <= 0) {top = 0;}if (top > maxTop) {top = maxTop;}if (this.isOnlyRight) {if (left <= halfWidth) {left = halfWidth;}} else {if (left <= 0) {left = 0;}}console.log(left, "left");console.log(maxLeft, "maxLeft maxLeft");left = left > maxLeft ? maxLeft : left;console.log(left, "left 后");this.$refs.drawable.style.top = top + "px";this.$refs.drawable.style.left = left + "px";}}}
};
</script>
<style lang="scss" scoped>
.draggable-box {position: fixed;z-index: 3000;
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/222723.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电脑如何定时关机?

电脑如何定时关机&#xff1f;我承认自己是个相当粗心的人&#xff0c;尤其是在急于离开时经常会忘记关闭电脑&#xff0c;结果就是电量耗尽&#xff0c;导致电脑自动关机。而且&#xff0c;在我使用电脑的时候&#xff0c;经常需要进行软件下载、更新等任务。如果我一直坐等任…

387. 字符串中的第一个唯一字符

这篇文章会收录到 :算法通关村第十二关-白银挑战字符串经典题目-CSDN博客 387. 字符串中的第一个唯一字符 描述 : 给定一个字符串 s &#xff0c;找到 它的第一个不重复的字符&#xff0c;并返回它的索引 。如果不存在&#xff0c;则返回 -1 。 题目 : 387. 字符串中的第一…

NFTScan | 11.20~11.26 NFT 市场热点汇总

欢迎来到由 NFT 基础设施 NFTScan 出品的 NFT 生态热点事件每周汇总。 周期&#xff1a;2023.11.20~ 2023.11.26 NFT Hot News 01/ OKX Ordinals 市场 API 完成升级 11 月 21 日&#xff0c;OKX Ordinals 市场 API 现已完成升级&#xff0c;新增支持按币种单价查询、排序&…

代码签名证书是如何保护软件?

随着互联网的普及和技术的发展&#xff0c;软件开发已经成为了一个非常重要的行业。然而&#xff0c;软件安全问题也日益凸显&#xff0c;恶意软件、病毒、木马等威胁着用户的数据安全和隐私。为了确保软件的安全和可靠性&#xff0c;开发者需要采取一系列措施来保护他们的产品…

西北大学计算机844考研-23年计网计算题详细解析

西北大学计算机844考研-23年计网计算题详细解析 1.计算无传输差错状态下停止—等待ARQ协议效率,电磁波传播速率为2*10^8m/s&#xff0c;链路长为2000m&#xff0c;帧长度为1000比特&#xff0c;计算传输速率10kbps及10Mbps时的协议效率&#xff08;即信道利用率&#xff09; …

什么是美颜sdk?视频直播美颜sdk技术深度剖析

美颜sdk可以通过实时处理图像&#xff0c;提升主播或用户在视频直播中的外观。通过美颜sdk接口调用可以轻松实现美颜效果。美颜sdk的核心目标是在保持图像真实性的同时&#xff0c;为用户创造出最理想的美化效果。 一、美颜sdk的技术实现 1.面部识别技术&#xff1a;美颜sdk…

tabs切换,组件库framework7

IOS和安卓兼容的背景下&#xff0c; 可以使用&#xff1a;framework7.io文档 效果展示&#xff1a; 代码&#xff1a; <!-- Top Tabs --> <div class"tabs tabs-top"><div class"tab tab1 active">...</div><div class"…

box-sizing属性,IE怪异盒模型

有没有遇到过这种情况&#xff1f; 当一个放在整个页面的容器&#xff0c;它的宽度定义为 width:100%; 之后。假设再添加 padding &#xff0c;border 或者 margin 则会溢出父容器&#xff0c;是向外扩张的&#xff0c;也就是说设置了之后看不到效果。 首先看盒模型&#xf…

研究前沿|NAR:一个综合性的植物代谢组数据库

引言 2023年10月&#xff0c;华中农业大学小麦改良创新团队陈伟教授课题组在Nucleic Acids Research发表题为“PMhub 1.0: a comprehensive plant metabolome database”的文章&#xff0c;系统介绍了他们开发的植物代谢分析网站&#xff08;PMhub&#xff09;的功能与价值。P…

许战海战略文库|主品牌升级为产业技术品牌,引领企业全球化发展

在当今高速发展的全球经济中&#xff0c;企业品牌已经成为其核心资产之一。这不仅仅是因为品牌可以为消费者带来识别度&#xff0c;更重要的是&#xff0c;它们可以为企业带来深厚的竞争壁垒。但对于许多企业来说&#xff0c;特别是技术密集型企业&#xff0c;仅仅依靠主品牌的…

DAPLINK接线以及下载烧录

DAPLINK接线以及使用方法 DAPLINK接线以及使用方法 DAPLINK接线以及使用方法一、DAPLINK接线二、下载烧录方法 一、DAPLINK接线 DAPLINK的3V3线连接STM32C8T6的3.3V DAPLINK的的GND连接STM32C8T6的GND DAPLINK的SWD连接STM32C8T6的DIO DAPLINK的SCK连接STM32C8T6的CLK 二、下载…

解析直播第三方美颜SDK:技术原理与应用

时下&#xff0c;直播平台和主播们纷纷引入美颜技术&#xff0c;以提升视觉效果和用户体验。而在众多美颜技术中&#xff0c;直播第三方美颜SDK成为许多开发者和平台的首选&#xff0c;因其灵活性和高效性而备受推崇。 一、技术原理&#xff1a;美颜算法的精髓 第三方美颜SDK…