video移动端踩坑记

最近做的项目里涉及到一个视频列表,点击播放视频,有点类似短视频APP个人主页的效果,直接使用了h5自带的video标签,没想到坑一个接一个。
首先展示下效果图:


踩坑记录:

踩坑一:视频列表中直接使用多个video标签无法达到产品的设计效果,在ios微信浏览器,即使没有设置controls属性,还是有一个非常大的播放按钮,巨丑,在华为微信浏览器里,没有设置controls属性则不显示播放按钮,只有满屏的图片,无法告诉用户这是可以播放的视频,其次如果视频数量过大,页面加载了多个video标签,网络差的情况下很容易造成卡顿,手机发烫。
ios微信浏览器效果

解决方案:
视频列表使用视频封面图片作为背景图,然后使用伪元素创建阴影层和播放按钮的效果,点击视频跳到视频详情页自动播放视频。

<div class="video-list-c">
    <ul class="flex" id="newsList">
       <li style="background-image: url('${imageRealPath}')">
            <a href="getVideoDetail?image=${imageRealPath}&videoUrl=${video_url}"> </a>
        </li>
        <li style="background-image: url('${imageRealPath}')">
            <a href="getVideoDetail?image=${imageRealPath}&videoUrl=${video_url}"> </a>
        </li>
    </ul>
</div>

视频列表样式:

.video-list-c ul{
    flex-wrap: wrap;
    padding: 0 .2rem .2rem;
}
.video-list-c ul li{
    position: relative;
     width: 32%;
     height: 2.28rem;
    margin-top: .18rem;
    background-size: cover;
    background-repeat: no-repeat;
 }
.video-list-c ul li:not(:nth-child(3n)){
    margin-right: 2%;
}
.video-list-c ul li:before{
    position: absolute;
    content: '';
    width: 100%;
    height: 100%;
    top:0;
    left: 0;
    background-color: rgba(0,0,0,.3);
    z-index: 10;
}
.video-list-c ul li:after{
    position: absolute;
    content: '';
    width: .4rem;
    height: .4rem;
    top:50%;
    left: 50%;
    -webkit-transform: translate(-50%,-50%);
    -moz-transform: translate(-50%,-50%);
    transform:translate(-50%,-50%);
    background-image: url("../images/video-play.png");
    background-size: 100% 100%;
    z-index: 11;
}
.video-list-c ul li a{
    position: relative;
    display: block;
    width: 100%;
    height:100%;
    z-index: 20;
}
踩坑二:关于自动播放的问题
<video id="my-video" poster="${image}" preload="load" autoplay controls >
        <source src="${videoUrl}" type="video/mp4">
        您的浏览器不支持video标签。
</video>

1.微信浏览器尽管设置了autoplay,但是不生效。需要设置微信JSAPI 的WeiixinJSBridgeReady()方法。

<script type="text/javascript" src="https://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>
<script>
    $(document).ready(function() {
        document.addEventListener('WeixinJSBridgeReady',function(){
            document.getElementById("my-video").play();
        },false);
    })
</script>

设置了以上代码后在ios微信浏览器可以自动播放,但是安卓微信浏览器还需要点击播放才能播放。

2.chrome66以及更高的版本不允许媒体自动播放,原因是提高用户体验,减少数据消耗,现在都在遵循autoplay政策。
对于谷歌浏览器,直接调用play()方法会抛出异常:Uncaught (in promise) DOMException: play() failed because the user didn't interact with the document first.。

 $(document).ready(function() {
        document.addEventListener('WeixinJSBridgeReady',function(){
            document.getElementById("my-video").play();

        },false);
        //document.getElementById("my-video").play();//谷歌浏览器播放抛异常
    })

解决方法:
(1).video可以设置muted属性,即静音播放,则不会报错,谷歌静音自动播放总是被允许的。(视频虽然自动播放了,但是静音,没有声音的视频也不算解决方法)。
(2).修改谷歌自动播放协议(此方案不能实质解决问题,因为你不能让用户也这么操作修改协议)

3.safari ,opera也都阻止自动播放视频。

踩坑三:关于视频宽高设置的问题

刚开始只设置了video标签的宽度,高度自动,发现进来页面会跳一下,原因是视频加载后高度与video的初始高度不一致。
解决方法:
设置父元素的宽高,使video填充父元素。

<div class="video-list-d">
    <video id="my-video" poster="${image}" preload="load" autoplay controls>
        <source src="${videoUrl}" type="video/mp4">
        您的浏览器不支持video标签。
    </video>
</div>

父元素的背景色设置为黑色,并且使用object-fit: scale-down;使视频不变形填充到父容器中

html,body{
    width: 100%;
    height: 100%;
}
.video-list-d{
    width: 100%;
    height:100%;
    background-color: #000;
}
.video-list-d video{
    width: 100%;
    height:100%;
    object-fit: scale-down;
}

原文作者技术博客:https://www.jianshu.com/u/ac4daaeecdfe

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值