解决 ios 使用 video 全屏未铺满页面问题

场景很简单,就是我在页面中放置了一个 video 标签,点击全屏按钮之后,并没有想象中的全屏效果,在安卓系统上这个功能是正常的,效果如下:

安卓系统全屏效果

ios 系统全屏实际效果

就算关闭了手机的竖屏锁定功能,旋转手机90度,仍然无法铺满,效果如下:

ios 系统全屏横屏实际效果

本文我们将解决 ios 系统下使用 video 标签全屏未铺满的问题,最终效果如下:

ios 系统全屏理想效果

我们直接上代码:

html 复制代码
<video id="live-video" playsinline webkit-playsinline class="video"></video>

这里我用到的是 Plyr 库去播放 m3u8 和 mp4 格式的视频,初始化时用到了 iosNative 属性,这个是关键:

  • 设置 iosNative 为 true,就意味着在 iOS 上,优先使用系统原生播放器全屏(而不是 Plyr 自己的伪全屏)
  • 通过监听用户点击全屏的点击事件,拦截 Plyr 的全屏按钮点击行为,在 iOS 上强制走原生全屏
javascript 复制代码
let playerInstance = null

const isIOS = () => {
  return /iphone|ipad|ipod/i.test(navigator.userAgent) ||
      (navigator.platform === 'MacIntel' && navigator.maxTouchPoints > 1)
}

const initVideo = () => {
    const videoEl = document.getElementById('live-header-video');
    if (!videoEl) return

    playerInstance = new Plyr(videoEl, {
        fullscreen: {
          enabled: true,
          iosNative: true
        },
        controls: isOpen
            ? ['play', 'progress', 'current-time', 'mute', 'volume', 'fullscreen']
            : ['play', 'mute', 'volume', 'fullscreen'],
        muted: true
     })

     await nextTick(() => {
        const fullscreenBtn = playerInstance.elements.container.querySelector('[data-plyr="fullscreen"]')

        if (fullscreenBtn) {
            fullscreenBtn.addEventListener('click', (e) => {
            if (isIOS()) {
              console.log('ios系统')
              e.preventDefault()

              if (videoEl.webkitEnterFullscreen) {
                videoEl.webkitEnterFullscreen()
              }
        } else {
          console.log('安卓系统')
        }
      })
    }
  })
}

基于以上方法就可以成功实现了!

相关推荐
MacroZheng2 小时前
全面升级!看看人家的后台管理系统,确实清新优雅!
前端·vue.js·typescript
Mintopia2 小时前
一套简单但有效的"代码可读性"提升法:不用重构也能清爽
前端
每天吃饭的羊2 小时前
Node.js 创建可二次编辑的 HTML 文档并生成文件
开发语言·javascript·ecmascript
禅思院2 小时前
一个轻量级 Vue3 轮播组件:支持多视图、滑动距离决定切换数量,核心原理与 Swiper 对比
前端·vue.js·typescript
牛马1112 小时前
Flutter BoxDecoration border 完整用法
开发语言·前端·javascript
CodeSheep2 小时前
宇树科技的最新工资和招人标准
前端·后端·程序员
奔跑的卡卡2 小时前
Web开发与AI融合-第二篇:TensorFlow.js实战:在浏览器中运行AI模型
前端·人工智能·tensorflow
IT_陈寒2 小时前
Vue的响应式居然在这里埋坑,差点加班到天亮
前端·人工智能·后端
We་ct3 小时前
LeetCode 149. 直线上最多的点数:题解深度剖析
前端·javascript·算法·leetcode·typescript