让没有小窗播放的视频网站的视频小窗播放

让没有小窗播放的视频网站的视频小窗播放

// 视频小窗播放控制台脚本
// 将此代码复制到浏览器控制台运行
// 运行后,页面中的视频将添加小窗播放功能(function() {// 获取页面中的所有video元素const videos = document.querySelectorAll('video');if (videos.length === 0) {console.log('页面中没有找到video元素');return;}// 创建小窗容器const pipContainer = document.createElement('div');pipContainer.id = 'pip-container';pipContainer.style.cssText = `position: fixed;bottom: 20px;right: 20px;width: 300px;height: 200px;border-radius: 10px;overflow: hidden;box-shadow: 0 10px 30px rgba(0,0,0,0.5);z-index: 10000;border: 2px solid #ff6b6b;background: black;display: none;cursor: move;`;// 创建小窗标题栏const pipHeader = document.createElement('div');pipHeader.style.cssText = `background: rgba(0,0,0,0.7);padding: 8px 12px;display: flex;justify-content: space-between;align-items: center;font-family: Arial, sans-serif;color: white;font-size: 14px;`;pipHeader.textContent = '小窗播放 (可拖拽)';// 创建关闭按钮const closeBtn = document.createElement('button');closeBtn.textContent = '×';closeBtn.style.cssText = `background: none;border: none;color: white;cursor: pointer;font-size: 20px;line-height: 1;padding: 0;width: 24px;height: 24px;display: flex;align-items: center;justify-content: center;`;pipHeader.appendChild(closeBtn);pipContainer.appendChild(pipHeader);// 创建小窗中的video元素const pipVideo = document.createElement('video');pipVideo.id = 'pip-video';pipVideo.style.cssText = `width: 100%;height: calc(100% - 36px);object-fit: contain;background: black;`;pipVideo.controls = true;pipContainer.appendChild(pipVideo);// 添加到页面中document.body.appendChild(pipContainer);// 状态存储const videoStates = new Map();// 为每个视频添加小窗按钮videos.forEach((video, index) => {// 创建按钮容器const btnContainer = document.createElement('div');btnContainer.style.cssText = `position: absolute;bottom: 10px;right: 10px;z-index: 100;`;// 创建小窗按钮const pipBtn = document.createElement('button');pipBtn.textContent = '小窗播放';pipBtn.style.cssText = `background: rgba(255, 107, 107, 0.8);color: white;border: none;padding: 8px 12px;border-radius: 4px;cursor: pointer;font-family: Arial, sans-serif;font-size: 14px;font-weight: bold;backdrop-filter: blur(5px);box-shadow: 0 2px 8px rgba(0,0,0,0.3);transition: all 0.2s;`;pipBtn.addEventListener('mouseover', () => {pipBtn.style.background = 'rgba(255, 107, 107, 1)';pipBtn.style.transform = 'scale(1.05)';});pipBtn.addEventListener('mouseout', () => {pipBtn.style.background = 'rgba(255, 107, 107, 0.8)';pipBtn.style.transform = 'scale(1)';});// 添加到视频容器if (video.parentNode) {video.parentNode.style.position = 'relative';video.parentNode.appendChild(btnContainer);btnContainer.appendChild(pipBtn);}// 保存原始视频状态videoStates.set(video, {originalParent: video.parentNode,originalIndex: index,originalPosition: {top: video.style.top,left: video.style.left,width: video.style.width,height: video.style.height,position: video.style.position}});// 按钮点击事件pipBtn.addEventListener('click', () => {// 如果小窗已经在播放此视频,则关闭小窗if (pipContainer.style.display === 'block' && pipVideo.src === video.src) {pipContainer.style.display = 'none';pipVideo.pause();pipVideo.src = '';// 恢复原始视频if (videoStates.has(video)) {const state = videoStates.get(video);if (state.originalParent) {state.originalParent.appendChild(video);Object.assign(video.style, state.originalPosition);}}video.play();return;}// 保存当前播放时间const currentTime = video.currentTime;// 克隆原始视频的源设置pipVideo.innerHTML = '';const sources = video.querySelectorAll('source');sources.forEach(source => {const newSource = document.createElement('source');newSource.src = source.src;newSource.type = source.type;pipVideo.appendChild(newSource);});// 设置小窗视频源pipVideo.src = video.src;pipVideo.currentTime = currentTime;pipContainer.style.display = 'block';// 隐藏原始视频video.style.display = 'none';// 播放小窗视频pipVideo.play().catch(error => {console.error('小窗视频播放失败:', error);// 恢复原始视频video.style.display = '';pipContainer.style.display = 'none';// 尝试使用画中画API作为备选方案if (document.pictureInPictureEnabled) {video.requestPictureInPicture().catch(pipError => {console.error('画中画API失败:', pipError);});}});});});// 关闭按钮事件closeBtn.addEventListener('click', () => {pipContainer.style.display = 'none';pipVideo.pause();pipVideo.src = '';// 恢复所有视频videos.forEach(video => {if (videoStates.has(video)) {const state = videoStates.get(video);if (state.originalParent) {video.style.display = '';state.originalParent.appendChild(video);Object.assign(video.style, state.originalPosition);}}});});// 拖拽功能let isDragging = false;let offsetX, offsetY;pipHeader.addEventListener('mousedown', (e) => {isDragging = true;offsetX = e.clientX - pipContainer.getBoundingClientRect().left;offsetY = e.clientY - pipContainer.getBoundingClientRect().top;pipContainer.style.cursor = 'grabbing';});document.addEventListener('mousemove', (e) => {if (isDragging) {pipContainer.style.left = (e.clientX - offsetX) + 'px';pipContainer.style.top = (e.clientY - offsetY) + 'px';}});document.addEventListener('mouseup', () => {isDragging = false;pipContainer.style.cursor = 'grab';});console.log('小窗播放功能已激活!页面中找到 ' + videos.length + ' 个视频');console.log('使用方法:点击视频右下角的"小窗播放"按钮');
})();

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

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

相关文章

Linux内核在启动过程中挂载根文件系统rootfs的过程

一、挂载根文件系统rootfs的过程: 1. ‌初始虚拟根文件系统的挂载‌ 内核启动时首先会创建并挂载一个‌临时虚拟根文件系统(如initramfs或rootfs)‌‌15。该阶段主要作用: 提供基础的设备节点和目录结构,确保内核能访…

【LeetCode】力扣题——轮转数组、消失的数字、数组串联

🔥个人主页:艾莉丝努力练剑 ❄专栏传送门:《C语言》、《数据结构与算法》、C语言刷题12天IO强训 🍉学习方向:C/C方向 ⭐️人生格言:为天地立心,为生民立命,为往圣继绝学,…

Java Stream详解

Java Stream详解 Stream 是 Java 8 引入的流式数据处理工具,可以像流水线一样对集合数据进行高效操作(过滤、转换、统计等)。核心特点: 链式操作:支持多个操作串联不修改原始数据:生成新结果支持并行处理…

Java回归循环理解

一、Java循环的四种 1. 传统for循环 - 精确控制的首选 // 遍历数组 int[] numbers {1, 2, 3, 4, 5}; for (int i 0; i < numbers.length; i) {System.out.println(numbers[i]); }// 嵌套示例&#xff1a;矩阵遍历 int[][] matrix {{1, 2}, {3, 4}}; for (int row 0; r…

飞腾D2000金融工控主板,点亮经济高质量发展

近年来&#xff0c;国家不断推出金融行业的政策和法规&#xff0c;推动金融业高质量发展。在国家大力推进金融行业改革和创新的大环境下&#xff0c;金融工控主板市场也迎来了新的发展机遇。随着国产CPU技术的不断突破&#xff0c;以及我国对金融安全重视程度的提高&#xff0c…

SimpleITK——创建nrrd体素模型

在介绍如何生成nrrd前&#xff0c;了解一下为什么医学影像上一般使用nrrd的体素模型&#xff1f; 为什么医学影像上一般使用nrrd的体素模型&#xff1f; 在医学影像领域&#xff0c;‌NRRD&#xff08;Nearly Raw Raster Data&#xff09;格式‌被广泛用于存储体素模型&#x…

Docker容器部署KES

一、安装部署 1&#xff0c;导入镜像 #导入镜像&#xff08;root用户&#xff09; [rootnode docker ]# mv kdb_x86_64_V008R006C009B0014.tar kingbase.tar [rootnode docker]# docker load -i kingbase.tar#查看镜像&#xff08;root用户&#xff09; [rootnode docker]# d…

C++基础练习 sort函数,用于排序函数

题目&#xff1a; https://acm.hdu.edu.cn/showproblem.php?pid2039 解答&#xff1a; #include <iostream> #include <cmath> #include <algorithm> using namespace std;double a[3]; int main(){int n;cin>>n;while(n--){cin>>a[0]>>…

棱镜观察|EMB“重构”卡钳,车企降本压力与Brembo困局

传统制动卡钳市场&#xff0c;正在迎来变革时刻。 一直以来&#xff0c;采埃孚、大陆集团、日立安斯泰莫等外资供应商占据中国乘用车卡钳前装市场&#xff08;包括前制动卡钳和后集成EPB卡钳&#xff09;的半壁江山。同时&#xff0c;伯特利、亚太股份、万向、弗迪等中国供应商…

《颠覆传统:CSS遮罩的图像创意设计指南》

想象有一块神奇的模板&#xff0c;上面有各种形状的镂空区域&#xff0c;当我们将这块模板覆盖在图像上时&#xff0c;只有透过镂空区域才能看到图像的部分&#xff0c;而模板遮挡的地方则被隐藏起来&#xff0c;这便是CSS遮罩的核心概念。遮罩&#xff0c;简单来说&#xff0c…

5.基于神经网络的时间序列预测

近年来&#xff0c;已经开发了一些深度学习方法并将其应用于单变量时间预测场景&#xff0c;其中时间序列由在等时间增量上按顺序记录的单个观测数据组成。 5.1 将深度学习用于时间序列预测的原因 机器学习的目标是提取特征来训练模型。模型将输入数据&#xff08;例如图片&am…

【软考高级系统架构论文】论软件设计方法及其应用

论文真题 软件设计 (Software Design,SD) 根据软件需求规格说明书设计软件系统的整体结构、划分功能模块、确定每个模块的实现算法以及程序流程等,形成软件的具体设计方案。软件设计把许多事物和问题按不同的层次和角度进行抽象,将问题或事物进行模块化分解,以便更容易解决…

什么是水平扩展

什么是水平扩展 在现代系统架构设计中&#xff0c;可扩展性&#xff08;Scalability&#xff09;是衡量系统面对业务增长时应对能力的重要指标。而“水平扩展”&#xff08;Horizontal Scaling&#xff09;&#xff0c;又称为“横向扩展”或“扩容节点”&#xff0c;正是应对高…

掌握openpyxl:Excel自动化处理全指南

openpyxl基础用法 openpyxl 是一个用于处理 Excel 文件&#xff08;.xlsx/.xlsm&#xff09;的 Python 库&#xff0c;支持读取、修改和创建 Excel 文档。以下是其常见用法的详细介绍&#xff1a; 一、基础操作&#xff1a;打开与保存文件 from openpyxl import load_workbo…

FastGPT:开启大模型应用新时代(4/6)

摘要&#xff1a;FastGPT是一种基于大语言模型&#xff08;LLM&#xff09;的知识库问答系统&#xff0c;致力于提供高效、精准的自然语言处理服务。它允许用户构建本地知识库以增强AI的理解能力&#xff0c;通过将用户的问题与知识库信息匹配推理&#xff0c;生成有针对性的回…

在MyBatis中$和#有什么区别

在 MyBatis 中&#xff0c;${} 和 #{} 是两种处理 SQL 参数的占位符&#xff0c;它们在实现机制、安全性、使用场景上存在显著差异。以下是详细对比&#xff1a; 核心区别对比 特性#{}${}底层机制预编译占位符&#xff08;PreparedStatement&#xff09;字符串直接替换安全性…

湖北理元理律师事务所债务优化方案:平衡还款与生活的法律实践

在个人债务问题日益突出的当下&#xff0c;如何科学规划还款路径成为社会性难题。湖北理元理律师事务所基于多年实务经验&#xff0c;提出“可持续债务优化”模型&#xff0c;其核心在于通过法律工具实现三重平衡&#xff1a; 债权债务的法律平衡&#xff1a;严格依据《民法典…

使用 Isaac Sim 模拟机器人

前言 将 2D 激光雷达数据从 Isaac Sim 流式传输至 ROS 2&#xff0c;并通过 RViz 进行可视化。通过激光雷达数据监控机器人与环境的交互&#xff0c;从而在仿真环境中提升机器人的感知能力。 概览 欢迎来到 入门指南&#xff1a;在 Isaac Sim 中模拟您的第一个机器人 课程。我…

quartz 表达式最近10次执行时间接口编写

Nuget安装 <PackageReference Include"CronExpressionDescriptor" Version"2.41.0" /> <PackageReference Include"CronExpressionDescriptor-zh-CN" Version"2.32.0" /> <PackageReference Include"Quartz"…

解锁数据宝藏:数据挖掘之数据预处理全解析

目录 一、引言&#xff1a;数据预处理 —— 数据挖掘的基石二、数据预处理的重要性2.1 现实数据的问题剖析2.2 数据预处理的关键作用 三、数据预处理的核心方法3.1 数据清洗3.1.1 缺失值处理3.1.2 离群点处理3.1.3 噪声处理 3.2 数据集成3.2.1 实体识别3.2.2 冗余处理3.2.3 数据…