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

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

相关推荐
人月神话-Lee1 分钟前
【WWDC】Core AI:iOS 端侧大模型新纪元
人工智能·ios·ai·swift·wwdc·core ai
moMo7 分钟前
Promise 的本质:不是异步处理,而是流程控制
javascript
dotnet908 分钟前
PDF 页面尺寸上限是 14400。iText 直接加载成功的大图可能超过这个限制,需要在 setPageSize 之前等比缩放。
前端·javascript·html
threelab9 分钟前
Three.js 几何图形变换 | 三维可视化 / AI 提示词
开发语言·前端·javascript·人工智能·3d·着色器
道友可好10 分钟前
写给 AI 的入职手册,AGENTS.md
前端·人工智能·后端
吠品18 分钟前
处理 Python 类继承中那些变来变去的初始化参数
linux·前端·python
云水一下21 分钟前
TypeScript 从零基础到精通(七):从配置到全栈项目落地
前端·javascript·typescript
向日的葵00628 分钟前
Vue 路由传参的三种方式(三)
vue.js·路由
秋天的一阵风39 分钟前
✨ 代码秒跳转、自动补全?全靠 LSP 和 AST!
前端·后端·ai编程
如果超人不会飞1 小时前
TinyVue Checkbox复选框组件使用指南
前端·vue.js