uniapp中控制videojs视频播放器全屏以及退出全屏切换的另一种思路

前一阵子用了videojs作为视频播放器,之前为了页面的美观性,把播放器本身的工具栏隐藏了,也就是说播放按钮、全屏按钮等等需要自定义,对于播放、暂停之类的操作,videojs本身是有API的,用起来也挺方便的,但是全屏没有发现有API方法,后来网上查了好多资料,发现全屏以及退出全屏对于所有元素其实都是适用的,一般来说,全屏是:element.requestFullscreen(),退出全屏是:document.exitFullscreen(),并且为了兼容不同浏览器有不同的方法。但是试了安卓是正常的,iOS里面不能全屏,所以只能考虑其他方案了,后来在想,视频全屏无非就是想把视频显示区域放大,那我手动放大显示区域行不行呢,于是试了一下,感觉还行。效果如下:

效果

一、思路

  1. 自定义全屏按钮,点击全屏按钮放大视频显示区域,增加旋转动画
  2. 每次点击之后记录当前是否处于全屏模式的状态,通过此状态动态调整进入全屏-退出全屏的图标
  3. 全屏之后,需要调整视频播放区域的层级以及高度等,以便于全屏之后能够操作视频上的按钮等

二、代码

1.播放器外层容器定义动态样式,播放器本身增加动画

<!-- 示例代码 -->
<!-- 播放器显示区域 -->
    <!-- #ifdef H5 -->
    <view
      class="video-display-wrap"
      :style="{ height: videoDisplayHeight, zIndex: videoDisplayZIndex }"
    >
      <view
        class="video-js"
        :class="{
          'video-rotate-ani': isFullScreen,
          'video-rotate-back-ani': !isFullScreen && !isFirstLoad
        }"
        ref="video"
        style="width: 100%; height: 100%"
      ></view>

      <!-- 返回按钮 -->
      <image
        v-if="isFullScreen"
        :src="resource.backBtnIcon"
        mode="heightFix"
        class="full-screen-btn-icon back-btn"
        @tap.stop="switchFullScreen"
      ></image>
      <!-- 返回按钮 -->

      <!-- 播放按钮 -->
      <image
        v-if="isShowPlayBtn"
        :src="resource.playBtnIcon"
        mode="heightFix"
        class="play-btn-icon"
        @tap.stop="playVideo"
      ></image>
      <!-- 播放按钮 -->

      <!-- 全屏小按钮 -->
      <image
        v-if="isShowFullBtn"
        :src="videoFullScreenIcon"
        mode="heightFix"
        class="full-screen-btn-icon"
        :class="{ 'video-full-icon-pos': isFullScreen }"
        @tap.stop="switchFullScreen"
      ></image>
      <!-- 全屏小按钮 -->

    </view>
    <!-- #endif -->
    <!-- 播放器显示区域 -->

2.定义变量记录当前是否处于全模式

data() {
    return {
          //资源图标
          resource: {
          ...
          //播放按钮图标
          playBtnIcon:
              this.$cnf.resDomains.image +
                  '/1/20102/2022/0418/625cee3f79c73v4lb.png',
          //进入全屏按钮图标
          enterFullScreenIcon:
              this.$cnf.resDomains.image +
                  '/1/20102/2022/0504/62722edb0420at1hj.png',
          //退出全屏按钮图标
          exitFullScreenIcon:
              this.$cnf.resDomains.image +
                  '/1/20102/2022/0506/6273f4d06f96cgu6s.png',
          //全屏的时候返回按钮
          backBtnIcon:
              this.$cnf.resDomains.image +
                  '/1/20102/2022/0506/6274d2b32b769kgeb.png'
          },
          //当前是否是全屏模式
          isFullScreen:false,
          //定义页面是否首次加载(默认是首次加载)
          isFirstLoad:true,
          //活动数据(业务中用到)
          activityDetail:{}
          ...
    }
}

3.切换全屏方法

//切换视频全屏
switchFullScreen() {
    if (this.isFirstLoad) {
      //标记已经不是首次加载了,避免首次页面加载的时候播放器有旋转的动画
      this.isFirstLoad = false
    }
    this.isFullScreen = !this.isFullScreen
},

4.页面样式控制的相关计算属性

computed: {
    //视频显示区域的层级
    videoDisplayZIndex() {
      //如果是横屏模式并且当前是全屏模式
      if (this.activityDetail.style.mode == 2 && this.isFullScreen) {
        return 10075
      } else {
        return 999
      }
    },
    //视频显示区域高度
    videoDisplayHeight() {
       //如果是横屏模式并且当前是全屏模式
      if (this.activityDetail.style.mode == 2 && this.isFullScreen) {
        const systemInfo = uni.getSystemInfoSync()
        return systemInfo.windowHeight + 'px'
      } else {
        return 'auto'
      }
    },
    //视频全屏/退出全屏图标
    videoFullScreenIcon() {
      if (this.isFullScreen) {
        return this.resource.exitFullScreenIcon
      } else {
        return this.resource.enterFullScreenIcon
      }
    },
   ...
}

5.部分css样式

//视频显示区域样式
.video-display-wrap {
    position: relative;
    display: flex;
    justify-content: center;
    align-items: center;
    background: #000000;
    overflow: hidden;
    .play-btn-icon {
      position: absolute;
      z-index: 999;
      width: 100rpx;
      height: 100rpx;
    }
    .full-screen-btn-icon {
      position: absolute;
      bottom: 20rpx;
      right: 20rpx;
      z-index: 999;
      width: 50rpx;
      height: 50rpx;
    }
    .back-btn {
      top: 30rpx;
      right: 30rpx;
      transform: rotate(90deg);
      -webkit-transform: rotate(90deg);
    }
}

//进入全屏的旋转放大动画
.video-rotate-ani {
  animation: videoRotateAni 0.8s 1 forwards;
  @keyframes videoRotateAni {
    0% {
      transform: rotate(0deg) scale(1);
      -webkit-transform: rotate(0deg) scale(1);
    }
    100% {
      transform: rotate(90deg) scale(1.77);
      -webkit-transform: rotate(90deg) scale(1.77);
    }
  }
}

//退出全屏的动画
.video-rotate-back-ani {
  animation: videoRotateBackAni 0.8s 1 forwards;
  @keyframes videoRotateBackAni {
    0% {
      transform: rotate(90deg) scale(1.77);
      -webkit-transform: rotate(90deg) scale(1.77);
    }
    100% {
      transform: rotate(0deg) scale(1);
      -webkit-transform: rotate(0deg) scale(1);
    }
  }
}
//动态调整全屏按钮的位置
.video-full-icon-pos {
  left: 30rpx !important;
  bottom: 30rpx !important;
}

三、备注

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,406评论 6 503
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,732评论 3 393
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,711评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,380评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,432评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,301评论 1 301
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,145评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,008评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,443评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,649评论 3 334
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,795评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,501评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,119评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,731评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,865评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,899评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,724评论 2 354

推荐阅读更多精彩内容