查看: 420|回复: 1

HTML5+JS实现视频播放器水印叠加:全屏兼容与DOM操作详解

[复制链接]
发表于 昨天 14:00 | 显示全部楼层 |阅读模式
在网页视频中嵌入自定义文本水印是保护版权的常见需求。本文介绍一种基于HTML5原生video标签、通过JavaScript动态控制DOM实现水印叠加的方案,支持全屏模式,兼容IE8及以上浏览器。

实现原理
在video容器外层包裹一个相对定位的父元素,将水印层(如div)通过绝对定位覆盖在视频上方,设置pointer-events: none让鼠标事件穿透水印层,不影响视频控制。全屏时,通过监听fullscreenchange事件动态调整水印的尺寸和位置,确保水印始终显示。

HTML结构
  1. <div id="videoContainer" style="position:relative; width:640px; height:360px;">
  2.   <video id="myVideo" src="example.mp4" controls width="100%" height="100%"></video>
  3.   <div id="watermark" style="position:absolute; top:20px; left:20px; color:white; font-size:24px; text-shadow:1px 1px 2px black; opacity:0.7; pointer-events:none; z-index:10;">
  4.     版权所有
  5.   </div>
  6. </div>
复制代码

JS脚本:动态生成水印与全屏适配
  1. function initWatermark() {
  2.   var container = document.getElementById('videoContainer');
  3.   var video = document.getElementById('myVideo');
  4.   var watermark = document.getElementById('watermark');
  5.   
  6.   // 若水印元素不存在则动态创建
  7.   if (!watermark) {
  8.     watermark = document.createElement('div');
  9.     watermark.id = 'watermark';
  10.     watermark.style.cssText = 'position:absolute; top:20px; left:20px; color:white; font-size:24px; text-shadow:1px 1px 2px black; opacity:0.7; pointer-events:none; z-index:10;';
  11.     watermark.textContent = '版权所有';
  12.     container.appendChild(watermark);
  13.   }
  14.   
  15.   // 全屏切换事件处理
  16.   document.addEventListener('fullscreenchange', onFullscreenChange);
  17.   document.addEventListener('mozfullscreenchange', onFullscreenChange);
  18.   document.addEventListener('webkitfullscreenchange', onFullscreenChange);
  19.   document.addEventListener('MSFullscreenChange', onFullscreenChange);
  20.   
  21.   function onFullscreenChange() {
  22.     if (document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement) {
  23.       // 全屏时,容器宽高为屏幕尺寸,水印位置需重新计算(这里保持左上角固定偏移)
  24.       // 也可以根据视频实际显示尺寸等比调整水印大小
  25.     } else {
  26.       // 退出全屏后恢复原尺寸
  27.     }
  28.   }
  29. }
  30. // 页面加载后初始化
  31. window.addEventListener('load', initWatermark);
复制代码

关键参数说明
- pointer-events:none:让水印不拦截鼠标事件,保证视频控制条可正常操作。
- z-index:10:确保水印在video上方(video默认z-index为0或auto)。
- fullscreenchange事件:监听四种前缀,覆盖不同浏览器(Chrome、Firefox、Safari、IE11+)。
- 兼容性降级:IE8不支持addEventListener,可改用attachEvent。若需支持IE8,需调整事件绑定方式并确保CSS属性兼容。

优化建议
- 水印内容可通过js动态设置,如从后端获取用户ID或时间戳。
- 水印旋转(如45度倾斜)可增加防篡改效果,使用CSS transform:rotate(-45deg)。
- 多个水印交叉排列可提高覆盖面积,循环创建多个绝对定位的元素即可。
- 若视频源为流媒体(HLS/MPEG-DASH),水印逻辑不变,仅需替换video的src属性。

适用场景
- 在线教育平台防止录屏搬运。
- 直播回放页面版权声明。
- 内部培训视频水印标注归属。

该方案无需第三方库,纯前端实现,代码量小,易于集成。开发者可根据实际需求调整水印样式与显示逻辑。
回复

使用道具 举报

发表于 昨天 14:05 | 显示全部楼层

Re: HTML5+JS实现视频播放器水印叠加:全屏兼容与DOM操作详解

感谢分享!这篇文章把视频水印的实现思路讲得很清楚,尤其是全屏兼容性那一块,考虑到四种前缀的 fullscreenchange 事件,细节很到位。pointer-events: none 的用法确实让水印既显示又不干扰操作,在实际项目中很实用。想问下,如果想让水印在全屏时自动按比例缩放(比如根据视频实际显示区域等比调整字号),你推荐是在 onFullscreenChange 里动态修改 style,还是直接用 CSS 的 vw/vh 单位更省事?
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

指导单位

江苏省公安厅

江苏省通信管理局

浙江省台州刑侦支队

DEFCON GROUP 86025

Hacking Group 021A

旗下站点

态势感知中心

应急响应中心

红盟安全

联系我们

官方QQ群:112851260

官方邮箱:security#ihonker.org(#改成@)

官方核心成员

关注微信公众号

Archiver|手机版|小黑屋| ( 沪ICP备2021026908号 )

GMT+8, 2026-6-14 03:11 , Processed in 0.023795 second(s), 17 queries , Gzip On, Redis On.

Powered by ihonker.com

Copyright © 2015-现在.

  • 返回顶部