Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >前端-video 标签沉浸式播放解决方案

前端-video 标签沉浸式播放解决方案

作者头像
grain先森
发布于 2019-03-29 03:17:41
发布于 2019-03-29 03:17:41
2.2K0
举报
文章被收录于专栏:grain先森grain先森

“沉浸播放式”这个概念是我从Android开发里面的沉浸式引申过来的一个概念,沉浸式其实就是隐藏页面顶部的status bar和底部的navigation bar之后呈现出来的页面,一般用户很容易把沉浸式状态栏和透明化状态栏混为一谈,他们的区别如下:

沉浸式状态栏

透明化状态栏

那么回到前端开发,让我们看一下如何让video标签呈现这种沉浸式的播放效果,平常我们使用video标签都是这样的:

<div id="app">

 <video

   id="videos"

   playsinline="true"

   webkit-playsinline="true" /*IOS播放视频会自动调用原生播放器全屏播放,这里使用这个属性让IOS内播放视频的时候使用inline模式,同时我们设置宽高等于屏幕宽高来实现IOS下的全屏播放*/

   x5-video-orientation="portraint"

   preload="auto"

   style="width: 100%;height: 100%"

 >

   <source src="//gw.alicdn.com/bao/uploaded/TB1YKBlb_ZRMeJjSsppXXXrEpXa.mp4" type="video/mp4">

 </video>

</div>

正常情况下我们要做竖版视频,视频的比例都是16:9,也就是高/宽约等于1.78,这里用到的测试视频也是16:9的,而且默认情况下video的object-fit属性的值是contain,也就是保持长宽比,我们先看下不做处理在iphone6/7/8下的表现情况:

在iphone6/7/8下的表现情况

看起来比较完美,因为这几款手机分辨率都是16:9的,视频维持屏幕大小完全没有问题,接下来看一下分辨率不是16:9的机型,比较典型的就是iphoneX,面向老板开发的同学可能对适配这款机型颇有怨言:

iphoneX下的表现情况

有人会觉得奇怪为什么我们设置了video的宽高都是百分百上下还漏出了两个白条,这里其实是object-fit这个属性在作怪,既然默认的是contain,我们就改为fill吧,再看一下效果:

object-fit:fill

这样看起来没问题,但是你觉得产品小姐姐会这么轻易放过你吗?too navie,你看我们正常16:9的视频在iphoneX这种18:9的屏幕上是有形变的,而且市面上这么多分辨率不同的设备,如果要追求不同的手机上有最接近的用户体验这么做肯定是不行的,有人可能会提到object-fit中的cover属性,没错,这个属性可以让我们的视频等比例缩放,如果宽高不匹配会对处理对象做裁剪操作,来我们看一下现在在微信里面的效果:

微信里的效果

其他效果都蛮好,你会发现右上角有个可恶的全屏,这个全屏按钮是微信的x5内核自带的,没法去除,这个有很多人给腾讯x5开发团队那边提过issue,但是暂时没有办法处理,我后续会提到一个另辟蹊径的方案,先回到这里,点了这个全屏按钮之后会进入微信的全屏播放模式,而且放完之后会出现一堆广告列表,这都是我们不想看到了,其次如果我们的产品需求不单单是全屏播放,还想在视频上面放一些交互按钮之类的,这种方式就做不到,因为video是在最上一级的,但是两种方式例外,一个是微信把你们的域名加入白名单,这种可以在Android手机的video上随意放置dom元素,IOS本身没有这个限制,另一种更为通用的方式是用微信x5内核的同层播放模式,这种模式有两种好处:

1、去除了右上角讨厌的”全屏”按钮

2、真正实现了x5内核下的沉浸式播放,我们看到目前的实现在微信上还是带有浏览器的titleBar的 在x5内核的环境下实现同层播放很简单,只需要在video上添加这么两行属性:

x5-video-player-type="h5"

x5-video-player-fullscreen="true"

再看一下这个时候的效果:

同层播放模式下的效果

确实是真正意义上的沉浸式播放,如果你的app里面webview用的也是x5内核那么这个页面也能在app上达到同样的效果,但是这种同层播放依然有无法解决的问题,首先这个全屏模式会重新计算宽高,触发视口大小变化,也就是说用户视觉上会有一个视口变化的过程,其次,同层播放模式虽然没有了”全屏”按钮,但是左上角的按钮用于退出沉浸式全屏,右上角的按钮点开是分享,分享的内容不可定制,固定位当前页面的title+url的组合,如果你对页面的定制化要求比较高的话,我这里有一个备选的方案,那就是放弃同层播放模式,当然这个前提是你不需要在video页面上做一些交互操作,或者说你的域名处于微信白名单下,当我们在非沉浸式下又想要打到等比例缩放视频的效果,同时我们还要去除x5自带的”全屏”按钮,最好的方式就是动态去计算视频的宽高,把视频撑大,把”全屏”按钮撑出浏览器页面,这样基本就能达到我们的目的了,这里以16:9的标准为例:

this.$nextTick(() => {

     // 动态处理video标签宽高适配

     const video = this.$refs.video

     const ratio = Math.fround(document.documentElement.clientHeight / document.documentElement.clientWidth)

     if (ratio >= 1.78) {

       // 竖屏

       video.height = document.documentElement.clientHeight + 100

       video.width = Math.floor(video.clientHeight * 0.572)

       const winW = document.documentElement.clientWidth

       video.style.left = (winW - video.width) / 2 + 'px'

     } else {

       // 宽屏

       video.width = document.documentElement.clientWidth + 100

       video.height = Math.floor(video.width * 1.78)

       const winH = document.documentElement.clientHeight

       video.style.top = (winH - video.height) / 2 + 'px'

     }

   })

讲解下思路,16:9的视频也就是高宽比差不多是1.78,那么大于这个比例的就是类似于iphoneX的长屏幕类型的手机,对于这种手机我们要做等比缩放适配的话就以手机的长为标准,先让视频的长度等于手机的长度,这里我加上的100px可以理解为上下在加上50px,目的就是为了把视频长度拉大,让”全屏”按钮消失在视线内,实际这个值可以自己尝试修改,让后宽就是此时高的1/78倍,然后使用绝对布局去设置视频的左边距,就可以达到等比缩放的效果,同理可以理解处理宽屏手机的代码部分,当然,应该还有更完美的方案,可以在评论区留言探讨~

作者:李牧羊 https://www.limuyang.cc/2018/07/22/video标签沉浸式播放解决方案/

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.11.02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
视频H5 video最佳实践
随着 4G 的普遍以及 WiFi 的广泛使用,手机上的网速已经足够稳定和高速,以视频为主的 HTML5 也越来越普遍了,相比帧动画,视频的表现更加丰富,这里介绍一些实践经验。
gnip
2020/10/28
4.9K0
网页背景H5视频自动播放---PC端、移动端兼容问题完美解决方案(IOS、安卓、微信端)
PC端相应简单些,浏览器对<video>标签的兼容还是很好的,但是想要在浏览器中当做Banner视频自动播放就必须设置这些属性来更好地实现;
Tz一号
2020/09/10
3.9K0
HarmonyOS鸿蒙开发 - 解决上下两栏白边 - 沉浸式效果
猫林老师
2024/12/23
2030
HarmonyOS鸿蒙开发 - 解决上下两栏白边 - 沉浸式效果
基于原生JS移动端响应式解决方案——AUTOSTRAP
就目前移动端而言,已有比较成熟都响应式框架,类似于Bootstrap、AmazeUI、Skeljs。但是对于普通开发者来说,为了满足快速开发的需求去学习和使用这些框架的时间成本是比较高的。所以,本着轻量、快速开发的原则,为大家提供了基于原生JS的移动动端解决方案,希望能在交流、使用中继续优化AutoStrap。
零式的天空
2022/03/22
1.2K0
📚一站式解决:H5开发全攻略,看这篇让你省时又省力
在 H5 中,我们通常会使用 REM 和 VW 这两种单位来实现页面的响应式布局。这两种单位可以让页面元素的大小随着根元素(对于 REM)或视口宽度(对于 VW)的大小变化而变化,从而适应不同尺寸的屏幕。
linwu
2023/07/27
1.3K0
H5视频自动播放踩坑杂记
最近的一次业务需求中,偶然接到了这么一个需求:“用户首屏可以自动播放一段视频,希望点击再全屏”。
不换
2024/04/30
1.4K0
H5视频自动播放踩坑杂记
移动端那些戳中你痛点的软键盘问题及解决方法
在ios手机中,当页面中包含有输入框时,点击输入框,键盘弹起,会让页面中被fixed的元素失效。所以造成了底部吸底和顶部吸顶的元素错位的问题。下面的视频中就出现了这个问题,吸顶元素被推到可视区之外去了,而吸底元素也被推到了键盘之上。
wade
2021/05/28
9.4K0
移动端那些戳中你痛点的软键盘问题及解决方法
鸿蒙5开发宝藏案例分享---一多窗口适配开发实践
🎉大家好呀!今天要跟各位鸿蒙开发者分享一个超实用的大宝藏——HarmonyOS官方那些藏在文档里的多窗口适配案例!是不是经常在开发时发现文档里明明有解决方案,但就是找不到具体代码参考?我也是最近才挖到这些隐藏款案例,赶紧整理出来和大家唠唠!
陈杨
2025/06/03
1170
H5案例分享:微信视频播放全屏问题(转)
   在ios和安卓手机里的微信下播放视频时,会遇到不少问题,例如需要手动点击,视频才会播放,并且视频会跳出微信框,出现控制条,如果视频不是腾讯视频,播放完毕会出现腾讯视频的广告推送,今天我们就来看一下如何规避这些问题。
山河木马
2019/03/05
6.9K1
移动端H5页面开发坑点指南
前言 在平时的H5移动端开发时,我们难免会遇到各种各样的坑点,这篇文章就带着大家来看看怎么解决,文章较长,建议收藏方便以后查阅!
Javanx
2019/10/28
3.3K0
使用Aliplayer在微信中播放视频的正确姿势
h5页面分享到微信上播放视频,最大的坑就是在Android手机上,X5浏览器会劫持Video标签用播放器弹出全屏播放,处于最上层,覆盖DOM元素,而且播放完毕时,会出现广告视频,比如:
用户6256742
2024/06/13
2830
使用Aliplayer在微信中播放视频的正确姿势
移动端必备的H5问题及解决方案
上下滑动页面会产生卡顿,手指离开页面,页面立即停止运动。整体表现就是滑动不流畅,没有滑动惯性。
前端小tips
2021/12/11
5K0
移动端必备的H5问题及解决方案
鸿蒙开发实战案例:视频横竖屏切换及进度条热区拖动
本示例介绍了@ohos.multimedia.media组件和@ohos.window接口以及使用触摸热区实现视频横竖屏切换及进度条热区拖动的功能。该场景多用于横竖屏视频等媒体播放。
小帅聊鸿蒙
2025/02/24
1990
鸿蒙开发实战案例:视频横竖屏切换及进度条热区拖动
【JS】1705- 重学 JavaScript API - Fullscreen API
本文中,我们将探索 Fullscreen API 的概念、使用方法、实际应用、兼容性和优缺点,并提供一些建议和注意事项。让我们一起深入了解吧!
pingan8787
2023/09/01
5680
【JS】1705- 重学 JavaScript API - Fullscreen API
【适配】425- 彻底搞懂移动Web开发中的viewport与跨屏适配
viewport是移动端跨屏适配的基石,吃透这一概念,任何复杂多变的适配需求,都可以手到擒来。
pingan8787
2019/11/29
3.4K0
这个月被「视频播放」坑惨了,曝光八大坑
大家肯定会很奇怪我为什么要写前端的东西?因为我是一名全栈攻城狮,是不是该贡献点前端的实战经验?
悟空聊架构
2022/05/13
2.4K0
这个月被「视频播放」坑惨了,曝光八大坑
视频H5Video标签在微信里的坑和技巧(转)
随着 4G 的普遍以及 WiFi 的广泛使用,手机上的网速已经足够稳定和高速,以视频为主的 HTML5 也越来越普遍了,相比帧动画,视频的表现更加丰富,前段时间开发了一个以视频为主的移动端 HTML5,在这里介绍一些实践经验。
山河木马
2019/03/05
2.8K0
视频H5Video标签在微信里的坑和技巧(转)
移动端bug汇总(一)
Q: 当你点击一个链接或者通过Javascript定义的可点击元素的时候,它就会出现一个半透明的灰色背景。
zhbyue
2018/05/17
3.3K0
移动端bug汇总(一)
前端猿要了解的基本浏览器(BOM)知识
window 对象 全局作用域 这个不用多讲,前面已经接触过,所有在全局作用域定义的变量都会被当做 window 对象的属性,同时 Global 对象也是基于 window 对象的。 需要注意的是,一般定义变量时,这个变量的四个数据属性都默认为 true(这个前面面向对象那里讲过),所以都是可以删除或者修改的。**可是不一样的地方就在全局作用域,在此作用域下定义的变量的数据属性之一 [[Configurable]]**默认为 false,这就导致无法删除,强行使用 delete 是无效的,在 IE9
努力的Greatiga
2022/07/25
9630
H5直播避坑指南
作者简介: 文赫,2015年加入腾讯,作为前端开发工程师参与过手Q游戏公会,游戏中心,企鹅电竞等项目,具有丰富的移动端开发和直播开发经验。 导语 企鹅电竞项目,直播和视频播放是其中的核心。面对着产品同学不断的询问:为什么h5的体验这么差?为什么不能和app的播放体验保持一致?我们对着h5不明确的文档和不同浏览器的怪异表现欲哭无泪。 经过一系列的调研爬坑,斩荆披棘,我们一步步提升了体验,做到了和app基本一致的体验。在摸索优化背后,我们也想把这些问题和解决方法总结下来,让其他同学做到直播的时候可以自豪的说,这
小时光
2018/01/15
5.7K0
H5直播避坑指南
推荐阅读
相关推荐
视频H5 video最佳实践
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档