简易版手淘视频播放器开发心路历程

需求背景

简单描述一下这个功能:在一个走马灯组件里面第一屏是一个视频,第二屏第三屏是图片,点击播放视频,播放过程中滚动窗口,视频 fixed 在窗口顶部,回到顶部,视频还原,两个窗口视频播放进度无缝衔接,类似于淘票票和手机淘宝的功能。

技术方案

在此之前不得不说 那些年我们踩过的坑了。。。

确定要做这个需求的时候,确定了以下几个方案:

  1. 用一个 video ,页面滚动 fixed 在顶部;但是视频是嵌套在 Carousel 里面的,display:fixed; 对于 parentNode 加了 transform 属性根本不生效,position: sticky; 根本就别想了。这时候你可能会想到 【画中画】video.requestPictureInPicture() 解决,但是 画中画 需要用户主动触发。。
  2. 《传送门 react.createProten》, 传送门可以任意挂载 dom ,但是一直拿不到合适的 currentTime(视频当前播放时间),并且部分浏览器(Safari)需要用户主动唤起 play()事件,最后选择放弃;
  3. 两个 video ,一个 在 Carousel 里面显示,一个在页面顶部 fixed,这里搞了个 黑科技,让 fixed 的 video display:none; 了,至于为什么这样做忘记了,目的就是让 dom 显示好像~等我记起来了补充在这。

下文中,便针对 方案三 进行阐述;

事件/方法
video.pause()  // 暂停
video.play() // 播放
video.webkitRequestFullScreen()  //全屏
video.currentTime //当前进度   
video.duration //总进度

详情请移步 mdn 或 w3cSchool。

顽固 bugfix

视频只播放音频没有画面,预发视频的 url 是 http 的不是 https 的,后端帮忙改成 https 的发现也没用,也是查了很久,没找到解决方案,最后发现 Carousel 才是始作俑者!也就是说这个问题根本跟环境无关,而是 Carousel 里面轮播了多少个 item 有关!
查看一下页面元素:
在这里插入图片描述发现 Carousel 里面轮播的内容多出了很多,看一下多出来了几个 video:
在这里插入图片描述
一个 video 是 fixed 的 video,默认 display:none; ,还有一个是 Carousel 里面轮播的 video ,另一个则是 Carousel 为了实现 无线循环 而多出来的 video!播放 video 的时候,触发了 onPlay,但其实真正播放的是隐藏起来为了实现 无限循环 的 video,并且 这两个 Carousel 里面的 video 的 index 是相同的~

『解决方案』:关掉 无限循环(infinite) !简单粗暴~

infinite
Type: bool
Default: true
Description: Infinitely wrap around contents
   <Carousel infinite={false} afterChange={afterChange}>
     // ……
   </Carousel>

Android 和 ios 表现得不同形式

由于测试设备有限,用了三部手机测试兼容:
android:vivo IQOO 3、小米 11
ios:iPhone12
为了避免更多的雷,video 禁用了 controls ,设计师帮忙切了个 ⏯ 的图定位到 video 上面了~通过 onClick 事件触发 video 的 play 和 pause。

实现方案详细阐述

页面采用两个 video,一个现实,一个 display:none; ,当窗口 scroll 到一定距离时 fixed 的video 显示,并且在 需要fixed 和 需要 fixed 的变换过程中互换两个视频的 currentTime ,保证视频播放的 currentTime 是可以衔接上的。

播放是否自动全屏

ios : 自动全屏;
android: 不会自动全屏;

影响:ios 播放自动全屏;
解决方案:

x5-playsinline="true" // 安卓需要设置的属性
playsInline // ios需要设置的属性
webkit-playsinline="true" // ios10需要设置的属性
preload="auto" // 预加载

一个页面两个 video

ios : fixed 的视频 play 时另一个 自动 pause;
android: fixed 的视频 play 时另一个不会 pause;

影响:此时你可能会听间视频播放的时候会有两个声音,一前一后,虽然不仔细听听不出来,但是影响毕竟是在的。。。
hack:判断 android 机时,一个视频播放暂停另一个;监听一下 onPlay 和 onPause 事件就好了~

判断机型代码段:

/* 判断android与ios */
export function phoneModel() {
  const u = navigator.userAgent;
  // const isAndroid = u.indexOf('Android') > -1 || u.indexOf('Linux') > -1; //android终端或者uc浏览器
  const isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); // ios终端
  if (isiOS) {
    return false;
  }
  return true;
}
controls={false} 是否生效

ios : 生效,并且 play 之后也不会再出现;
android: 生效,但是 play 之后会出现自己的 播放/暂停/进度条/全屏 按钮,大概有 3s 左右的 delay;
在这里插入图片描述
框出来的都是 android 机下 video play 之后自带的 controls

影响:上文说到是通过 onClick 去控制 开关变量 操作 video 的 play 和 pause,但是 android play 之后自带了一些 controls ,如果用它自带的 controls 暂停播放的时候,是无法触发 onClick 事件的,关键没哟偶很好的办法禁用,就很头痛~
hack:监听 onPlay 和 onPause 事件,事件里面操作开关变量~监听开关变量,控制 play 和 pause~

video 一旦播放是否会置于顶层

ios:不会置于顶层;
android:置于顶层;
在这里插入图片描述
hack:Carousel 调用 afterChange 判断 currentIndex 和 当前 index 不同的时候隐藏掉就好了, 不建议用 display:none;用 width:0;height:0; 也可以完美解决~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/436593.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Aigtek:功率放大器的选型技巧有哪些

功率放大器在电子设备中扮演着重要的角色&#xff0c;它能够将输入信号放大到所需要的功率水平。在选择功率放大器时&#xff0c;我们需要考虑多个因素&#xff0c;包括功率需求、频率响应、失真和稳定性等。本文将介绍功率放大器选型的一些技巧&#xff0c;帮助您找到适合的功…

基于OpenCV的图形分析辨认05(补充)

目录 一、前言 二、实验内容 三、实验过程 一、前言 编程语言&#xff1a;Python&#xff0c;编程软件&#xff1a;vscode或pycharm&#xff0c;必备的第三方库&#xff1a;OpenCV&#xff0c;numpy&#xff0c;matplotlib&#xff0c;os等等。 关于OpenCV&#xff0c;num…

java基础-锁之volatilesynchronized

文章目录 volatilevolatile内存语义volatile的可见性volatile无法保证原子性volatile禁止重排优化硬件层的内存屏障volatile内存语义的实现下面是基于保守策略的JMM内存屏障插入策略。下面是保守策略下&#xff0c;volatile写插入内存屏障后生成的指令序列示意图下图是在保守策…

数据结构——lesson6二叉树基础

前言 hellohello~这里是土土数据结构学习笔记&#x1f973;&#x1f973; &#x1f4a5;个人主页&#xff1a;大耳朵土土垚的博客 &#x1f4a5; 所属专栏&#xff1a;数据结构学习笔记 &#x1f4a5;对于数据结构顺序表链表有疑问的都可以在上面数据结构的专栏进行学习哦~感…

JuiceSSH结合Cpolar实现公网远程SSH访问内网Linux系统

文章目录 1. Linux安装cpolar2. 创建公网SSH连接地址3. JuiceSSH公网远程连接4. 固定连接SSH公网地址5. SSH固定地址连接测试 处于内网的虚拟机如何被外网访问呢?如何手机就能访问虚拟机呢? cpolarJuiceSSH 实现手机端远程连接Linux虚拟机(内网穿透,手机端连接Linux虚拟机) …

echarts 模拟时间轴播放效果

x,y轴为数值轴&#xff0c;通过设置bar的数据模拟时间播放。标签可通过formatter自定义为时间&#xff0c;播放/停止/速度可通过setInterval来控制(待完善) 代码可直接放echart官方示例执行 let data [1, 2, 3, 4, 5, 6, 7, 8, 9, 10,100]; option {color: [#3398DB],toolti…

代码随想录算法训练营第二天|977、有序数组的平方

977. 有序数组的平方 已解答 简单 相关标签 相关企业 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 示例 1&#xff1a; 输入&#xff1a;nums [-4,-1,0,3,10] 输出&#xff1a;[0,1,9,16,…

Linux Ubuntu系统安装MySQL并实现公网连接本地数据库【内网穿透】

文章目录 前言1 .安装Docker2. 使用Docker拉取MySQL镜像3. 创建并启动MySQL容器4. 本地连接测试4.1 安装MySQL图形化界面工具4.2 使用MySQL Workbench连接测试 5. 公网远程访问本地MySQL5.1 内网穿透工具安装5.2 创建远程连接公网地址5.3 使用固定TCP地址远程访问 前言 本文主…

基于Flask的宠物领养系统的设计与实现

基于Flask的宠物领养系统的设计与实现 涉及技术&#xff1a;python3.10flaskmysql8.0 系统分为普通用户和管理员两种角色&#xff0c;普通用户可以浏览搜索宠物&#xff0c;申请领养宠物&#xff1b;管理员可以分布宠物信息&#xff0c;管理系统等。 采用ORM模型创建数据&am…

chrome浏览器插件content.js和background.js还有popup都是什么,怎么通讯

popup 在用户点击扩展程序图标时&#xff08;下图中的下载图标&#xff09;&#xff0c;都可以设置弹出一个popup页面。而这个页面中自然是可以包含运行的js脚本的&#xff08;比如就叫popup.js&#xff09;。它会在每次点击插件图标——popup页面弹出时&#xff0c;重新载入。…

高并发服务器模型

高并发服务器模型 1.高并发服务器模型--select2.高并发服务器模型--poll3.epoll模型3.1 epoll原理3.2epoll反应堆 1.高并发服务器模型–select 我们知道实现服务器的高并发&#xff0c;可以用多线程或多进程去实现。但还可以利用多路IO技术:select来实现&#xff0c;它可以同时…

html唐诗鉴赏

<!DOCTYPE html> <html> <head><title>文字网页</title> </head> <body><h2 align"center">唐诗鉴赏</h2><hr width"100%" size"1" color"#00ffee"><p align"…

“2024第九届国际发酵培养基应用与发展技术论坛”圆满落幕

3月5日&#xff0c;“2024第九届国际发酵培养基应用与发展技术论坛”在济南圆满落幕。论坛吸引了来自发酵行业400多名代表现场参会&#xff0c;1600多名代表线上参会。本次论坛由中国生物发酵产业协会主办&#xff0c;安琪酵母股份有限公司承办。中国生物发酵产业协会理事长于学…

抽奖小程序怎么一键生成_揭秘这款火爆的抽奖小程序

一键生成&#xff0c;梦想触手可及&#xff01;揭秘这款火爆的抽奖小程序 在快节奏的现代生活中&#xff0c;每个人都渴望找到一份属于自己的幸运与惊喜。而今天&#xff0c;我要为大家介绍的这款抽奖小程序&#xff0c;正是实现这一愿望的神器&#xff01;它不仅操作简单&…

Linux服务器安装nvm

1、 首先查看服务器有没有安装git git --version 2、如果没有安装&#xff1a;在Linux上是有yum安装Git&#xff0c;非常简单&#xff0c;只需要一行命令 yum -y install git 3、git安装完成后&#xff0c;使用以下其中一个命安装NVM # 能访问github的话&#xff0c;使用这…

逆变器专题(17)-下垂控制(1)

相应仿真原件请移步资源下载 通常情况下&#xff0c;离网型逆变器采用的控制方法为电压电流双闭环控制&#xff0c;而常规的电压电流双闭环控制会存在电压跌落&#xff0c;频率失稳等情况&#xff0c;通俗的将就是没有电压和频率的支撑 。 下垂控制是现如今较为常用的李网逆变…

Python接口自动化之cookie、session应用!

以下介绍cookie、session原理及在接口自动化中的应用。 HTTP 协议是一种无状态协议&#xff0c;即每次服务端接收到客户端的请求时&#xff0c;都是一个全新的请求&#xff0c;服务器并不知道客户端的历史请求记录&#xff1b;Session 和 Cookie 的主要目的就是为了弥补 HTTP 的…

运维工单系统哪家好?

数字化转型数字化时代已然到来&#xff0c;企业运维工作的重要性日益突出。为了满足各类企业的运维需求&#xff0c;市场上涌现了诸多运维工单系统厂家&#xff0c;包括卓豪ServiceDesk Plus、Zendesk、Zenduty、Jira Service Desk等。 而选择合适的运维工单系统&#xff0c;对…

《剑指 Offer》专项突破版 - 面试题 74 : 合并区间(C++ 实现)

题目链接&#xff1a;LCR 074. 合并区间 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 输入一个区间的集合&#xff0c;请将重叠的区间合并。每个区间用两个数字表示&#xff0c;它们分别表示区间的起始位置和结束位置。例如&#xff0c;输入区间集合 [[1, 3], …

【异常处理】BadSqlGrammarException低级SQL语法异常

报错 org.springframework.jdbc.BadSqlGrammarException: ### Error querying database. Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use …