本教程详细指导如何将现有的图片触摸滑动组件改造为支持视频内容的滑动播放器。通过调整HTML结构、适配CSS样式和优化JavaScript事件处理,特别是阻止视频元素的默认拖拽行为,确保滑动功能流畅运行,解决滑动器可能出现的“冻结”问题,实现响应式、交互友好的视频展示。
引言:从图片到视频的滑动体验
在现代web应用中,触摸滑动组件因其直观的用户体验而广受欢迎。最初,这类组件多用于展示图片画廊。然而,随着富媒体内容的兴起,将图片滑动器升级为视频滑动器成为一个常见的需求。将静态图片替换为动态视频并非简单的标签替换,视频元素自带的交互行为(如拖拽、播放控制)可能会与滑动组件的自定义javascript 逻辑产生冲突,导致滑动功能“冻结”或失效。本教程将深入探讨如何解决这些挑战,实现一个功能完善的触摸滑动视频播放器。
HTML结构重构:引入视频元素
将图片滑动器改造为视频滑动器,最核心的步骤是替换HTML中的 标签为 标签。为了确保视频能够正确加载、显示并提供用户控制,需要注意以下几点:
替换标签: 将每个
内部的
标签替换为
标签。视频源: 使用 标签指定视频文件的URL。为了更好的兼容性,可以提供多种格式的视频源。控制条: 添加 controls 属性,为用户提供播放、暂停、音量等基本控制。尺寸: 可以通过 width 和 height 属性设置视频的初始尺寸,但通常更推荐通过CSS进行响应式控制。
以下是改造后的HTML结构示例:
iPhone 12 $799 您的浏览器不支持视频播放。 Buy Now
CSS样式适配:确保视频显示正常
将 替换为 后,需要相应地调整CSS样式,以确保视频在滑动器中能够正确地布局和响应。关键在于将原来针对 img 元素的样式规则应用到 video 元素上。
视频尺寸与布局: 确保视频能够在其父容器 (.slide) 内正确缩放,并保持居中。替换选择器: 将 .slide img 相关的样式选择器更改为 .slide video。
以下是适配后的CSS样式:
立即学习“Java免费学习笔记(深入)”;
@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逻辑优化:解决滑动“冻结”问题
JavaScript是实现滑动逻辑的核心。将图片替换为视频后,最常遇到的问题是滑动器在第一次操作后“冻结”。这通常是因为视频元素具有其自身的默认拖拽行为,与自定义的触摸或鼠标拖拽事件冲突。解决此问题的关键在于阻止视频元素的默认 dragstart 事件。
选择视频元素: 确保JavaScript正确地选择了每个 slide 中的 元素,而不是 。代码中 const slideImage = slide.querySelector(‘video’) 已经正确实现。 阻止默认拖拽: 为每个视频元素添加 dragstart 事件监听器,并调用 e.preventDefault()。这会阻止浏览器 处理视频元素的默认拖拽行为,从而允许自定义的滑动逻辑正常工作。
以下是完整的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 = 0slides.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 menuwindow.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 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 文件并在浏览器中打开。
触摸滑动视频播放器 @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; } .slide video { /* 注意这里是 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; margin-top: 1rem; border-radius: 5px; } .grabbing { cursor: grabbing; } .grabbing .slide video { /* 注意这里是 video 选择器 */ transform: scale(0.9); } iPhone 12 $799 <source src="https://player.vimeo.com/external/334344435.sd.mp4?s=d367341a941ffa97781ade70e4f4a28f4a1a5fc8&profile_id=165&oauth2_token_id=57
以上就是基于HTML、CSS和JavaScript构建触摸滑动视频播放器教程的详细内容,更多请关注创想鸟其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1575467.html
赞 (0)
打赏
微信扫一扫
支付宝扫一扫
相关推荐
在Django电商项目中,当使用AJAX动态加载过滤后的产品列表时,常遇到图片无法正常显示的问题。这通常是由于前端模板中图片加载方式(如data-setbg属性结合JavaScript库)与AJAX动态内容更新机制不兼容所致。解决方案是直接在AJAX返回的HTML中使用标准的标签来渲染图片,确保浏览…
推荐开源免费PHP开发工具以提升效率:VS Code、Sublime Text轻量高效,PhpStorm专业强大;调试用Xdebug、Kint、Ray;依赖管理选Composer;代码质量工具包括PHPStan、Psalm、PHP_CodeSniffer;数据库管理可用%ignore_a_1%MyA…
本教程探讨golang中如何高效控制结构体字段在json序列化时的可见性。当需要将包含敏感信息的结构体数组转换为json响应时,通过利用`encoding/json`包提供的结构体标签,特别是`json:”-“`,可以轻松实现对特定字段的忽略,从而避免敏感数据泄露,确保api…
首先创建含enctype的HTML表单,再用PHP接收文件,检查目录、移动临时文件,验证类型与大小,生成唯一文件名,并调整php.ini限制以确保上传成功。 如果您尝试在PHP项目中添加图片上传功能,但服务器无法正确接收或保存文件,则可能是由于表单配置、文件处理逻辑或安全限制的问题。以下是实现该功能…
比特币是一种去中心化的数字货币,基于区块链技术实现点对点交易,具有匿名性、有限发行和不可篡改等特点;新手可通过交易所购买,P2P交易获得比特币,常用平台包括Binance、OKX和Huobi;交易流程包括注册账户、实名认证、绑定支付方式、充值法币并下单购买,可选择市价单或限价单;比特币存储方式有交易…
滚动条可以存在也可以不存在,本文主要介绍了html 隐藏滚动条和去除滚动条的方法的相关资料,大家一起来学习一下html隐藏滚动条或去除滚动条的方法吧。 1. html 标签加属性 XML/HTML Code复制内容到剪贴板 2.body中加入以下代码 立即学习“前端免费学习笔记(深入)”; html…
在Golang的gRPC流式通信中,必须通过context.Context处理异常。应监听上下文取消或超时,及时释放资源,设置合理超时,避免连接长时间挂起,并在goroutine中通过context控制生命周期。 在使用 Golang 和 gRPC 实现流式通信时,异常处理是确保服务健壮性的关键部分…
本文旨在解决go语言mgo库中构建复杂查询时,特别是涉及嵌套`bson.m`和日期范围筛选的常见错误。我们将深入剖析`bson.m`的类型特性,解释为何直接索引`interface{}`会导致“invalid operation”错误,并提供一种推荐的、结构清晰的代码重构方案,以确保查询条件能够正确…
max-height 属性设置元素的最大高度。 说明 该属性值会对元素的高度设置一个最高限制。因此,元素可以比指定值矮,但不能比其高。不允许指定负值。 注意:max-height 属性不包括外边距、边框和内边距。 立即学习“前端免费学习笔记(深入)”; 值描述none 默认。定义对元素被允许的最大高…
首先保存文件为.html格式,再通过浏览器或Live Server插件打开预览;推荐安装Live Server实现本地服务器运行与实时刷新,提升开发体验。 在 VS Code 上运行 HTML 文件并不需要复杂的配置,只需几个简单步骤即可预览页面效果。VS Code 本身是一个代码编辑器,不直接运行…
本文探讨了在Web开发中,交互式按钮(如播放/暂停按钮)在点击时发生意外垂直位移的问题。通过分析CSS样式变化对元素布局的影响,我们发现这是由于按钮不同状态下的边框样式和内边距改变,以及默认的垂直对齐行为共同作用所致。核心解决方案是利用CSS的vertical-align属性,将其设置为middle…
使用go run -race检测数据竞争,结合runtime.NumGoroutine监控协程数量,通过pprof分析阻塞调用栈,利用select超时避免永久阻塞,有效排查goroutine泄漏、死锁和数据竞争问题。 Go语言的goroutine和channel是并发编程的核心,但它们也带来了调试上…
标签定义多行的文本输入控件。 文本区中可容纳无限数量的文本,其中的文本的默认字体是等宽字体(通常是 Courier)。 可以通过 cols 和 rows 属性来规定 textarea 的尺寸,不过更好的办法是使用 CSS 的 height 和 width 属性。 注释:在文本输入区内的文本行间,用 …
Jupyter Notebook通过单元格实现代码与Markdown结合,支持数据导入(pandas)、清洗(fillna)、探索(matplotlib/seaborn可视化)、统计分析(describe/corr)和特征工程,便于记录与分享分析过程。 Jupyter Notebook 是进行探索性…
HTML表单通过标签构建,包含action和method属性定义数据提交目标与方式,常用input类型如text、password、email等适配不同输入需求,配合label、required、placeholder提升可用性,结合textarea、select、button等控件实现完整交互,是…
根据数据特性选择合适的存储方式并制定清晰的读写与清理逻辑,能显著提升前端性能;合理运用Cookie、localStorage、sessionStorage、IndexedDB及Cache API,结合缓存策略与定期清理机制,可在保证用户体验的同时避免安全与性能隐患。 前端缓存和JavaScript存…
首先利用原生touch事件实现滑动判断,再通过preventDefault解决滚动冲突,接着引入Hammer.js处理复杂手势,最后通过优化点击区域、避免事件冲突和增加视觉反馈提升体验。 在移动端浏览器中,HTML5网页可以通过触摸事件实现手势操作,提升用户体验。虽然原生JavaScript提供了基…
本文将介绍如何使用Golang创建一个指定大小的文件,并用特定数据填充它。我们将使用 `os` 包提供的函数来创建和截断文件,从而实现快速生成大文件的目的。示例代码展示了如何创建一个10MB的文件,并将其填充为全零数据。掌握这些方法,可以方便地在例如日志系统或磁盘队列等场景中,预先创建测试文件或初始…
本文深入探讨 express.js 中间件函数中的 `next()` 参数。它负责将控制权传递给请求-响应周期中的下一个中间件或路由处理程序。文章将详细解释 `next()` 的工作原理、中间件的注册与执行顺序,以及不正确使用 `next()` 可能导致请求挂起的风险,并通过代码示例和实际应用场景,…