【兼容性记录】video标签在 IOS 和 安卓中的问题

业务需求背景:由于业务中涉及到有视频播放的内容,所以就使用了 video 标签去做,但是 video 标签在 ios 设备安卓设备中的默认行为不一致,故记录下解决方法(折中办法)。

ios 自动全屏

ios 设备点击播放视频会自动进入全屏(弹层播放),而安卓不会

这个比较好处理,有对应的属性设置,只需要在 video 标签中添加即可和安卓保持一致。

  • playsinline:告诉支持它的浏览器(包括现代的 iOS Safari)在网页内部播放视频。
  • webkit-playsinline:旧版本的 iOS Safari 添加的特殊属性,作用与 playsinline 相同
html 复制代码
<video webkit-playsinline playsinline src="xxx" />

ios 设备中无视频头帧

ios 设备没有预览图的情况下不会展示视频头帧,播放前video标签背景是透明的,而安卓自动展示头帧

这是因为 ios 的保护机制:如果 video 标签未开始播放时不会去加载视频的,所以就没有头帧图。解决方法有几种,一种是设置video poster属性:在页面加载的时候获取视频的首帧图,然后将这个图赋值给poster。另外一种就是简单封装一下,这个问题就 over 了,唯一的缺点就是需要写额外的逻辑。

html 复制代码
<!-- 方式一 -->
<video width="100%" controls accept-ranges content-length poster="xxx.png" src="xxx.mp4">

<!-- 方式二 -->
<div class="video-container">
  <div class="video">
      <div class="play-overlay">  
        <button class="play-button"></button>  
      </div>
	  <!-- content-length:提供了文件大小信息,帮助浏览器管理下载过程 -->
      <!-- accept-ranges:允许浏览器分段请求 -->
      <video width="100%" controls accept-ranges content-length src="xxx.mp4">   
    </video>
    <img class="video-cover-image" src="xxx.jpg" />  
  </div>
</div>
<script>
// 为所有的 video-container 增加点击事件监听
document.querySelectorAll('.video-container .play-button').forEach(function(playButton) {
  playButton.addEventListener('click', function() {
    let videoContainer = this.closest('.video-container');
    videoContainer.querySelector('.play-overlay').style.display = 'none';
    videoContainer.querySelector('.video img').style.display = 'none';
    let video = videoContainer.querySelector('video')
    video.play();
  });
});
</script>

安卓设备全屏后退出页面位置出现偏移

安卓设备播放视频后点击全屏,然后点击退出按钮后页面位置会发生偏移(只遇到过向下移的情况)

这个问题来来回回折腾了一两天后面直接将方案改了:网页上点击播放按钮后页面出现一个弹出层进行播放

html 复制代码
<a href="javascript:;" class="video_btn" data-mp4="xxx.mp4"></a>
<script>
document.body.addEventListener('click', function(event) {
  if (event.target.matches('.video_btn')) {
    const item = event.target;
    let mp4 = item.getAttribute('data-mp4')
    // 将 mp4 地址赋值给弹出层的video标签
    let html =`<div class="pop_video_bg"></div>
			    <div class="pop_video" style="display: block;">
			    	<div id="pop_vv">
			    	<div style="position:relative;left:0;top:0;display:inline-block;width:100%;max-height:100%">
			    		<video controls controlslist="nodownload" src="xxx.mp4" loop="false" width="100%" height="100%" disablepictureinpicture autoplay style="background-color: black;">
			    			<source src="xxx.mp4" type="video/mp4">
			    		</video>
			    	</div>
			    </div>
			   <div class="close_pv"></div>
			  </div>`
  }
  // 将html放入body中
  ...
});
</script>

倩女幽魂类似

相关推荐
计算机魔术师4 分钟前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端
sun0077007 分钟前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
沙蒿同学37 分钟前
我用 Go 搭了一条 AI Agent 流水线:从 1 张商品图到一整套淘宝详情页
前端·javascript·后端
其实防守也摸鱼1 小时前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
甜到心里的蛋糕1 小时前
加解密技术详解:纯前端如何实现 AES / SM4 / RSA / 国密 SM2
前端·密码学
拖孩1 小时前
代码我能全交给 AI,流量主这 500 个访客它一个都替不了我
前端·后端·微信小程序
2601_963870212 小时前
基于SSM的特产代购系统
java·前端
paopaokaka_luck2 小时前
智慧社区综合服务小程序(人脸识别、AI问答、Echarts图形化分析)
前端·javascript·spring boot·spring·数据分析·echarts
茶底世界之下2 小时前
为什么预览、录制、离线导出不能共享同一个背压策略?
ios·swift
烈风逍遥2 小时前
第七篇:提示词模板管理与 Agent 提示词编排
前端·人工智能·后端