iOS 微信浏览器是 Chrome 内核,Android 微信浏览器是 X5 内核。

在微信 X5 浏览器中的问题

  • controls 无法隐藏
  • 不能自动播放(autoplay 无效)
  • 播放时自动全屏

隐藏控件

因为不管 video 是否去掉了 controls 属性,视频都会显示控件,就只有用 css 隐藏掉控件。
一开始时,是设置 css:

  1. video::-webkit-media-controls-enclosure {
  2. display: none !important;
  3. }

但是出现了2中情况:

  1. 情况A:有些手机的微信浏览器会隐藏所有控件,只显示一个居中的播放按钮
  2. 情况B:有些手机上则隐藏了包括播放按钮在内的所有控件,导致无法播放

通过在 Chrome 上设置 setting -> Preferences -> Elements 勾选 “Show user agent shadow DOM”,查看

中的控件的具体实现,然后将上述 css 修改为:

  1. video::-webkit-media-controls-current-time-display,
  2. video::-webkit-media-controls-time-remaining-display,
  3. video::-webkit-media-controls-timeline {
  4. display: none !important;
  5. }

隐藏具体的控件:当前时间、剩余时间、进度条。
则上述情况变为:

  1. 情况A的手机的微信浏览器会显示一个居中的播放按钮,同时下方也会有个小的播放按钮(类似视频网站视频暂停时的样式)
  2. 情况B的手机的微信浏览器只会显示下方的小的播放按钮
  3. 情况A和B都会显示声音调整和全屏控件(因为没有隐藏)

自动播放

微信不允许自动播放视频,必须通过用户交互才能播放。
iOS 中可以使用 js 播放视频(video.play()),但是 Android 中目前没有好的解决方法。

内嵌播放(不要自动全屏)

  1. <video
  2. class="video-source"
  3. width="100%"
  4. height="240px" /*如果有封面,请设置高度*/
  5. controls /*这个属性规定浏览器为该视频提供播放控件*/
  6. style="object-fit:fill" /*加这个style是用于解决 Android / web 的视频在微信里的上下黑边问题*/
  7. webkit-playsinline="true" /*这个属性是用于小窗内播放,而不是全屏播放*/
  8. x-webkit-airplay="true" /*支持iosAirPlay功能*/
  9. playsinline="true" /*支持小窗内播放*/
  10. x5-video-player-type="h5" /*启用H5播放器,是微信Android特性*/
  11. x5-video-orientation="h5" /*播放器的方向,landscape横屏,portraint竖屏,默认值为竖屏*/
  12. x5-video-player-fullscreen="true" /*全屏设置,设置为 true 是防止横屏*/
  13. preload="auto" /*这个属性规定页面加载完成后载入视频*/
  14. >
  15. <source src="">
  16. </video>

video.js

video.js 自定义了播放控件,可以实现在不同手机上都统一显示同一个样式(例如播放按钮),可以播放直播视频(<source src="xxx.m3u8" type="application/x-mpegURL">)

  1. videojs('videoId', {
  2. autoplay: true,
  3. controlBar: {
  4. progressControl: false,
  5. currentTimeDisplay: false,
  6. timeDivider: false,
  7. durationDisplay: false,
  8. remainingTimeDisplay: false,
  9. }
  10. }, function () {
  11. this.play()
  12. .then(() => {
  13. // play success
  14. })
  15. .catch( err => {
  16. // auto play fail
  17. });
  18. });