一个自定义的html5视频播放器

news2025/1/21 7:20:31

// 功能:

// 1.视频的播放与暂停(图标变化)

// 2.总时间的显示

// 3.当前时间的显示(进度)

// 4.进度条的显示

// 5.跳跃播放

// 6.全屏

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>自定义视频播放器</title>
  <!-- 所有的库一定都在当前页面的css的前面 -->
  <link rel="stylesheet" href="./css/font-awesome.min.css">
  <!-- <link rel="stylesheet" href="./css/font-awesome.css"> -->
  <link rel="stylesheet" href="./css/main.css">
</head>
<body>
  <div class="player">
    <!-- 视频 -->
    <video src="./movie/movie02.mp4" width="100%" height="100%">
      <!-- <source src="./movie//movie02.mp4"> -->
    </video>
    <!-- 控制菜单 -->
    <div class="controls">
      <!-- 播放按钮 -->
      <a href="javascript:;" class="play-btn fa fa-play-circle-o"></a>
      <!-- 进度条 -->
      <div class="progress">
        <div class="progress-bar" style="width: 0%"></div>
      </div>
      <!-- 播放时间 -->
      <div class="time">
        <span class="current">00:00:00</span>/
        <span class="total">00:00:00</span>
      </div>
      <!-- 全屏按钮 -->
      <a href="javascript:;" class="fullscreen fa fa-expand"></a>
    </div>
  </div>
  <script>
    // 功能:
    // 1.视频的播放与暂停(图标变化)
    // 2.总时间的显示
    // 3.当前时间的显示(进度)
    // 4.进度条的显示
    // 5.跳跃播放
    // 6.全屏
    // 下面开始实现功能:



    // 1.视频的播放与暂停(图标变化)
    // 获取视频以及按钮
    var video=document.querySelector("video");
    var btn=document.querySelector(".play-btn");
    btn.addEventListener("click",function(){
      // 判断视频状态并改变按钮
      if(video.paused){
        video.play();
        // this.classList.toggle("fa-pause-circle-o");
        this.classList.remove("fa-play-circle-o");
        this.classList.add("fa-pause-circle-o");

      }else{
        video.pause();
        this.classList.remove("fa-pause-circle-o");
        this.classList.add("fa-play-circle-o");
      }
    });
    // 2.总时间的显示
    // 获取总时间的按钮
    var total=document.querySelector(".total");
    video.oncanplay=function(){
      var h=Math.floor(video.duration/3600);
      var m=Math.floor(video.duration/60-(h*60));
      var s=Math.floor(video.duration%60);
      h=h<10?'0'+h:h;
      m=m<10?'0'+m:m;
      s=s<10?'0'+s:s;
      total.innerHTML=h+':'+m+':'+s;
    }
    // 获取当前时间
    var current=document.querySelector(".current");
    // 获取进度条
    var progressBar = document.querySelector(".progress-bar");
    video.ontimeupdate=function(){
      var h=Math.floor(video.currentTime/3600);
      var m=Math.floor(video.currentTime/60-(h*60));
      var s=Math.floor(video.currentTime%60);
      h=h<10?'0'+h:h;
      m=m<10?'0'+m:m;
      s=s<10?'0'+s:s;
      current.innerHTML=h+':'+m+':'+s;
        // 计算公式 进度条的长度 = 当前时间 / 总时间 * 100 + '%'
        progressBar.style.width = video.currentTime / video.duration * 100 + '%';
    }
    //跳跃播放
    // 获取进度条
    var progress=document.querySelector(".progress");
    progress.addEventListener("click",function(event){
        var clickX=event.offsetX;
        var width=this.offsetWidth
       video.currentTime = clickX / width * video.duration;
    });
    // 全屏
    // 获取按钮
    var fullscreen = document.querySelector(".fullscreen");
    fullscreen.onclick = function () {
    // 请求全屏
      video.webkitRequestFullScreen();
      
    }

  </script>
</body>
</html>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

利用决策树学习基金持仓并识别公司风格类型

摘要与声明 1&#xff1a;本文主要利用决策树学习基金持仓并反向推理出一套更受市场认可的风格划分标准&#xff0c;最后借助该模型识别公司所属的风格类型&#xff1b; 2&#xff1a;本文主要为理念的讲解&#xff0c;模型也是笔者自建&#xff0c;文中假设与观点是基于笔者…

JVM的内存配置参数

VM的结构问题&#xff1a;JVM分两块&#xff1a;PermanentSapce和HeapSpace&#xff0c; HeapSpace 【old new{Eden&#xff0c;from&#xff0c;to}】 PermantSpace主要负责存放加载Class类级别的class本身&#xff0c;method&#xff0c;field等反射对象&#xff0c;一般不…

重磅指挥棒!2023年国资委央企指标考核体系从两利四率到一利五率变化解读

前几天&#xff0c;2023年的第三个工作日&#xff0c;国资委召开了中央企业负责人会议&#xff0c;提出了优化中央企业经营考核指标体系的六个指标 —— 一利五率&#xff0c;目标是一增一稳四提升。一增&#xff0c;就是确保利润总额增速高于全国GDP增速。一稳&#xff0c;资产…

小程序学习(1)-------小程序的结构及作用

获取APPID 开发-开发管理->开发设置&#xff08;新建项目时需要输入appid&#xff09; 小程序的文件结构 pages 用来存放所有小程序的页面 utils 用来存放工具性质的模块&#xff08;例如&#xff1a;格式化时间的自定义模块&#xff09; app.js 小程序项目的入口文件 ap…

【Redis】分别从互斥锁与逻辑过期两个方面来解决缓存击穿问题

文章目录前言一.什么是缓存击穿二.基于互斥锁解决缓存击穿三.基于逻辑过期解决缓存击穿四.接口测试五.两者对比前言 身逢乱世&#xff0c;未雨绸缪 一.什么是缓存击穿 说直白点&#xff0c;就是一个被非常频繁使用的key突然失效了请求没命中缓存&#xff0c;而因此造成了无数…

使用electron将vue项目打包成exe

文章目录一、前言二、实现方法1.跑通示例代码 electron-quick-start<1>clone示例代码<2>进入项目根目录&#xff0c;下载依赖<3>测试运行2.打包自己的 vue 项目3.将vue项目整合到示例代码中打包exe<1>将打包好的 dist 文件夹复制到示例代码 electron-q…

sklearn之OPTICS聚类

文章目录简介sklearn实现cluster_optics_dbscan简介 OPTICS算法&#xff0c;全称是Ordering points to identify the clustering structure&#xff0c;是一种基于密度的聚类算法&#xff0c;是DBSCAN算法的一种改进。 众所周知&#xff0c;DBSCAN算法将数据点分为三类&#…

ResNet精读(2)

FLOPs &#xff1a;整个网络要计算多少个浮点运算 卷积层的浮点运算等价于 输入的高*输入的宽*通道数*输出通道数再乘以卷积核的高和宽再加上全连接的一层 我们发现训练的时候的精度是要比测试精度来的高的在一开始&#xff0c;这是因为训练的时候用了数据增强 使得训练误差…

2022年莱佛士大盘点 ,设计的种子遍地开花!

2022似乎过得尤其之快&#xff0c;反复的居家隔离和线上网课&#xff0c;似乎给2022蒙上了一层雾蒙蒙的灰色。但2022总还给我们留下了些东西&#xff0c;在莱佛士设计学院&#xff0c;我们共同见证了梦想的种子在设计的各个领域遍地开花。现在我们一起来看看2022年莱佛士学生们…

广义表——LISP的基石

线性表中存放的是同一类型的元素&#xff0c;而广义表是线性表的推广&#xff0c;即广义表中除包含类型相同的元素外&#xff0c;还可以包含具有其自身结构的元素。在人工智能领域使用十分广泛的 LISP语言中&#xff0c;广义表是一种基本数据类型&#xff0c;LISP 语言中的数据…

Vue3案例-todoMVC-pinia版 (可跟做练手)

列表展示功能 &#xff08;1&#xff09; 在main.js中引入pinia import { createApp } from vue import App from ./App.vue import { createPinia } from pinia import ./styles/base.css import ./styles/index.cssconst pinia createPinia() createApp(App).use(pinia).m…

Spring源码学习~11、Bean 的加载步骤详解(二)

Bean 的加载步骤详解&#xff08;二&#xff09; 一、循环依赖 1、什么是循环依赖 循环依赖就是循环引用&#xff0c;即两个或多个 bean 互相之间持有对方&#xff0c;如下图&#xff1a; 循环引用不是循环调用&#xff0c;循环调用是方法之间的环调用&#xff0c;循环调用是…

谷粒学院——Day18【权限管理Spring Security、配置中心Nacos、代码托管git】

❤ 作者主页&#xff1a;欢迎来到我的技术博客&#x1f60e; ❀ 个人介绍&#xff1a;大家好&#xff0c;本人热衷于Java后端开发&#xff0c;欢迎来交流学习哦&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 如果文章对您有帮助&#xff0c;记得关注、点赞、收藏、…

Linux搭建Gitlab保姆级教程

文章目录1、gitlab安装1.1、gitlab介绍1.1.1、概念1.1.2、gitlab与github的区别1.1.3、gitlab的优势1.1.4、gitlab主要服务构成1.1.5、gitlab的工作流程1.2、准备工作1.3、安装1.4、配置1.5、启动1.6、测试2、gitlab安装目录3、gitlab常用命令4、注册账号5、gitlab相关设置5.1、…

上半年要写的博客文章23

上半年要写的博客文章21 这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个…

ArcGIS基础实验操作100例--实验76按格网统计点要素

本实验专栏参考自汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a;请访问实验1&#xff08;传送门&#xff09; 高级编辑篇--实验76 按格网统计点要素 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;1&…

java EE 初阶 — CAS 的介绍

文章目录CAS1. 什么是 CAS2. CAS 是怎么实现的3. CAS 有哪些应用3.1 实现原子类3.2 实现自旋锁4. CAS 的 ABA 问题4.1 什么是 ABA 问题4.2 ABA 问题引来的 BUG4.3 解决方案5. 相关面试题CAS 1. 什么是 CAS CAS&#xff1a;全称 Compare and swap&#xff0c;字面意思&#xff…

设计模式——工厂方法模式

文章目录1. 工厂方法模式的定义2. 工厂方法模式的类图3. 工厂方法模式的作用4. 工厂方法模式的实现1. 工厂方法模式的定义 定义了一个创建对象的接口&#xff0c;但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。 2. 工厂方法模式的类图 3. 工厂方法模式…

[教程]一文搞懂STM32使用DHT11采集温湿度

1、DHT11简介 DHT11数字温湿度传感器是一款含有已校准数字信号输出的温湿度复合传感器。它应用专用的数字模块采集技术和温湿度传感技术&#xff0c;确保产品具有极高 的可靠性与卓越的长期稳定性。传感器包括一个电阻式感湿元件和一个NTC测 温元件&#xff0c;并与一个高性能8…

GO语言基础-08-内建函数-make()、new()

文章目录1. make1.1 概述1.2 示例&#xff08;make切片&#xff09;1.3 示例&#xff08;make map&#xff09;1.4 示例&#xff08;make 通道&#xff09;2. new2.1 概念2.2 示例&#xff08;new 切片&#xff09;2.3 示例&#xff08;new和make对比&#xff09;2.4 示例&…