前端使用Vue和Element實現可拖動彈框效果,且不影響底層元素操作,Cesium作為底圖(可拖拽的視頻實時播放彈框,底層元素可以正常操作)

簡述:在前端開發中,彈框和實時視頻播放是常見的需求。這里來簡單記錄一下,如何使用Vue.js和Element UI實現一個可拖動的彈框,并在其中播放實時視頻。同時,確保在拖拽彈框時,底層元素仍然可以操作。這里來記錄一下


一、項目初始化,以Vue項目為例

首先,確保你的項目已經安裝了Element UI。如果沒有安裝,可以使用以下命令進行安裝并注冊:

npm install element-ui

// 或者

cnpm install element-ui


二、創建Vue組件

這里我們創建一個包含實時視頻播放功能的彈框組件。這個組件將使用Element UI的el-dialog組件,并添加拖動功能,同時添加CSS代碼。確保在拖拽時底層元素可以操作。

1. 彈框組件

<template><!-- 彈出框 --><el-dialogtitle="實時視頻播放":visible.sync="dialogVisible"width="30%":before-close="handleClose":modal="false":close-on-click-modal="false"class="cesium_dialog"><flvVue :Url="rtsp1" v-if="dialogVisible"></flvVue><span slot="footer" class="dialog-footer"> </span></el-dialog>
</template><script>export default {data() {return {dialogVisible: false, // 彈框顯示狀態rtsp1: 'rtsp://your-stream-url' // 實時視頻流地址};},methods: {// 打開彈框事件DialogOpen(RtspUrl) {this.dialogVisible = true; // 顯示彈框},// 關閉彈框事件handleClose() {this.dialogVisible = false; // 關閉彈框}},};};
</script><style>
/* 在你的 CSS 文件或 <style> 標簽中添加 */
::v-deep .el-dialog__wrapper {pointer-events: none !important; /* 禁用遮罩層的點擊事件 */
}
::v-deep .el-dialog__wrapper .el-dialog {pointer-events: auto !important; /* 允許對話框內的元素交互 */margin-top: 20vh !important; /* 設置彈框距頂部的距離 */
}
</style>

2. 拖拽功能的實現

創建一個draggable.js文件,用于實現彈框的拖拽功能:

// src/mixins/draggable.js
export default {mounted() {// 獲取對話框的頭部元素const dialogHeaderEl = this.$el.querySelector('.el-dialog__header');// 獲取整個對話框元素const dragDom = this.$el.querySelector('.el-dialog');// 設置頭部的光標為移動樣式,表示可以拖動dialogHeaderEl.style.cursor = 'move';// 函數用于獲取元素的計算樣式const getStyle = (function () {if (window.document.currentStyle) {// 對于舊版 IE,使用 currentStylereturn (dom, attr) => dom.currentStyle[attr];} else {// 對于現代瀏覽器,使用 getComputedStylereturn (dom, attr) => getComputedStyle(dom, false)[attr];}})();// 鼠標按下事件處理程序dialogHeaderEl.onmousedown = (e) => {// 計算鼠標點擊點相對于對話框頭部的偏移量const disX = e.clientX - dialogHeaderEl.offsetLeft;const disY = e.clientY - dialogHeaderEl.offsetTop;// 獲取對話框的寬度和高度const dragDomWidth = dragDom.offsetWidth;const dragDomHeight = dragDom.offsetHeight;// 獲取瀏覽器窗口的寬度和高度const screenWidth = document.body.clientWidth;const screenHeight = document.body.clientHeight;// 計算對話框拖動的邊界const minDragDomLeft = dragDom.offsetLeft; // 左邊界// 右邊界const maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidth; const minDragDomTop = dragDom.offsetTop; // 上邊界// 下邊界const maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomHeight; // 獲取對話框當前位置的樣式(左和上),處理 px 或百分比單位let styL = getStyle(dragDom, 'left');let styT = getStyle(dragDom, 'top');// 處理百分比單位,將其轉換為絕對像素值if (styL.includes('%')) {styL = +document.body.clientWidth * (+styL.replace(/%/g, '') / 100);styT = +document.body.clientHeight * (+styT.replace(/%/g, '') / 100);} else {// 處理 px 單位styL = +styL.replace(/px/g, '');styT = +styT.replace(/px/g, '');}// 鼠標移動事件處理程序document.onmousemove = function (e) {// 計算新的位置let left = e.clientX - disX;let top = e.clientY - disY;// 邊界處理:防止對話框拖動超出邊界if (-left > minDragDomLeft) {left = -minDragDomLeft;} else if (left > maxDragDomLeft) {left = maxDragDomLeft;}if (-top > minDragDomTop) {top = -minDragDomTop;} else if (top > maxDragDomTop) {top = maxDragDomTop;}// 更新對話框的位置dragDom.style.cssText += `;left:${left + styL}px;top:${top + styT}px;`;};// 鼠標釋放事件處理程序document.onmouseup = function () {// 解除鼠標移動和釋放事件的綁定document.onmousemove = null;document.onmouseup = null;};};}
};};

3. 整合拖拽功能

draggable.js文件混入到你的Vue組件中,使得彈框可以實現拖動功能,同時確保拖拽時底層元素仍然可以操作。

import draggable from "@/utils/hs/draggable.js"; // 引入拖拽功能export default {// 混入拖拽功能mixins: [draggable],data() {return {......};},methods: {......},};};


三. 完整代碼

1. Vue

<template><!-- 彈出框 --><el-dialogtitle="實時視頻播放":visible.sync="dialogVisible"width="30%":before-close="handleClose":modal="false":close-on-click-modal="false"class="cesium_dialog"><flvVue :Url="rtsp1" v-if="dialogVisible"></flvVue><span slot="footer" class="dialog-footer"> </span></el-dialog>
</template><script>
import draggable from "@/utils/hs/draggable.js"; // 引入拖拽功能export default {// 混入拖拽功能mixins: [draggable],data() {return {dialogVisible: false,rtsp1: 'rtsp://your-stream-url'};},methods: {DialogOpen(RtspUrl) {this.dialogVisible = true;},handleClose() {this.dialogVisible = false;}},};};
</script><style>
/* 在你的 CSS 文件或 <style> 標簽中添加 */
::v-deep .el-dialog__wrapper {pointer-events: none !important; /* 禁用遮罩層的點擊事件 */
}
::v-deep .el-dialog__wrapper .el-dialog {pointer-events: auto !important; /* 允許對話框內的元素交互 */margin-top: 20vh !important; /* 設置彈框距頂部的距離 */
}
</style>

2. JS

// src/mixins/draggable.jsexport default {mounted() {// 獲取對話框的頭部元素const dialogHeaderEl = this.$el.querySelector('.el-dialog__header');// 獲取整個對話框元素const dragDom = this.$el.querySelector('.el-dialog');// 設置頭部的光標為移動樣式,表示可以拖動dialogHeaderEl.style.cursor = 'move';// 函數用于獲取元素的計算樣式const getStyle = (function () {if (window.document.currentStyle) {// 對于舊版 IE,使用 currentStylereturn (dom, attr) => dom.currentStyle[attr];} else {// 對于現代瀏覽器,使用 getComputedStylereturn (dom, attr) => getComputedStyle(dom, false)[attr];}})();// 鼠標按下事件處理程序dialogHeaderEl.onmousedown = (e) => {// 計算鼠標點擊點相對于對話框頭部的偏移量const disX = e.clientX - dialogHeaderEl.offsetLeft;const disY = e.clientY - dialogHeaderEl.offsetTop;// 獲取對話框的寬度和高度const dragDomWidth = dragDom.offsetWidth;const dragDomHeight = dragDom.offsetHeight;// 獲取瀏覽器窗口的寬度和高度const screenWidth = document.body.clientWidth;const screenHeight = document.body.clientHeight;// 計算對話框拖動的邊界const minDragDomLeft = dragDom.offsetLeft; // 左邊界// 右邊界const maxDragDomLeft = screenWidth - dragDom.offsetLeft - dragDomWidth;const minDragDomTop = dragDom.offsetTop; // 上邊界// 下邊界const maxDragDomTop = screenHeight - dragDom.offsetTop - dragDomHeight; // 獲取對話框當前位置的樣式(左和上),處理 px 或百分比單位let styL = getStyle(dragDom, 'left');let styT = getStyle(dragDom, 'top');// 處理百分比單位,將其轉換為絕對像素值if (styL.includes('%')) {styL = +document.body.clientWidth * (+styL.replace(/%/g, '') / 100);styT = +document.body.clientHeight * (+styT.replace(/%/g, '') / 100);} else {// 處理 px 單位styL = +styL.replace(/px/g, '');styT = +styT.replace(/px/g, '');}// 鼠標移動事件處理程序document.onmousemove = function (e) {// 計算新的位置let left = e.clientX - disX;let top = e.clientY - disY;// 邊界處理:防止對話框拖動超出邊界if (-left > minDragDomLeft) {left = -minDragDomLeft;} else if (left > maxDragDomLeft) {left = maxDragDomLeft;}if (-top > minDragDomTop) {top = -minDragDomTop;} else if (top > maxDragDomTop) {top = maxDragDomTop;}// 更新對話框的位置dragDom.style.cssText += `;left:${left + styL}px;top:${top + styT}px;`;};// 鼠標釋放事件處理程序document.onmouseup = function () {// 解除鼠標移動和釋放事件的綁定document.onmousemove = null;document.onmouseup = null;};};}
};};


四. 請求RTSP視頻流播放,請看

前端請求RTSP視頻流播放icon-default.png?t=N7T8https://blog.csdn.net/weixin_65793170/article/details/140049511?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22140049511%22%2C%22source%22%3A%22weixin_65793170%22%7D


五. Cesium在項目中使用的詳細介紹,請看以下

Cesium在項目中的使用icon-default.png?t=N7T8https://blog.csdn.net/weixin_65793170/article/details/131204332


六. 小結

通過以上步驟,我們實現了一個可拖動的彈框,并在其中播放實時視頻。我們使用了Vue.js和Element UI,并通過自定義混入實現了拖拽功能。同時,通過設置pointer-events屬性,確保在拖拽彈框時底層元素仍然可以操作。

創作不易,感覺有用,就一鍵三連😄點贊、收藏加關注,感謝(●'?'●)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/44762.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/44762.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/44762.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vue 畫二維碼及長按保存

需求 想要做如下圖的二維碼帶文字&#xff0c;且能夠長按保存 前期準備 一個canvas安裝qrcode&#xff08;命令&#xff1a;npm i qrcode&#xff09; 畫二維碼及文字 初始化畫布 <template><div><canvas ref"canvas" width"300" he…

JAVASE進階day07(泛型,集合,Set,TreeSet,枚舉,數據結構)

泛型 1.泛型的基本使用 限制集合存儲的數據類型 package com.lu.day07.generics;/*** 定義了一個泛型類* E 泛型通配字母(不固定代替真實數據類型A-Z都可以)* 常見的泛型通配字母:* E:element 元素* T:type 類型* R:return 返回值類型* K:key 鍵* …

14.爬蟲---Selenium 經典動態渲染工具的使用

14.Selenium 經典動態渲染工具的使用 1.查看chrome瀏覽器版本2.ChromeDriver 安裝3.Selenium 安裝4.驗證安裝5.基本用法5.1啟動瀏覽器5.2導航到頁面5.3查找元素5.3.1單個元素 find_element5.3.2多個元素 find_elements 5.4 執行操作5.5 動作鏈ActionChains5.6 執行 JavaScript …

Python基礎語法:運算符詳解(算術運算符、比較運算符、邏輯運算符、賦值運算符)②

文章目錄 Python中的運算符詳解一、算術運算符二、比較運算符三、邏輯運算符四、賦值運算符五、綜合示例結論 Python中的運算符詳解 在Python編程中&#xff0c;運算符用于執行各種操作&#xff0c;例如算術計算、比較、邏輯判斷和賦值。了解并掌握這些運算符的使用方法是編寫…

pychopper的安裝與使用

文章目錄 安裝使用 安裝 在Linux環境下使用conda安裝 通常習慣一個軟件一個虛擬環境&#xff1a; conda create -n pychopper -c nanoporetech -c conda-forge -c bioconda "nanoporetech::pychopper"使用 參考官方文檔&#xff1a; https://github.com/epi2me-la…

N-(4-Azido-2-nitrophenyl)-N‘‘-biotinylnorspemidine

?一、基本信息 常用名&#xff1a;N-(4-Azido-2-nitrophenyl)-N-biotinylnorspemidine 英文名&#xff1a;N-(4-Azido-2-nitrophenyl)-N-biotinylnorspemidine CAS號&#xff1a;786609-83-4 分子式&#xff1a;C22H33N9O4S 分子量&#xff1a;519.62 二、結構特點 該化…

SQL職場必備:掌握數據庫技能提升職場競爭力

&#x1f482; 個人網站:【 摸魚游戲】【網址導航】【神級代碼資源網站】&#x1f91f; 一站式輕松構建小程序、Web網站、移動應用&#xff1a;&#x1f449;注冊地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;輕量化工具創作平臺&#x1f485; 想尋找共同學習交…

vue3 + tsx 表格 Action 單獨封裝組件用法

前言 先上圖看右側列 action 的 UI 效果&#xff1a; 正常來說&#xff0c;如果一個表格的附帶 action 操作&#xff0c;我們一般會放在最右側的列里面實現&#xff0c;這個時候有些UI 框架支持在 SFC 模板里面定義額外的 solt&#xff0c;當然如果不支持&#xff0c;更通用的…

【網絡】SCTP協議概念

SCTP協議 SCTP&#xff08;Stream Control Transmission Protocol&#xff09;是一種傳輸層協議&#xff0c;設計用于提供可靠的數據傳輸服務&#xff0c;同時具備一些類似UDP&#xff08;User Datagram Protocol&#xff09;的屬性。以下是SCTP協議的基本概念、優缺點以及與T…

Linux進行vi編譯代碼出現“E45: ‘readonly‘ option is set (add ! to override)”(完美解決)。

用vi修改文件&#xff0c;保存文件時&#xff0c;提示沒有修改該文件的權限“E45: ‘readonly’ option is set (add ! to override)”的解決方法。 E45: ‘readonly’ option is set (add ! to override) 如果您遇到了“當前用戶沒有權限對文件作修改”的錯誤 1. 檢查文件…

2024.7.11最新版IDM破解,操作簡單

前言 IDM的強勁對手&#xff0c;100%免費&#xff0c;如果破解IDM失敗&#xff0c;推薦使用FDM&#xff0c;下載地址&#xff1a;Free Download Manager 破解步驟 打開PowerShell&#xff0c;非CMD 在左下角開始菜單右鍵點擊后選擇PowerShell&#xff0c;注意不是打開CMD。…

園林類專刊《花卉》簡介及投稿郵箱

園林類專刊《花卉》簡介及投稿郵箱 《花卉》雜志是經國家新聞出版總署批準&#xff0c;廣東省農業科學院主管&#xff0c;廣東省農業科學院環境園藝研究所主辦&#xff0c;面向國內外公開發行林業系統專業期刊&#xff0c;是全國從事林業、園林、生態、環保、旅游、自然資源、…

CentOS7安裝部署git和gitlab

安裝Git 在Linux系統中是需要編譯源碼的&#xff0c;首先下載所需要的依賴&#xff1a; yum install -y curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker方法一 下載&#xff1a; wget https://mirrors.edge.kernel.org/pub/s…

【文檔+源碼+調試講解】冷凍倉儲管理系統

摘 要 隨著互聯網時代的到來&#xff0c;同時計算機網絡技術高速發展&#xff0c;網絡管理運用也變得越來越廣泛。因此&#xff0c;建立一個B/S結構的冷凍倉儲管理系統&#xff0c;會使冷凍倉儲管理系統工作系統化、規范化&#xff0c;也會提高冷凍倉儲管理系統平臺形象&#x…

現在國內的ddos攻擊趨勢怎么樣?想了解現在ddos的情況該去哪看?

目前&#xff0c;國內的DDoS攻擊趨勢顯示出以下幾個特征&#xff1a; 攻擊頻次顯著增加&#xff1a;根據《快快網絡2024年DDoS攻擊趨勢白皮書》&#xff0c;2023年DDoS攻擊活動有顯著攀升&#xff0c;總攻擊次數達到1246.61萬次&#xff0c;比前一年增長了18.1%。 攻擊強度和規…

微軟子公司Xandr遭隱私訴訟,或面臨巨額罰款

近日&#xff0c;歐洲隱私權倡導組織noyb對微軟子公司Xandr提起了訴訟&#xff0c;指控其透明度不足&#xff0c;侵犯了歐盟公民的數據訪問權。據指控&#xff0c;Xandr的行為涉嫌違反《通用數據保護條例》&#xff08;GFPR&#xff09;&#xff0c;因其處理信息并創建用于微目…

Shader每日一練(2)護盾

Shader "Custom/Shield" {Properties{_Size("Size", Range(0 , 10)) 1 // 控制噪聲紋理縮放大小的參數_colorPow("colorPow", Float) 1 // 控制顏色強度的指數_colorMul("colorMul", Float) 1 // 控制顏色乘法因子_mainColor("…

多旋翼+VR眼鏡:10寸FPV穿越機技術詳解

FPV&#xff08;First Person View&#xff09;穿越機&#xff0c;是指通過第一人稱視角來駕駛的無人機&#xff0c;特別強調速度和靈活性&#xff0c;常常用于競賽、航拍和探索等領域。結合多旋翼設計和VR眼鏡&#xff0c;FPV穿越機為用戶提供了身臨其境的飛行體驗。 多旋翼技…

數據庫操作和ORM(對象關系映射)框架.creat insert .save區別

1. .create 用途&#xff1a;.create 方法通常用于創建一個新的實體&#xff08;Entity&#xff09;實例&#xff0c;并為其屬性設置初始值。這個方法不會立即將實體保存到數據庫中&#xff0c;而是返回一個配置好的實體實例&#xff0c;該實例可以被進一步修改或用于后續操作…

企業網站被攻擊的常見方式是什么,該如何去做防護

隨著互聯網的普及和人們對網絡使用的增加&#xff0c;網站安全問題變得越來越突出。無論是個人還是企業&#xff0c;都需要了解并采取措施來保護自己的網站和用戶數據的安全。本文介紹常見的網站安全攻擊方式、潛在危害及其預防措施&#xff0c;幫助全面了解網站安全的各個方面…