0

0

基于HTML、CSS和JavaScript构建触摸滑动视频播放器教程

心靈之曲

心靈之曲

发布时间:2025-09-12 14:10:01

|

912人浏览过

|

来源于php中文网

原创

基于HTML、CSS和JavaScript构建触摸滑动视频播放器教程

本教程详细指导如何将现有的图片触摸滑动组件改造为支持视频内容的滑动播放器。通过调整HTML结构、适配CSS样式和优化JavaScript事件处理,特别是阻止视频元素的默认拖拽行为,确保滑动功能流畅运行,解决滑动器可能出现的“冻结”问题,实现响应式、交互友好的视频展示。

引言:从图片到视频的滑动体验

在现代web应用中,触摸滑动组件因其直观的用户体验而广受欢迎。最初,这类组件多用于展示图片画廊。然而,随着富媒体内容的兴起,将图片滑动器升级为视频滑动器成为一个常见的需求。将静态图片替换为动态视频并非简单的标签替换,视频元素自带的交互行为(如拖拽、播放控制)可能会与滑动组件的自定义javascript逻辑产生冲突,导致滑动功能“冻结”或失效。本教程将深入探讨如何解决这些挑战,实现一个功能完善的触摸滑动视频播放器。

HTML结构重构:引入视频元素

将图片滑动器改造为视频滑动器,最核心的步骤是替换HTML中的 基于HTML、CSS和JavaScript构建触摸滑动视频播放器教程 标签为

  1. 替换标签: 将每个
    内部的 基于HTML、CSS和JavaScript构建触摸滑动视频播放器教程 标签替换为
  2. 视频源: 使用 标签指定视频文件的URL。为了更好的兼容性,可以提供多种格式的视频源。
  3. 控制条: 添加 controls 属性,为用户提供播放、暂停、音量等基本控制。
  4. 尺寸: 可以通过 width 和 height 属性设置视频的初始尺寸,但通常更推荐通过CSS进行响应式控制。
  5. 以下是改造后的HTML结构示例:

    Airpods

    $199

    Buy Now

    iPhone 12

    $799

    Buy Now

    iPad

    $599

    Buy Now

    CSS样式适配:确保视频显示正常

    基于HTML、CSS和JavaScript构建触摸滑动视频播放器教程 替换为

    1. 视频尺寸与布局: 确保视频能够在其父容器 (.slide) 内正确缩放,并保持居中。
    2. 替换选择器: 将 .slide img 相关的样式选择器更改为 .slide video。

    以下是适配后的CSS样式:

    立即学习Java免费学习笔记(深入)”;

    知了zKnown
    知了zKnown

    知了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逻辑优化:解决滑动“冻结”问题

    JavaScript是实现滑动逻辑的核心。将图片替换为视频后,最常遇到的问题是滑动器在第一次操作后“冻结”。这通常是因为视频元素具有其自身的默认拖拽行为,与自定义的触摸或鼠标拖拽事件冲突。解决此问题的关键在于阻止视频元素的默认 dragstart 事件。

    1. 选择视频元素: 确保JavaScript正确地选择了每个 slide 中的
    2. 阻止默认拖拽: 为每个视频元素添加 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 = 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

    热门AI工具

    更多
    DeepSeek
    DeepSeek

    幻方量化公司旗下的开源大模型平台

    豆包大模型
    豆包大模型

    字节跳动自主研发的一系列大型语言模型

    通义千问
    通义千问

    阿里巴巴推出的全能AI助手

    腾讯元宝
    腾讯元宝

    腾讯混元平台推出的AI助手

    文心一言
    文心一言

    文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

    讯飞写作
    讯飞写作

    基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

    即梦AI
    即梦AI

    一站式AI创作平台,免费AI图片和视频生成。

    ChatGPT
    ChatGPT

    最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

531

2023.09.20

class在c语言中的意思
class在c语言中的意思

在C语言中,"class" 是一个关键字,用于定义一个类。想了解更多class的相关内容,可以阅读本专题下面的文章。

469

2024.01.03

python中class的含义
python中class的含义

本专题整合了python中class的相关内容,阅读专题下面的文章了解更多详细内容。

13

2025.12.06

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

165

2026.01.28

包子漫画在线官方入口大全
包子漫画在线官方入口大全

本合集汇总了包子漫画2026最新官方在线观看入口,涵盖备用域名、正版无广告链接及多端适配地址,助你畅享12700+高清漫画资源。阅读专题下面的文章了解更多详细内容。

34

2026.01.28

ao3中文版官网地址大全
ao3中文版官网地址大全

AO3最新中文版官网入口合集,汇总2026年主站及国内优化镜像链接,支持简体中文界面、无广告阅读与多设备同步。阅读专题下面的文章了解更多详细内容。

73

2026.01.28

php怎么写接口教程
php怎么写接口教程

本合集涵盖PHP接口开发基础、RESTful API设计、数据交互与安全处理等实用教程,助你快速掌握PHP接口编写技巧。阅读专题下面的文章了解更多详细内容。

2

2026.01.28

php中文乱码如何解决
php中文乱码如何解决

本文整理了php中文乱码如何解决及解决方法,阅读节专题下面的文章了解更多详细内容。

4

2026.01.28

Java 消息队列与异步架构实战
Java 消息队列与异步架构实战

本专题系统讲解 Java 在消息队列与异步系统架构中的核心应用,涵盖消息队列基本原理、Kafka 与 RabbitMQ 的使用场景对比、生产者与消费者模型、消息可靠性与顺序性保障、重复消费与幂等处理,以及在高并发系统中的异步解耦设计。通过实战案例,帮助学习者掌握 使用 Java 构建高吞吐、高可靠异步消息系统的完整思路。

8

2026.01.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Sass 教程
Sass 教程

共14课时 | 0.8万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.1万人学习

CSS教程
CSS教程

共754课时 | 24.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号