扫码关注官方订阅号
正文
0
心靈之曲
发布时间:2025-09-12 14:10:01
912人浏览过
来源于php中文网
原创
在现代web应用中,触摸滑动组件因其直观的用户体验而广受欢迎。最初,这类组件多用于展示图片画廊。然而,随着富媒体内容的兴起,将图片滑动器升级为视频滑动器成为一个常见的需求。将静态图片替换为动态视频并非简单的标签替换,视频元素自带的交互行为(如拖拽、播放控制)可能会与滑动组件的自定义javascript逻辑产生冲突,导致滑动功能“冻结”或失效。本教程将深入探讨如何解决这些挑战,实现一个功能完善的触摸滑动视频播放器。
将图片滑动器改造为视频滑动器,最核心的步骤是替换HTML中的 标签为 标签。为了确保视频能够正确加载、显示并提供用户控制,需要注意以下几点:
以下是改造后的HTML结构示例:
Airpods $199 您的浏览器不支持视频播放。 Buy Now iPhone 12 $799 您的浏览器不支持视频播放。 Buy Now iPad $599 您的浏览器不支持视频播放。 Buy Now
将 替换为 后,需要相应地调整CSS样式,以确保视频在滑动器中能够正确地布局和响应。关键在于将原来针对 img 元素的样式规则应用到 video 元素上。
以下是适配后的CSS样式:
立即学习“Java免费学习笔记(深入)”;
知了zKnown:致力于信息降噪 / 阅读提效的个人知识助手。
@import url('https://fonts.googleapis.com/css2?family=Open+Sans&display=swap'); * { box-sizing: border-box; margin: 0; padding: 0; } html, body { font-family: 'Open Sans', sans-serif; height: 100%; width: 100%; overflow: hidden; background-color: #333; color: #fff; line-height: 1.7; } .slider-container { height: 100vh; display: inline-flex; overflow: hidden; transform: translateX(0); transition: transform 0.3s ease-out; cursor: grab; } .slide { max-height: 100vh; width: 100vw; display: flex; flex-direction: column; align-items: center; justify-content: center; padding: 1rem; user-select: none; } /* 将此处 img 选择器改为 video */ .slide video { max-width: 100%; max-height: 60%; transition: transform 0.3s ease-in-out; } .slide h2 { font-size: 2.5rem; margin-bottom: 0.5rem; } .slide h4 { font-size: 1.3rem; } .btn { background-color: #444; color: #fff; text-decoration: none; padding: 1rem 1.5rem; } .grabbing { cursor: grabbing; } .grabbing .slide video { /* 同样将此处 img 选择器改为 video */ transform: scale(0.9); }
JavaScript是实现滑动逻辑的核心。将图片替换为视频后,最常遇到的问题是滑动器在第一次操作后“冻结”。这通常是因为视频元素具有其自身的默认拖拽行为,与自定义的触摸或鼠标拖拽事件冲突。解决此问题的关键在于阻止视频元素的默认 dragstart 事件。
以下是完整的JavaScript代码,其中已包含了对视频元素 dragstart 事件的处理:
/* This JS code is from the following project: https://github.com/bushblade/Full-Screen-Touch-Slider */ const slider = document.querySelector('.slider-container'), slides = Array.from(document.querySelectorAll('.slide')) let isDragging = false, startPos = 0, currentTranslate = 0, prevTranslate = 0, animationID = 0, currentIndex = 0 slides.forEach((slide, index) => { // 确保这里选择的是 video 元素 const slideImage = slide.querySelector('video') // 阻止视频元素的默认 dragstart 行为,这是解决“冻结”问题的关键 slideImage.addEventListener('dragstart', (e) => e.preventDefault()) // Touch events slide.addEventListener('touchstart', touchStart(index)) slide.addEventListener('touchend', touchEnd) slide.addEventListener('touchmove', touchMove) // Mouse events slide.addEventListener('mousedown', touchStart(index)) slide.addEventListener('mouseup', touchEnd) slide.addEventListener('mouseleave', touchEnd) slide.addEventListener('mousemove', touchMove) }) // Disable context menu window.oncontextmenu = function (event) { event.preventDefault() event.stopPropagation() return false } function touchStart(index) { return function (event) { currentIndex = index startPos = getPositionX(event) isDragging = true // https://css-tricks.com/using-requestanimationframe/ animationID = requestAnimationFrame(animation) slider.classList.add('grabbing') } } function touchEnd() { isDragging = false cancelAnimationFrame(animationID) const movedBy = currentTranslate - prevTranslate // 根据移动距离判断是否切换到上一个或下一个幻灯片 if (movedBy < -100 && currentIndex < slides.length - 1) currentIndex += 1 if (movedBy > 100 && currentIndex > 0) currentIndex -= 1 setPositionByIndex() slider.classList.remove('grabbing') } function touchMove(event) { if (isDragging) { const currentPosition = getPositionX(event) currentTranslate = prevTranslate + currentPosition - startPos } } function getPositionX(event) { return event.type.includes('mouse') ? event.pageX : event.touches[0].clientX } function animation() { setSliderPosition() if (isDragging) requestAnimationFrame(animation) } function setSliderPosition() { slider.style.transform = `translateX(${currentTranslate}px)` } function setPositionByIndex() { currentTranslate = currentIndex * -window.innerWidth prevTranslate = currentTranslate setSliderPosition() }
为了方便读者实践,以下提供一个包含上述HTML、CSS和JavaScript的完整页面结构。您可以将其保存为 .html 文件并在浏览器中打开。
触摸滑动视频播放器 Airpods $199 您的浏览器不支持视频播放。 Buy Now iPhone 12 $799 相关文章 如何在 React 视频画廊中正确响应式控制视频控件与播放按钮显隐 如何在纯 HTML 中通过内联 CSS 实现响应式图片切换 如何正确更新 React 中视频组件的 controls 属性与 CSS 类名 如何在带有背景图的页脚中精准叠加内容元素 HTML 元素置顶显示的 CSS 实现方案 PotPlayer播放器 potplayer是一款功能全面的视频播放器,支持各种格式的音频文件,内置了非常强大的解码器功能,能够非常流畅的观看,有需要的小伙伴快来保存下载体验吧! 下载 相关标签: css javascript java html js git go github 浏览器 iphone ipad const class 事件 选择器 重构 本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn 上一篇:Word Add-in动态按钮失效:下拉菜单与事件绑定的冲突与解决方案 下一篇:基于HTML、CSS和JavaScript构建全屏触摸滑动视频播放器 作者最新文章 国产GPU重磅发布 明年超英伟达Rubin架构:中国院士力挺天数智芯 2026-01-27 15:06 如何在 MySQL 中自定义唯一键冲突的错误提示(如重复手机号) 2026-01-27 15:06 如何在 Pandas 中扁平化嵌套 JSON 列表时保留原始时间戳列 2026-01-27 15:09 如何在 CGO 中安全地将 C 端结构体数组传递到 Go 并正确使用 2026-01-27 15:11 如何用 Flex 或 Grid 将单列链接列表均匀拆分为双列(共用同一标题) 2026-01-27 15:11 如何使用chatgpt教程 2026-01-27 15:21 Spring Batch 多文件并行处理:基于单文件单 Job 的最佳实践 2026-01-27 15:21 存储价格持续上涨:部分机型首销优惠价没了 2026-01-27 15:38 如何在 Android 中正确设置 Button 的背景色与文字颜色 2026-01-27 15:44 如何在 Python 中动态获取父类名称而非当前实例的类名 2026-01-27 15:56 热门AI工具 更多 DeepSeek 幻方量化公司旗下的开源大模型平台 AI 编程开发AI 聊天问答 豆包大模型 字节跳动自主研发的一系列大型语言模型 AI 编程开发AI大模型 通义千问 阿里巴巴推出的全能AI助手 AI 编程开发Agent智能体 腾讯元宝 腾讯混元平台推出的AI助手 文档处理AI 聊天问答 文心一言 文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。 AI 编程开发AI 文本写作 讯飞写作 基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿 AI 文本写作中文写作 即梦AI 一站式AI创作平台,免费AI图片和视频生成。 图片拼接 ChatGPT 最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。 AI 编程开发AI 文本写作 智谱清言 - 免费全能的AI助手 智谱清言 - 免费全能的AI助手 AI 编程开发Agent智能体
相关文章
如何在 React 视频画廊中正确响应式控制视频控件与播放按钮显隐
如何在纯 HTML 中通过内联 CSS 实现响应式图片切换
如何正确更新 React 中视频组件的 controls 属性与 CSS 类名
如何在带有背景图的页脚中精准叠加内容元素
HTML 元素置顶显示的 CSS 实现方案
potplayer是一款功能全面的视频播放器,支持各种格式的音频文件,内置了非常强大的解码器功能,能够非常流畅的观看,有需要的小伙伴快来保存下载体验吧!
相关标签:
本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
国产GPU重磅发布 明年超英伟达Rubin架构:中国院士力挺天数智芯
2026-01-27 15:06
如何在 MySQL 中自定义唯一键冲突的错误提示(如重复手机号)
如何在 Pandas 中扁平化嵌套 JSON 列表时保留原始时间戳列
2026-01-27 15:09
如何在 CGO 中安全地将 C 端结构体数组传递到 Go 并正确使用
2026-01-27 15:11
如何用 Flex 或 Grid 将单列链接列表均匀拆分为双列(共用同一标题)
如何使用chatgpt教程
2026-01-27 15:21
Spring Batch 多文件并行处理:基于单文件单 Job 的最佳实践
存储价格持续上涨:部分机型首销优惠价没了
2026-01-27 15:38
如何在 Android 中正确设置 Button 的背景色与文字颜色
2026-01-27 15:44
如何在 Python 中动态获取父类名称而非当前实例的类名
2026-01-27 15:56
热门AI工具
幻方量化公司旗下的开源大模型平台
字节跳动自主研发的一系列大型语言模型
阿里巴巴推出的全能AI助手
腾讯混元平台推出的AI助手
文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。
基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿
一站式AI创作平台,免费AI图片和视频生成。
最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。
智谱清言 - 免费全能的AI助手
相关专题
const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。
531
2023.09.20
在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。
469
2024.01.03
本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。
13
2025.12.06
2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。
165
2026.01.28
本合集汇总了包子漫画2026最新官方在线观看入口,涵盖备用域名、正版无广告链接及多端适配地址,助你畅享12700+高清漫画资源。阅读专题下面的文章了解更多详细内容。
34
AO3最新中文版官网入口合集,汇总2026年主站及国内优化镜像链接,支持简体中文界面、无广告阅读与多设备同步。阅读专题下面的文章了解更多详细内容。
73
本合集涵盖PHP接口开发基础、RESTful API设计、数据交互与安全处理等实用教程,助你快速掌握PHP接口编写技巧。阅读专题下面的文章了解更多详细内容。
2
本文整理了php中文乱码如何解决及解决方法,阅读节专题下面的文章了解更多详细内容。
4
本专题系统讲解 Java 在消息队列与异步系统架构中的核心应用,涵盖消息队列基本原理、Kafka 与 RabbitMQ 的使用场景对比、生产者与消费者模型、消息可靠性与顺序性保障、重复消费与幂等处理,以及在高并发系统中的异步解耦设计。通过实战案例,帮助学习者掌握 使用 Java 构建高吞吐、高可靠异步消息系统的完整思路。
8
热门下载
相关下载
精品课程
共14课时 | 0.8万人学习
共46课时 | 3.1万人学习
共754课时 | 24.8万人学习
共6课时 | 11.2万人学习
共79课时 | 151.7万人学习
共6课时 | 53.4万人学习
共4课时 | 22.4万人学习
共13课时 | 0.9万人学习
最新文章
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部