解决 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('安卓系统')
        }
      })
    }
  })
}

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

相关推荐
恋猫de小郭4 小时前
Amper 正式转正 Kotlin Toolchain ,Gradle 未来何去何从
android·前端·flutter
敲代码的彭于晏5 小时前
Bean 生命周期完全图解:前端同学也能看懂的 Spring 核心机制
java·前端·后端
IT_陈寒5 小时前
Redis内存飙升的锅,原来是我没搞懂这个过期策略
前端·人工智能·后端
云浪5 小时前
前端二进制数组完全指南:ArrayBuffer、TypedArray、DataView 一次讲透
前端·javascript
张风捷特烈5 小时前
Flutter 类库大揭秘#02 | path_provider 各平台实现
前端·flutter
铁皮饭盒5 小时前
26年bunjs, elysia+pg一把梭, redis都省了
前端·javascript·后端
lichenyang45318 小时前
Docker 学习笔记(一):为什么需要镜像、容器和仓库?
前端
kyriewen19 小时前
别再对着 TypeScript 报错发呆了:我把 10 个最常见的红色波浪线翻译成了人话
前端·javascript·typescript
IT_陈寒19 小时前
SpringBoot自动配置的坑,我的API突然就404了
前端·人工智能·后端