全部分类
冬雪君_4161
2026-05-20
918人浏览
原创
默认情况下,浏览器全屏 API 仅将 元素本身全屏,导致外部自定义控件被排除在外;解决方法是将视频及其所有控件包裹在一个容器 中,并对该容器调用全屏 API,从而确保控件随视频一同进入全屏。
默认情况下,浏览器全屏 api 仅将 `` 元素本身全屏,导致外部自定义控件被排除在外;解决方法是将视频及其所有控件包裹在一个容器 `` 中,并对该容器调用全屏 api,从而确保控件随视频一同进入全屏。在构建自定义 HTML5 视频播放器时,一个常见痛点是:当用户点击全屏按钮后,仅 标签被拉伸至全屏,而你精心设计的播放/暂停、进度条、音量控制等 UI 元素(通常位于 外部)会消失——因为它们并未被纳入全屏范围。 根本原因在于:video.requestFullscreen() 只会让该 元素全屏,其兄弟节点(如 .controls)不属于全屏上下文,自然被隐藏或脱离视口。正确做法是对包含视频与控件的整体容器执行全屏操作。 ✅ 正确实现步骤 1. 封装容器(HTML 层面) 将 和 .controls 共同包裹在一个具有唯一 ID 的 中(例如 id="vid_container"),确保 DOM 结构语义清晰且可操作:<div id="vid_container"> <video id="video" class="video w-100" playsinline><source src="https://test.loro.ec/www/t/test.loro.ec/images/articles_blocks/608.mp4" type="video/mp4"></source></video><div class="controls position-relative" style="top: -50px; margin-left: 8px;"> <!-- 控件结构保持不变 --> <div class="row"> <div class="col-1"> <button class="controls__button toggleButton btn" id="toggleButton" title="Toggle Play" onclick="togglePlay()">►</button> </div> <div class="progress col-5 p-0" id="progressId"> <div class="progress__filled" style="background: rebeccapurple;"></div> </div> <div class="col-4"> <i class="bi bi-volume-up"></i> <input class="form-range" style="width: 80%;" type="range" id="volume-bar" title="volume" min="0" max="1" step="0.1" value="1"> </div> <div class="col-1"> <button class="btn" onclick="toggleFullScreen()"><i class="bi bi-arrows-fullscreen"></i></button> </div> </div> </div> </div> ? 注意:添加 playsinline 属性有助于在 iOS Safari 中避免自动跳转至原生播放器界面。 2. 更新 JavaScript 全屏逻辑 不再对 video 调用全屏,而是获取并操作容器元素 #vid_container: const container_vid = document.getElementById("vid_container"); const video = document.querySelector(".video"); // ...其余变量声明保持不变 function toggleFullScreen() { if (!document.fullscreenElement && !document.webkitFullscreenElement && !document.mozFullScreenElement && !document.msFullscreenElement) { // 进入全屏 if (container_vid.requestFullscreen) { container_vid.requestFullscreen(); } else if (container_vid.webkitRequestFullscreen) { container_vid.webkitRequestFullscreen(); } else if (container_vid.mozRequestFullScreen) { container_vid.mozRequestFullScreen(); } else if (container_vid.msRequestFullscreen) { container_vid.msRequestFullscreen(); } } else { // 退出全屏 if (document.exitFullscreen) { document.exitFullscreen(); } else if (document.webkitExitFullscreen) { document.webkitExitFullscreen(); } else if (document.mozCancelFullScreen) { document.mozCancelFullScreen(); } else if (document.msExitFullscreen) { document.msExitFullscreen(); } } } ✅ 推荐使用现代标准 document.exitFullscreen() 替代已废弃的 cancelFullScreen() 等旧方法,并统一监听 fullscreenchange 事件优化状态响应(见下方增强建议)。 3. (可选)增强体验:监听全屏状态变化 为动态调整 UI(如图标、样式),建议监听全局 fullscreenchange 事件: document.addEventListener('fullscreenchange', () => { const isFullscreen = !!document.fullscreenElement; // 可据此切换按钮图标(如 ? → ?)、显示/隐藏辅助提示等 console.log('Fullscreen state:', isFullscreen ? 'ON' : 'OFF'); }); ⚠️ 注意事项 CSS 兼容性:全屏时容器内元素可能受浏览器默认样式影响(如 Chrome 全屏下 默认居中),可通过 #vid_container:fullscreen { width: 100vw; height: 100vh; } 统一约束。 移动端适配:iOS Safari 对 requestFullscreen() 支持有限,需确保触发行为由用户手势(如 onclick)发起;playsinline 是必需属性。 无障碍支持:为按钮添加 aria-label(如 aria-label="Toggle fullscreen"),提升可访问性。 不要混用 video.controls:若同时启用原生控件(),可能与自定义控件冲突,应始终设置 controls="false" 或省略该属性。 通过将视频与控件封装为统一全屏单元,你不仅能彻底解决控件消失问题,还能获得更可控、更一致的全屏交互体验——这是构建专业级自定义播放器的关键一步。
在构建自定义 HTML5 视频播放器时,一个常见痛点是:当用户点击全屏按钮后,仅 标签被拉伸至全屏,而你精心设计的播放/暂停、进度条、音量控制等 UI 元素(通常位于 外部)会消失——因为它们并未被纳入全屏范围。
根本原因在于:video.requestFullscreen() 只会让该 元素全屏,其兄弟节点(如 .controls)不属于全屏上下文,自然被隐藏或脱离视口。正确做法是对包含视频与控件的整体容器执行全屏操作。
将 和 .controls 共同包裹在一个具有唯一 ID 的 中(例如 id="vid_container"),确保 DOM 结构语义清晰且可操作:<div id="vid_container"> <video id="video" class="video w-100" playsinline><source src="https://test.loro.ec/www/t/test.loro.ec/images/articles_blocks/608.mp4" type="video/mp4"></source></video><div class="controls position-relative" style="top: -50px; margin-left: 8px;"> <!-- 控件结构保持不变 --> <div class="row"> <div class="col-1"> <button class="controls__button toggleButton btn" id="toggleButton" title="Toggle Play" onclick="togglePlay()">►</button> </div> <div class="progress col-5 p-0" id="progressId"> <div class="progress__filled" style="background: rebeccapurple;"></div> </div> <div class="col-4"> <i class="bi bi-volume-up"></i> <input class="form-range" style="width: 80%;" type="range" id="volume-bar" title="volume" min="0" max="1" step="0.1" value="1"> </div> <div class="col-1"> <button class="btn" onclick="toggleFullScreen()"><i class="bi bi-arrows-fullscreen"></i></button> </div> </div> </div> </div> ? 注意:添加 playsinline 属性有助于在 iOS Safari 中避免自动跳转至原生播放器界面。 2. 更新 JavaScript 全屏逻辑 不再对 video 调用全屏,而是获取并操作容器元素 #vid_container: const container_vid = document.getElementById("vid_container"); const video = document.querySelector(".video"); // ...其余变量声明保持不变 function toggleFullScreen() { if (!document.fullscreenElement && !document.webkitFullscreenElement && !document.mozFullScreenElement && !document.msFullscreenElement) { // 进入全屏 if (container_vid.requestFullscreen) { container_vid.requestFullscreen(); } else if (container_vid.webkitRequestFullscreen) { container_vid.webkitRequestFullscreen(); } else if (container_vid.mozRequestFullScreen) { container_vid.mozRequestFullScreen(); } else if (container_vid.msRequestFullscreen) { container_vid.msRequestFullscreen(); } } else { // 退出全屏 if (document.exitFullscreen) { document.exitFullscreen(); } else if (document.webkitExitFullscreen) { document.webkitExitFullscreen(); } else if (document.mozCancelFullScreen) { document.mozCancelFullScreen(); } else if (document.msExitFullscreen) { document.msExitFullscreen(); } } } ✅ 推荐使用现代标准 document.exitFullscreen() 替代已废弃的 cancelFullScreen() 等旧方法,并统一监听 fullscreenchange 事件优化状态响应(见下方增强建议)。 3. (可选)增强体验:监听全屏状态变化 为动态调整 UI(如图标、样式),建议监听全局 fullscreenchange 事件: document.addEventListener('fullscreenchange', () => { const isFullscreen = !!document.fullscreenElement; // 可据此切换按钮图标(如 ? → ?)、显示/隐藏辅助提示等 console.log('Fullscreen state:', isFullscreen ? 'ON' : 'OFF'); }); ⚠️ 注意事项 CSS 兼容性:全屏时容器内元素可能受浏览器默认样式影响(如 Chrome 全屏下 默认居中),可通过 #vid_container:fullscreen { width: 100vw; height: 100vh; } 统一约束。 移动端适配:iOS Safari 对 requestFullscreen() 支持有限,需确保触发行为由用户手势(如 onclick)发起;playsinline 是必需属性。 无障碍支持:为按钮添加 aria-label(如 aria-label="Toggle fullscreen"),提升可访问性。 不要混用 video.controls:若同时启用原生控件(),可能与自定义控件冲突,应始终设置 controls="false" 或省略该属性。 通过将视频与控件封装为统一全屏单元,你不仅能彻底解决控件消失问题,还能获得更可控、更一致的全屏交互体验——这是构建专业级自定义播放器的关键一步。
<div id="vid_container"> <video id="video" class="video w-100" playsinline><source src="https://test.loro.ec/www/t/test.loro.ec/images/articles_blocks/608.mp4" type="video/mp4"></source></video><div class="controls position-relative" style="top: -50px; margin-left: 8px;"> <!-- 控件结构保持不变 --> <div class="row"> <div class="col-1"> <button class="controls__button toggleButton btn" id="toggleButton" title="Toggle Play" onclick="togglePlay()">►</button> </div> <div class="progress col-5 p-0" id="progressId"> <div class="progress__filled" style="background: rebeccapurple;"></div> </div> <div class="col-4"> <i class="bi bi-volume-up"></i> <input class="form-range" style="width: 80%;" type="range" id="volume-bar" title="volume" min="0" max="1" step="0.1" value="1"> </div> <div class="col-1"> <button class="btn" onclick="toggleFullScreen()"><i class="bi bi-arrows-fullscreen"></i></button> </div> </div> </div> </div>
? 注意:添加 playsinline 属性有助于在 iOS Safari 中避免自动跳转至原生播放器界面。
不再对 video 调用全屏,而是获取并操作容器元素 #vid_container:
const container_vid = document.getElementById("vid_container"); const video = document.querySelector(".video"); // ...其余变量声明保持不变 function toggleFullScreen() { if (!document.fullscreenElement && !document.webkitFullscreenElement && !document.mozFullScreenElement && !document.msFullscreenElement) { // 进入全屏 if (container_vid.requestFullscreen) { container_vid.requestFullscreen(); } else if (container_vid.webkitRequestFullscreen) { container_vid.webkitRequestFullscreen(); } else if (container_vid.mozRequestFullScreen) { container_vid.mozRequestFullScreen(); } else if (container_vid.msRequestFullscreen) { container_vid.msRequestFullscreen(); } } else { // 退出全屏 if (document.exitFullscreen) { document.exitFullscreen(); } else if (document.webkitExitFullscreen) { document.webkitExitFullscreen(); } else if (document.mozCancelFullScreen) { document.mozCancelFullScreen(); } else if (document.msExitFullscreen) { document.msExitFullscreen(); } } }
✅ 推荐使用现代标准 document.exitFullscreen() 替代已废弃的 cancelFullScreen() 等旧方法,并统一监听 fullscreenchange 事件优化状态响应(见下方增强建议)。
为动态调整 UI(如图标、样式),建议监听全局 fullscreenchange 事件:
document.addEventListener('fullscreenchange', () => { const isFullscreen = !!document.fullscreenElement; // 可据此切换按钮图标(如 ? → ?)、显示/隐藏辅助提示等 console.log('Fullscreen state:', isFullscreen ? 'ON' : 'OFF'); });
通过将视频与控件封装为统一全屏单元,你不仅能彻底解决控件消失问题,还能获得更可控、更一致的全屏交互体验——这是构建专业级自定义播放器的关键一步。
PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
相关标签:
本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
上一篇:HTML svg的circle标签画圆?圆形元素属性控制
下一篇:如何在 React 函数组件中正确向 CSS 自定义变量传值
作者最新文章
如何在 Web Components 中正确监听来自文档的自定义事件
如何让两个独立表格的列宽自动同步(无需静态宽度或隐藏内容)
如何让两个独立表格的列宽自动同步(无需固定像素,保持响应式)
如何精准控制 slideshow 导航点与页面导航链接的背景样式
如何自动化从网页视频播放器中批量提取并下载视频资源
如何自动化从网页视频播放器中批量提取并下载动画视频资源
自动化下载网页视频播放器中的源视频:从手动抓包到批量离线获取
自动化从网页视频播放器中批量提取并下载动画视频资源的完整指南
Vue 3 动态组件过渡失效的根源与解决方案
如何在 Alpine.js 中实现点击外部区域关闭下拉菜单
热门AI工具
音述AI
PixTV
讯飞绘文
豆包大模型
Seko
DeepSeek
LibLibAI
UpDream
相关专题
html版权符号是“©”,可以在html源文件中直接输入或者从word中复制粘贴过来,php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。
2023.06.14
5875
7
html在线编辑器是用于在线编辑的工具,编辑的内容是基于HTML的文档。它经常被应用于留言板留言、论坛发贴、Blog编写日志或等需要用户输入普通HTML的地方,是Web应用的常用模块之一。php中文网为大家带来了html在线编辑器的相关教程、以及相关文章等内容,供大家免费下载使用。
2023.06.21
3312
4
html网页制作是指使用超文本标记语言来设计和创建网页的过程,html是一种标记语言,它使用标记来描述文档结构和语义,并定义了网页中的各种元素和内容的呈现方式。本专题为大家提供html网页制作的相关的文章、下载、课程内容,供大家免费下载体验。
2023.07.31
2990
5
html空格是一种用于在网页中添加间隔和对齐文本的特殊字符,被用于在网页中插入额外的空间,以改变元素之间的排列和对齐方式。本专题为大家提供html空格的相关的文章、下载、课程内容,供大家免费下载体验。
2023.08.01
3019
HTML是一种标准标记语言,用于创建和呈现网页的结构和内容,是互联网发展的基石,为网页开发提供了丰富的功能和灵活性。本专题为大家提供html相关的各种文章、以及下载和课程。
2023.08.11
4799
6
在网页设计中,字体大小的选择是至关重要的。合理的字体大小不仅可以提升网页的可读性,还能够影响用户对网页整体布局的感知。php中文网将介绍一些常用的方法和技巧,帮助您在HTML中设置合适的字体大小。
2961
3
html转txt的方法有使用文本编辑器、使用在线转换工具和使用Python编程。本专题为大家提供html转txt相关的文章、下载、课程内容,供大家免费下载体验。
2023.08.31
2769
html文本框代码:1、单行文本框【<input type="text" style="height:..;width:..;" />】;2、多行文本框【textarea style=";height:;"></textare】。
2023.09.01
2448
HTML嵌入CSS样式的方法有内联样式、内部样式表和外部样式表。本专题为大家提供CSS样式相关的文章、下载、课程内容,供大家免费下载体验。
2023.09.20
2488
热门下载
相关下载
精品课程
共6课时 | 54.6万人学习
共89课时 | 133.4万人学习
共49课时 | 82.2万人学习
共22课时 | 2.4万人学习
共31课时 | 3.4万人学习
共28课时 | 4.4万人学习
最新文章