全文不看版:webkitEnterFullScreen,和requestFullScreen一样返回一个promise,但是连文档都找不到,不建议使用。
前两天调研完移动端视频行内播放,又接到了产品的这个需求,那么,能不能做呢?
前情提要,在移动端行内播放视频缩水版:
- android 移动端默认直接行内播放,不会漂浮上去
- safari 加 playsinline 和 webkit-playsinline
- 微信在上面的基础上加 x5-video-player-type=”h5” x5-video-player-fullscreen=”portraint”
- app 内,能发版的让客户端改 webview 配置,
- webview.allowsInlineMediaPlayback = true
- webview.mediaPlaybackRequiresUserAction = false
- app内,不能发版的,视频又小的,iphone-inline-video
- app内,不能发版的,视频大的,jsmpeg,先把代码转成ts
一番搜索之后,搜到了 Element.requestFullscreen 这个api,虽然兼容性看着不咋地,但是先试试再说
<button onclick="location.reload()">刷新页面</button>
<button onclick="playVideo()">播放视频</button>
<video muted type="video/mp4"
src="https://mdn.github.io/learning-area/javascript/apis/video-audio/finished/video/sintel-short.mp4"
webkit-playsinline="true" playsinline="true" x5-video-player-type="h5"
x5-video-player-fullscreen="portraint"></video>
<script>
var video = document.querySelector('video');
async function playVideo() {
await video.requestFullscreen()
video.play()
}
</script>
测试结果:chrome可以,ios不行,android可以。
那么问题就到了为什么 ios 不行上,直接打印这个 dom 上的所有带 f 的方法。
<button onclick="location.reload()">刷新页面</button>
<button onclick="playVideo()">播放视频</button>
<video muted type="video/mp4"
src="https://mdn.github.io/learning-area/javascript/apis/video-audio/finished/video/sintel-short.mp4"
webkit-playsinline="true" playsinline="true" x5-video-player-type="h5"
x5-video-player-fullscreen="portraint"></video>
<script>
var video = document.querySelector('video');
async function playVideo() {
const obj = {}
for (const prop in video) {
if (prop.match(/f|Full/)) {
if (typeof video[prop] === 'function') {
obj[prop] = video[prop]
}
}
}
console.log(obj) // 坑爹呀
await video.requestFullscreen()
video.play()
}
</script>
从console里可以找到一个很像的api,叫 **webkitEnterFullScreen ,**试了下确实可以做到全屏,并且通过同样的方式,我们发现chrome和android里也有这个方法。是mdn里并没有这个enterFullScreen的api介绍,通过9年前发布的[[译]原生全屏JavaScript API](https://mrluo.life/article/detail/97/native-fullscreen-javascript-api ) 推断,这是ios早期就有,并且后面估计没有改过的api,风险极大。