UniApp Vue3 TypeScript項目中使用xgplayer播放m3u8視頻的顯示問題

問題背景

在UniApp + Vue3 + TypeScript項目中使用xgplayer播放m3u8視頻時,遇到了一個棘手的問題:視頻畫面下移,只能聽到聲音,全屏后才能正常顯示。經過排查,發現是<video>元素在DOM渲染時被異常定位,導致其脫離父容器可視區域。

嘗試了多種CSS方案(如position: absolutetop: 0flex布局等)均未生效,甚至xgplayerinit()回調也未執行。最終,通過強制樣式注入的方式成功修復了問題。

本文將詳細介紹該問題的原因分析、解決方案及優化建議,幫助遇到類似問題的開發者快速定位和解決。
在這里插入圖片描述


1. 問題原因分析

(1) xgplayer動態渲染機制

xgplayer在初始化時,會動態創建<video>元素并插入DOM。由于UniApp(尤其是小程序和H5混合環境)的渲染機制,可能導致:

  • <video>元素的style被后續邏輯覆蓋
  • 異步加載導致CSS選擇器未正確應用
  • 層級(z-index)計算異常

(2) Scoped CSS的影響

在Vue單文件組件中,如果使用<style scoped>,生成的data-v-xxxx屬性可能影響xgplayer內部元素的樣式匹配,導致video定位失效。

(3) 瀏覽器/小程序環境差異

  • H5環境<video>可能受全局樣式污染
  • 小程序環境<video>組件可能被原生組件層級限制

2. 解決方案:強制樣式注入

由于常規CSS方案無效,最終采用JavaScript動態注入樣式,確保在<video>元素創建后立即修正其位置。

核心代碼

import { ref, onMounted } from 'vue';
import Player from 'xgplayer';
import 'xgplayer/dist/index.min.css';const playerContainer = ref<HTMLElement | null>(null);
const player = ref<Player | null>(null);onMounted(() => {if (!playerContainer.value) return;// 初始化播放器player.value = new Player({el: playerContainer.value,url: 'your-video.m3u8',width: '100%',height: '100%',videoInit: true,fluid: true,});// 延遲確保video元素已渲染setTimeout(() => {const videoElement = playerContainer.value?.querySelector('video');if (videoElement) {// 強制修正樣式videoElement.style.position = 'absolute';videoElement.style.top = '0';videoElement.style.left = '0';videoElement.style.zIndex = '10';videoElement.style.objectFit = 'fill'; // 防止拉伸變形}}, 500); // 適當延遲,確保DOM渲染完成
});

關鍵點

  1. setTimeout延遲執行

    • 由于xgplayer<video>是動態插入的,直接查詢可能獲取不到,因此需要短暫延遲(500ms足夠)。
  2. 直接操作DOM樣式

    • 使用element.style直接修改,優先級最高,不會被CSS覆蓋。
  3. objectFit: 'fill'

    • 防止視頻比例異常導致黑邊或裁剪。

3. 優化方案

(1) 使用MutationObserver監聽DOM變化

如果setTimeout不夠穩定,可以用MutationObserver監聽<video>元素的插入:

const observer = new MutationObserver((mutations) => {mutations.forEach((mutation) => {mutation.addedNodes.forEach((node) => {if (node.nodeName === 'VIDEO') {const video = node as HTMLVideoElement;video.style.position = 'absolute';video.style.top = '0';observer.disconnect(); // 找到后停止監聽}});});
});onMounted(() => {if (playerContainer.value) {observer.observe(playerContainer.value, { childList: true });// 初始化播放器...}
});onUnmounted(() => observer.disconnect());

4. 總結

根本原因

  • xgplayer動態渲染<video>,導致CSS無法直接控制。
  • Vue scoped樣式可能影響深層DOM。
  • 瀏覽器/小程序環境差異導致層級問題。

最佳實踐

方案適用場景優點缺點
強制樣式注入H5環境直接有效依賴setTimeout
MutationObserver動態DOM監聽更精準代碼稍復雜
封裝Hook多組件復用代碼整潔需要額外封裝
小程序兼容UniApp多端跨平臺支持需條件渲染

最終推薦

  • H5環境MutationObserver + 強制樣式注入。
  • 小程序環境:直接使用<video>組件。
  • 通用方案:封裝useXgPlayer Hook,提高復用性。

通過本文的方案,你應該能徹底解決xgplayer視頻下移的問題。如果仍有疑問,歡迎留言討論! 🚀

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

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

相關文章

服務器硬件電路設計之 I2C 問答(三):I2C 總線上可以接多少個設備?如何保證數據的準確性?

在服務器硬件電路設計中&#xff0c;I2C 總線作為常用的串行通信協議&#xff0c;其設備連接數量和數據準確性至關重要。?I2C 總線上可連接的設備數量并非無限制。從理論上講&#xff0c;標準 I2C 設備采用 7 位地址&#xff0c;除去保留地址&#xff0c;最多可連接 112 個設備…

用LaTeX優化FPGA開發:結合符號計算與Vivado工具鏈

用 LaTeX 優化 FPGA 開發&#xff1a;結合符號計算與 Vivado 工具鏈&#xff08;一&#xff09; 系列文章目錄 第一章&#xff1a;深入了解 LaTeX&#xff1a;科技文檔排版的利器 第二章&#xff1a;LaTeX 下載安裝保姆級教程 第三章&#xff1a;LaTeX 創建工程并生成完整文檔…

人工智能系列(6)如何開發有監督神經網絡系統?

一. 開發有監督神經網絡系統的步驟1. 數據收集訓練數據通常由輸入–輸出成對組成&#xff0c;根據任務需求可能涵蓋不同情境&#xff08;如白天或夜晚的車輛識別&#xff09;&#xff0c;其類型可以是數值、圖像、音頻等多種形式&#xff1b;數據規模越大、越多樣&#xff0c;模…

CSS 選擇器進階:用更聰明的方式定位元素

在前端開發中&#xff0c;CSS 選擇器是我們與 DOM 對話的語言。雖然 class 和 id 是我們最熟悉的工具&#xff0c;但真正高效、優雅的樣式代碼&#xff0c;往往來自于對現代 CSS 選擇器的深入理解與巧妙運用。本文將帶你跳出基礎語法&#xff0c;探索那些能顯著提升開發效率和代…

常用排序方法

一、排序的概念及引用1、排序的概念排序&#xff1a;所謂排序&#xff0c;就是使一串記錄&#xff0c;按照其中的某個或某些關鍵字的大小&#xff0c;遞增或遞減的排列起來的操作。穩定性&#xff1a;假定在待排序的記錄序列中&#xff0c;存在多個具有相同的關鍵字的記錄&…

接口返回504 Gateway Time-out 錯誤,這意味著請求在網關或代理服務器等待上游服務器響應時超時。以下是可能的原因和排查建議:

問題分析1.后端處理耗時過長是某個方法執行時間過長&#xff0c;超過了網關的超時設置&#xff08;通常是幾十秒&#xff09;可能涉及大量數據查詢或復雜計算2.數據庫查詢性能問題查詢的數據量過大缺少必要的數據庫索引SQL語句執行效率低下排查建議1.檢查服務端日志查看應用日志…

DBAPI 實現不同角色控制查看表的不同列

DBAPI 實現不同角色控制查看表的不同列 場景說明 在數據庫管理系統中&#xff0c;對表進行列級別的權限控制是一項關鍵的安全措施&#xff0c;特別是在處理敏感數據或需要遵守特定數據訪問控制策略的情況下。合理的列權限控制不僅能保護敏感信息&#xff0c;還能幫助組織滿足合…

二維圖像處理(完整版)

目錄 1.變換矩陣 2.在矩陣的基礎上添加各種變換形式 3.開始變換 4.計算變換矩陣參數 新算子 二、閾值分割 新算子 三、blob分析案例 1.焊點 2.石頭 3.木材 4.車牌 5.骰子 新算子 四、傅里葉變換頻域分析 問題一 五、濾波處理 1.均值濾波 2.中值濾波 3.高斯…

計算機網絡:求地址塊128.14.35.7/20中的相關信息

128.14.35.7/20是某一地址塊&#xff0c;求該地址塊中的網絡地址&#xff0c;IP地址最大值&#xff0c;最小值&#xff0c;地址數 這里的最大值&#xff1a;廣播地址&#xff0c;最小值&#xff1a;網絡地址&#xff0c;地址數&#xff1a;可分配主機數 最關鍵的一步就點分十進…

3深度學習Pytorch-神經網絡--全連接神經網絡、數據準備(構建數據類Dataset、TensorDataset 和數據加載器DataLoader)

文章目錄一、深度學習概述二、神經網絡基礎人工神經網絡&#xff08;ANN&#xff09;基本結構神經網絡的構建全連接神經網絡&#xff08;FCN&#xff09;計算步驟基本組件1. 線性層組件2. 激活函數&#xff08;Activation Function&#xff09;3. 損失函數&#xff08;Loss Fun…

MyEclipse啟動OutOfMemoryError內存溢出

java.lang.OutOfMemoryError&#xff1a;Java heap space打開setting&#xff0c;搜索heap&#xff0c;compiler heap sizejava.lang.OutOfMemoryError&#xff1a;insufficient memory①點擊file&#xff0c;選擇Invalidate Caches ②點擊file->Build,Excetion,Deployment-…

java畢業設計實例-基于springboot的校園資訊分享平臺的設計與實現(源碼+LW+部署文檔+全bao+遠程調試+代碼講解等)

博主介紹&#xff1a;??碼農一枚 &#xff0c;專注于大學生項目實戰開發、講解和畢業&#x1f6a2;文撰寫修改等。全棧領域優質創作者&#xff0c;博客之星、掘金/華為云/阿里云/InfoQ等平臺優質作者、專注于Java、小程序技術領域和畢業項目實戰 ??技術范圍&#xff1a;&am…

手寫 Spring

01 - 原始版本的 IOC 容器 IOC 容器的作用是自動創建對象&#xff0c;降低系統間的耦合度 core public interface Resource extends Iterator<Object>{ }外部的配置信息都當成 Resource (資源)來進行抽象 public class ClassPathXmlResource implements Resource {Docume…

【物聯網】基于樹莓派的物聯網開發【24】——樹莓派安裝influxDB時序數據庫

使用背景 聚焦大數據底層技術軟件研發&#xff0c;實現時序數據采集、寫入、存儲、查詢、分析 場景介紹 用于存儲和分析時間序列數據的開源數據庫 安裝 InfluxDB 添加 InfluxDB 的倉庫&#xff1a; wget -qO- https://repos.influxdata.com/influxdb.key | sudo apt-key add - …

Python 程序設計講義(68):Python 的文件操作——使用os模塊操作文件

Python 程序設計講義&#xff08;68&#xff09;&#xff1a;Python 的文件操作——使用os模塊操作文件 目錄Python 程序設計講義&#xff08;68&#xff09;&#xff1a;Python 的文件操作——使用os模塊操作文件一、刪除文件&#xff1a;使用os.remove()函數二、重命名文件與…

uni-app 網絡請求終極選型:uni.request、axios、uni-network、alova 誰才是你的真命請求庫?

還在 uni-app 里手寫 uni.request 然后自己封裝到懷疑人生&#xff1f; 想用 axios 卻擔心小程序 2 MB 主包瞬間爆炸&#xff1f; 面對 alova、uni-network、axios 一臉懵&#xff0c;不知道選哪個才不踩坑&#xff1f; 這篇一次講透 4 大主流方案優缺點、適用場景和避坑指南&a…

2G內存的服務器用寶塔安裝php的fileinfo拓展時總是卡死無法安裝成功的解決辦法

臨時加大 Swap&#xff08;4G&#xff09; fallocate -l 4G /swapfile2 chmod 600 /swapfile2 mkswap /swapfile2 swapon /swapfile2 free -h確認現在有了足夠的 swap&#xff08;總內存 swap 應該達到 6G&#xff09;&#xff1a; free -h編譯 fileinfo 擴展&#xff08;只用…

DAY 41 簡單CNN

知識回顧 數據增強卷積神經網絡定義的寫法batch歸一化&#xff1a;調整一個批次的分布&#xff0c;常用與圖像數據特征圖&#xff1a;只有卷積操作輸出的才叫特征圖調度器&#xff1a;直接修改基礎學習率 卷積操作常見流程如下&#xff1a; 1. 輸入 → 卷積層 → Batch歸一化層…

Flink 2.1 SQL:解鎖實時數據與AI集成,實現可擴展流處理

摘要&#xff1a;本文整理自阿里云的高級技術專家、Apache Flink PMC 成員李麟老師在 Flink Forward Asia 2025 新加坡[1]站 —— 實時 AI 專場中的分享。將帶來關于 Flink 2.1 版本中 SQL 在實時數據處理和 AI 方面進展的話題。Tips&#xff1a;點擊「閱讀原文」跳轉阿里云實時…

運維巡檢單(文檔)

1 運維巡檢表格 1.1 每日巡檢記錄單 1.2 周巡檢報告 1.3 季度巡檢報告 1.4 遠程服務記錄單 1.5 現場維護記錄單 1.6 現場運維巡檢服務單 1.7 服務器巡檢記錄 1.8 網絡設備巡檢記錄 1.9 視頻會議系統檢測表 1.10 機房巡檢報告 1.11 運維服務統計表 1.12 運維服務交接…