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免费学习笔记(深入)”;

    玄鲸Timeline
    玄鲸Timeline

    一个AI驱动的历史时间线生成平台

    下载
    @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

    热门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的相关内容,阅读专题下面的文章了解更多详细内容。

15

2025.12.06

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

4

2026.01.30

c++ 字符串格式化
c++ 字符串格式化

本专题整合了c++字符串格式化用法、输出技巧、实践等等内容,阅读专题下面的文章了解更多详细内容。

2

2026.01.30

java 字符串格式化
java 字符串格式化

本专题整合了java如何进行字符串格式化相关教程、使用解析、方法详解等等内容。阅读专题下面的文章了解更多详细教程。

1

2026.01.30

python 字符串格式化
python 字符串格式化

本专题整合了python字符串格式化教程、实践、方法、进阶等等相关内容,阅读专题下面的文章了解更多详细操作。

1

2026.01.30

java入门学习合集
java入门学习合集

本专题整合了java入门学习指南、初学者项目实战、入门到精通等等内容,阅读专题下面的文章了解更多详细学习方法。

20

2026.01.29

java配置环境变量教程合集
java配置环境变量教程合集

本专题整合了java配置环境变量设置、步骤、安装jdk、避免冲突等等相关内容,阅读专题下面的文章了解更多详细操作。

16

2026.01.29

热门下载

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

精品课程

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

共14课时 | 0.8万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.1万人学习

CSS教程
CSS教程

共754课时 | 25.1万人学习

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

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