扫码关注官方订阅号
正文
0
聖光之護
发布时间:2025-09-12 14:43:00
3198人浏览过
来源于php中文网
原创
在现代web开发中,交互式内容展示是提升用户体验的关键。触摸滑动组件因其直观的操作方式,在移动设备上尤为流行。本教程将指导您如何利用html、css和javascript构建一个全屏、响应式且支持触摸/鼠标拖拽的视频滑动播放器。我们将从一个基本的图片滑动组件出发,逐步改造以支持视频内容,并解决视频元素可能带来的交互问题。
该组件的核心技术栈包括:
首先,我们需要在HTML中定义滑块容器和每个独立的滑块项。与图片滑块不同,这里我们将使用标签来嵌入视频内容。每个标签应包含一个或多个标签,以提供不同格式的视频源,确保浏览器兼容性。controls属性将显示默认的视频播放控件。
Airpods $199 您的浏览器不支持视频标签。 Buy Now iPhone 12 $799 您的浏览器不支持视频标签。 Buy Now iPad $599 您的浏览器不支持视频标签。 Buy Now
注意:
OpenAI基于GPT-3模型开发的AI绘图生成工具,可以根据自然语言的描述创建逼真的图像和艺术。
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; /* 防止文本被选中 */ } /* 关键调整:为视频元素定义样式 */ .slide video { max-width: 100%; max-height: 60%; /* 限制视频最大高度 */ transition: transform 0.3s ease-in-out; /* 拖拽时的缩放动画 */ object-fit: contain; /* 确保视频内容完整显示 */ } .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; /* 按钮与视频间距 */ } .grabbing { cursor: grabbing; /* 拖拽时的鼠标样式 */ } .grabbing .slide video { /* 关键调整:拖拽时视频的缩放效果 */ transform: scale(0.9); }
JavaScript是实现滑块交互的核心。它负责监听用户的触摸和鼠标事件,计算滑块位置,并使用requestAnimationFrame进行平滑动画。关键在于正确处理视频元素的拖拽行为,防止其默认行为干扰滑块的滑动。
const slider = document.querySelector('.slider-container'); const slides = Array.from(document.querySelectorAll('.slide')); let isDragging = false, startPos = 0, currentTranslate = 0, prevTranslate = 0, animationID = 0, currentIndex = 0; slides.forEach((slide, index) => { // 获取视频元素,并阻止其默认的拖拽行为 const slideVideo = slide.querySelector('video'); if (slideVideo) { // 确保视频元素存在 slideVideo.addEventListener('dragstart', (e) => e.preventDefault()); } // 绑定触摸事件 slide.addEventListener('touchstart', touchStart(index)); slide.addEventListener('touchend', touchEnd); slide.addEventListener('touchmove', touchMove); // 绑定鼠标事件 slide.addEventListener('mousedown', touchStart(index)); slide.addEventListener('mouseup', touchEnd); slide.addEventListener('mouseleave', touchEnd); // 鼠标离开时结束拖拽 slide.addEventListener('mousemove', touchMove); }); // 禁用右键菜单,防止干扰拖拽操作 window.oncontextmenu = function (event) { event.preventDefault(); event.stopPropagation(); return false; }; // 触摸/鼠标按下事件处理 function touchStart(index) { return function (event) { currentIndex = index; startPos = getPositionX(event); // 记录起始X坐标 isDragging = true; // 设置拖拽状态 // 启动动画循环,实现平滑拖拽 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; // 更新当前平移量 } } // 获取事件的X坐标(区分触摸和鼠标事件) function getPositionX(event) { return event.type.includes('mouse') ? event.pageX : event.touches[0].clientX; } // 动画循环,持续更新滑块位置 function animation() { setSliderPosition(); if (isDragging) { requestAnimationFrame(animation); } } // 设置滑块的CSS transform属性 function setSliderPosition() { slider.style.transform = `translateX(${currentTranslate}px)`; } // 根据当前索引设置滑块位置 function setPositionByIndex() { currentTranslate = currentIndex * -window.innerWidth; // 计算目标平移量 prevTranslate = currentTranslate; // 更新上一个平移量 setSliderPosition(); // 应用位置 }
关键点与注意事项:
在部署视频滑动播放器时,还需要考虑以下几点以提升用户体验和性能:
通过上述HTML、CSS和JavaScript的改造与优化,我们成功地将一个传统的图片触摸滑动组件升级为功能强大的视频滑动播放器。关键在于理解视频元素的特性,并在HTML结构、CSS样式和JavaScript交互逻辑中做出相应的调整,特别是阻止视频元素的默认拖拽行为,以确保滑块功能的平滑运行。遵循这些最佳实践,您将能够构建出高性能、用户友好的视频内容展示界面。
相关文章
如何在带有背景图的页脚中正确叠加内容元素
标题:解决 Font Awesome 图标不显示的常见原因与正确引入方法
如何使用 CSS 实现图片上覆盖全宽响应式搜索框
如何使用 CSS 实现全宽响应式搜索框覆盖图片
html5滤镜怎样模拟景深_html5景深滤镜css技巧【技巧】
potplayer是一款功能全面的视频播放器,支持各种格式的音频文件,内置了非常强大的解码器功能,能够非常流畅的观看,有需要的小伙伴快来保存下载体验吧!
相关标签:
本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
TensorRT LLM— NVIDIA开源的大模型推理优化框架
2026-01-27 16:20
TikTok私信收不到消息如何解决
2026-01-27 16:23
如何正确设置 Android Button 的背景色与标题文字颜色
2026-01-27 16:37
SHA256加盐哈希在PHP与C#中保持一致的关键要点
2026-01-27 16:42
为了塞进第二颗摄像头 iPhone Air 2首发定制超薄Face ID
淘宝联盟如何关闭个性化广告
2026-01-27 17:03
如何在 Go 中将日志输出到标准错误流(stderr)
2026-01-27 17:16
里昂"见死不救"?《生化危机9》演示细节引粉丝争议
2026-01-27 17:20
标题:Android ListView 初始化错误导致应用崩溃的解决方案
如何通过用户脚本或浏览器扩展实现图片上传到 Twitter/Reddit
2026-01-27 17:29
热门AI工具
幻方量化公司旗下的开源大模型平台
字节跳动自主研发的一系列大型语言模型
阿里巴巴推出的全能AI助手
腾讯混元平台推出的AI助手
文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。
基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿
一站式AI创作平台,免费AI图片和视频生成。
最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。
智谱清言 - 免费全能的AI助手
相关专题
if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。
778
2023.08.22
堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。
396
2023.07.18
堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。
575
2023.08.10
overflow是一个用于控制元素溢出内容的属性,当元素的内容超出其指定的尺寸时,overflow属性可以决定如何处理这些溢出的内容。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。
1755
2024.08.15
2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。
143
2026.01.28
本合集汇总了包子漫画2026最新官方在线观看入口,涵盖备用域名、正版无广告链接及多端适配地址,助你畅享12700+高清漫画资源。阅读专题下面的文章了解更多详细内容。
28
AO3最新中文版官网入口合集,汇总2026年主站及国内优化镜像链接,支持简体中文界面、无广告阅读与多设备同步。阅读专题下面的文章了解更多详细内容。
64
本合集涵盖PHP接口开发基础、RESTful API设计、数据交互与安全处理等实用教程,助你快速掌握PHP接口编写技巧。阅读专题下面的文章了解更多详细内容。
2
本文整理了php中文乱码如何解决及解决方法,阅读节专题下面的文章了解更多详细内容。
4
热门下载
相关下载
精品课程
共14课时 | 0.8万人学习
共46课时 | 3.1万人学习
共754课时 | 24.7万人学习
共6课时 | 11.2万人学习
共79课时 | 151.7万人学习
共6课时 | 53.4万人学习
共4课时 | 22.3万人学习
共13课时 | 0.9万人学习
最新文章
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部