用uniapp写一个播放视频首页页面代码

效果如下图所示

首页有导航栏,搜索框,和视频列表,

导航栏如下图

搜索框如下图

视频列表如下图

文件目录

视频首页页面代码如下

<template>
  <view class="video-home">
    <!-- 搜索栏 -->
    <view class="search-bar">
      <input type="text" placeholder="搜索视频..." v-model="searchQuery" @input="handleSearch" />
      <button @click="handleSearch">搜索</button>
    </view>

    <!-- 视频分类导航 -->
    <view class="category-tabs">
      <scroll-view scroll-x class="tabs">
        <view v-for="(category, index) in categories" :key="index" 
              :class="['tab-item', { 'active': activeCategory === category }]" 
              @click="changeCategory(category)">
          {{ category }}
        </view>
      </scroll-view>
    </view>

   <!-- 视频列表 -->
   <view class="video-list">
     <block v-for="(item, index) in filteredVideos" :key="index">
       <view class="video-item" @click="goToVideoDetail(item.id)">
         <video ref="videos" :src="item.videoUrl" class="video-thumbnail" controls></video>
         <view class="video-content">
           <text class="video-title">{{ item.title }}</text>
           <text class="video-summary">{{ item.summary }}</text>
           <text class="video-date">{{ formatDate(item.date) }}</text>
           <text class="video-duration">{{ formatDuration(item.duration) }}</text>
         </view>
       </view>
     </block>
   </view>
  </view>
</template>

<script>
export default {
  data() {
    return {
      searchQuery: '',
      activeCategory: '推荐',
      categories: ['推荐', '热门', '最新', '科技', '娱乐', '生活'],
      videoItems: [
        // 示例视频条目,请替换为实际数据或从后端获取的数据
        { id: 1, title: '视频标题1', summary: '视频摘要...', date: new Date(), duration: 360, videoUrl: '/static/videos/1.mp4', category: '推荐' },
        { id: 2, title: '视频标题2', summary: '视频摘要...', date: new Date(), duration: 540, videoUrl: '/static/videos/2.mp4', category: '热门' },
       { id: 3, title: '视频标题3', summary: '视频摘要...', date: new Date(), duration: 360, videoUrl: '/static/videos/3.mp4', category: '推荐' },
       { id:4, title: '视频标题4', summary: '视频摘要...', date: new Date(), duration: 540, videoUrl: '/static/videos/4.mp4', category: '热门' },
       { id: 5, title: '视频标题5', summary: '视频摘要...', date: new Date(), duration: 360, videoUrl: '/static/videos/5.mp4', category: '推荐' },
       { id: 6, title: '视频标题6', summary: '视频摘要...', date: new Date(), duration: 540, videoUrl: '/static/videos/6.mp4', category: '热门' },
       { id:7, title: '视频标题7', summary: '视频摘要...', date: new Date(), duration: 360, videoUrl: '/static/videos/7.mp4', category: '推荐' },
       { id:8, title: '视频标题8', summary: '视频摘要...', date: new Date(), duration: 540, videoUrl: '/static/videos/8.mp4', category: '热门' },
       { id:9, title: '视频标题9', summary: '视频摘要...', date: new Date(), duration: 360, videoUrl: '/static/videos/live1.mp4', category: '推荐' },
       { id: 10, title: '视频标题10', summary: '视频摘要...', date: new Date(), duration: 540, videoUrl: '/static/videos/live2.mp4', category: '热门' },
       { id: 1, title: '视频标题1', summary: '视频摘要...', date: new Date(), duration: 360, videoUrl: '/static/videos/1.mp4', category: '推荐' },
        { id: 2, title: '视频标题2', summary: '视频摘要...', date: new Date(), duration: 540, videoUrl: '/static/videos/2.mp4', category: '热门' },
       { id: 3, title: '视频标题3', summary: '视频摘要...', date: new Date(), duration: 360, videoUrl: '/static/videos/3.mp4', category: '推荐' },
       { id:4, title: '视频标题4', summary: '视频摘要...', date: new Date(), duration: 540, videoUrl: '/static/videos/4.mp4', category: '热门' },
       { id: 5, title: '视频标题5', summary: '视频摘要...', date: new Date(), duration: 360, videoUrl: '/static/videos/5.mp4', category: '推荐' },
       { id: 6, title: '视频标题6', summary: '视频摘要...', date: new Date(), duration: 540, videoUrl: '/static/videos/6.mp4', category: '娱乐' },
       { id:7, title: '视频标题7', summary: '视频摘要...', date: new Date(), duration: 360, videoUrl: '/static/videos/7.mp4', category: '科技' },
       { id:8, title: '视频标题8', summary: '视频摘要...', date: new Date(), duration: 540, videoUrl: '/static/videos/8.mp4', category: '最新' },
       { id:9, title: '视频标题9', summary: '视频摘要...', date: new Date(), duration: 360, videoUrl: '/static/videos/live1.mp4', category: '推荐' },
       { id: 10, title: '视频标题10', summary: '视频摘要...', date: new Date(), duration: 540, videoUrl: '/static/videos/live2.mp4', category: '热门' },
       
      ],
      currentPlaying: null // 用来追踪当前正在播放的视频元素
    };
  },
  computed: {
    filteredVideos() {
      return this.videoItems.filter(item => 
        (this.searchQuery ? item.title.includes(this.searchQuery) : true) &&
        (this.activeCategory === '推荐' || item.category === this.activeCategory)
      );
    }
  },
  methods: {
      goToVideoDetail(id) {
            uni.navigateTo({
              url: `/pages/VideoDetail/VideoDetail?id=${id}`
            });
          },
    handleSearch(event) {
      // 如果需要对输入进行实时响应,可以在这里实现
      this.searchQuery = event.target.value;
    },
    changeCategory(category) {
      this.activeCategory = category;
    },
    playVideo(videoUrl) {
      const videos = this.$refs.videos || [];
      videos.forEach(video => {
        if (video.src === videoUrl && this.currentPlaying !== video) {
          this.pauseCurrent();
          video.play();
          this.currentPlaying = video;
        } else if (this.currentPlaying === video) {
          video.pause();
          this.currentPlaying = null;
        }
      });
    },
    pauseCurrent() {
      if (this.currentPlaying) {
        this.currentPlaying.pause();
      }
    },
    formatDate(date) {
      const options = { year: 'numeric', month: 'long', day: 'numeric' };
      return new Intl.DateTimeFormat('zh-CN', options).format(date);
    },
    formatDuration(seconds) {
      const minutes = Math.floor(seconds / 60);
      const remainingSeconds = seconds % 60;
      return `${minutes}:${remainingSeconds.toString().padStart(2, '0')}`;
    }
  }
};
</script>

<style scoped>
/* 样式 */
.video-home {
  padding: 100px;
}

.search-bar {
  display: flex;
  align-items: center;
  margin-bottom: 10px;
}

.search-bar input {
  flex: 1;
  padding: 8px;
  border: 1px solid #ccc;
  border-radius: 4px;
}

.search-bar button {
  margin-left: 5px;
  padding: 8px 16px;
}

.category-tabs {
  margin-bottom: 10px;
}

.tabs {
  white-space: nowrap;
}

.tab-item {
  display: inline-block;
  padding: 8px 16px;
  cursor: pointer;
}

.tab-item.active {
  color: #3cc51f;
  font-weight: bold;
}

.video-list .video-item {
  display: flex;
  margin-bottom: 10px;
  padding: 10px;
  background-color: #fff;
  border-radius: 4px;
}

.video-thumbnail {
  width: 400px;
  height: 400px;
  margin-right: 10px;
  border-radius: 4px;
}
/* 调整视频缩略图大小 */
.video-thumbnail {
  width: 100%; /* 让缩略图占满整个视频容器 */
  height: auto; /* 维持视频的原始比例 */
  border-radius: 8px; /* 匹配视频项的圆角 */
  margin-right: 20px; /* 增大右侧外边距,给文字内容留出更多空间 */
}


.video-content {
  flex: 2;
}

.video-title {
  font-size: 16px;
  font-weight: bold;
  margin-bottom: 5px;
}

.video-summary {
  font-size: 14px;
  color: #666;
}

.video-date,
.video-duration {
  font-size: 12px;
  color: #999;
}

.video-duration {
  margin-top: 5px;
}
/* 视频列表样式 */
.video-list {
  display: flex;
  flex-wrap: wrap; /* 允许换行 */
  gap: 20px; /* 设置项目之间的间距 */
  margin: -10px; /* 调整外边距以对齐内部间距 */
}

</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/891410.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uniapp 判断多选、选中取消选中的逻辑处理

一、效果展示 二、代码 1.父组件: :id=“this.id” : 给子组件传递参数【id】 @callParentMethod=“takeIndexFun” :给子组件传递方法,这样可以在子组件直接调用父组件的方法 <view @click="$refs.member.open()"

影刀进阶指令 | Kimi (对标ChatGPT)

文章目录 影刀进阶指令 | Kimi &#xff08;对标ChatGPT&#xff09;一. 需求二. 流程三. 实现3.1 流程概览3.2 流程步骤讲解1\. 确定问题2\. 填写问题并发送3\. 检测答案是否出完 四. 运维 影刀进阶指令 | Kimi &#xff08;对标ChatGPT&#xff09; 简单讲讲RPA调用kimi实现…

【面试系列】深入浅出 Spring Boot

熟悉SpringBoot&#xff0c;对常用注解、自动装配原理、Jar启动流程、自定义Starter有一定的理解&#xff1b; 面试题 Spring Boot 的核心注解是哪个&#xff1f;它主要由哪几个注解组成的&#xff1f;Spring Boot的自动配置原理是什么&#xff1f;你如何理解 Spring Boot 配置…

MySQL root用户密码忘记怎么办(Reset root account password)

在使用MySQL数据库的的过程中&#xff0c;不可避免的会出现忘记密码的现象。普通用户的密码如果忘记&#xff0c;可以用更高权限的用户&#xff08;例如root&#xff09;进行重置。但是如果root用户的密码忘记了&#xff0c;由于root用户本身就是最高权限&#xff0c;那这个方法…

Java之内部类*

将一个类定义在另一个类或者一个方法的内部&#xff0c;前者称为内部类&#xff0c;后者称为外部类 实例内部类&#xff1a;实力内部类所处的位置与外部类成员位置相同&#xff0c;因此也受public private等访问限定符的约束静态内部类&#xff08;static&#xff09;匿名内部…

黑马Java面试教程_P3_框架

系列博客目录 文章目录 系列博客目录前言1.Spring1.1 Spring框架中的单例bean是线程安全的吗?面试文稿 1.2 什么是AOP&#xff0c;你们项目中有没有使用到AOP&#xff1f;Spring中的事务是如何实现的&#xff1f;总结面试文稿 1.3 Spring中事务失效的场景有哪些总结面试文稿 1…

VK11\VK12保存增强

VK11\VK12保存增强 一、 VK11\VK12保存增强 事务码VK11、VK12创建和修改条件记录时&#xff0c;点击保存时修改其中的条件 二、增强步骤 通过查找&#xff0c;对应的BADI&#xff1a;SD_COND_SAVE_A 通过SE19创建BADI&#xff1a;ZSD_COND_SAVE_A修改函数CONDITION_SAVE_E…

使用pandas把数据库中的数据转成csv文件

使用pandas把数据库中的数据转成csv文件 1、效果图 2、流程 1、连接数据库,获取数据 2、把一些中文字符转成gbk,忽略掉无法转化的 3、把数据转成csv 3、代码 import pymysql import pandas as pddef get_database(databasename):

急需升级,D-Link 路由器漏洞被僵尸网络广泛用于 DDoS 攻击

僵尸网络活动增加 &#xff1a;新的“FICORA”和“CAPSAICIN”僵尸网络&#xff08;Mirai 和 Kaiten 的变体&#xff09;的活动激增。 被利用的漏洞 &#xff1a;攻击者利用已知的 D-Link 路由器漏洞&#xff08;例如 CVE-2015-2051、CVE-2024-33112&#xff09;来执行恶意命…

Linux SVN下载安装配置客户端

参考&#xff1a; linux下svn服务器搭建及使用&#xff08;包含图解&#xff09;_小乌龟svn新建用户名和密码-CSDN博客 1.ubuntu安装svn客户端 “subversion” sudo apt-get update sudo apt-get install subversion 查看安装的版本信息&#xff0c;同时看是否安装成功 s…

MM-2024 | 智能体遇山开路,遇水架桥! ObVLN:突破障碍,受阻环境中的视觉语言导航

作者&#xff1a;Haodong Hong, Sen Wang, Zi Huang 单位&#xff1a;昆士兰大学 论文链接&#xff1a;Navigating Beyond Instructions: Vision-and-Language Navigation in Obstructed Environments (https://dl.acm.org/doi/pdf/10.1145/3664647.3681640) 代码链接&#…

远程命令执行之基本介绍

一.远程命令执行漏洞 1.命令执行 命令执行是指计算机程序接受用户输入的命令&#xff0c;并按照命令的要求执行相应的操作。命令可以执行各种操作&#xff0c;例如读取文件、创建文件、修改文件、运行程序、删除文件等。 命令执行通常是通过一个命令行界面或终端窗口进行的。在…

ReactiveStreams、Reactor、SpringWebFlux

注意&#xff1a; 本文内容于 2024-12-28 21:22:12 创建&#xff0c;可能不会在此平台上进行更新。如果您希望查看最新版本或更多相关内容&#xff0c;请访问原文地址&#xff1a;ReactiveStreams、Reactor、SpringWebFlux。感谢您的关注与支持&#xff01; ReactiveStreams是…

Android笔试面试题AI答之Android基础(8)

Android入门请看《Android应用开发项目式教程》&#xff0c;视频、源码、答疑&#xff0c;手把手教 文章目录 1.Android新建工程需要注意的地方有哪些&#xff1f;**1. 选择合适的项目模板****2. 配置项目基本信息****3. 选择最低 SDK 版本****4. 配置构建工具****5. 选择编程…

【阻塞队列】- ArrayBlockingQueue 的原理-迭代器

文章目录 1. 前言2. 迭代器3. Itrs3.1 参数3.2 迭代器 Itr3.2.1 参数3.2.2 构造器3.2.3 hasNext3.2.4 next3.2.5 remove3.2.6 shutdown3.2.7 removedAt3.2.8 takeIndexWrapped 3.3 doSomeSweeping&#xff08;tryHandler&#xff09;3.4 register3.5 takeIndexWrapped3.6 remov…

ARM 汇编基础总结

GNU 汇编语法 编写汇编的过程中&#xff0c;其指令、寄存器名等可以全部使用大写&#xff0c;也可以全部使用小写&#xff0c;但是不能大小写混用。 1. 汇编语句的格式 label: instruction comment label即标号&#xff0c;表示地址位置&#xff0c;有些指令前面可能会有标…

【MySQL】深度学习数据库开发技术:使用CC++语言访问数据库

**前言&#xff1a;**本节内容介绍使用C/C访问数据库&#xff0c; 包括对数据库的增删查改操作。 主要是学习一些接口的调用&#xff0c; 废话不多说&#xff0c; 开始我们的学习吧&#xff01; ps:本节内容比较容易&#xff0c; 友友们放心观看哦&#xff01; 目录 准备mysql…

华为配置 之 RIP

简介&#xff1a; RIP&#xff08;路由信息协议&#xff09;是一种广泛使用的内部网关协议&#xff0c;基于距离向量算法来决定路径。它通过向全网广播路由控制信息来动态交换网络拓扑信息&#xff0c;从而计算出最佳路由路径。RIP易于配置和理解&#xff0c;非常适用于小型网络…

1.GPU简介及英伟达开发环境配置

前言 This book shows how, by harnessing the power of your computer’s graphics process unit (GPU), you can write high-performance software for a wide rangeof applications.Although originally designed to render computer graphics ona monitor (and still used…

电脑cxcore100.dll丢失怎么办?

电脑运行时常见问题解析&#xff1a;应对DLL文件丢失、文件损坏与系统报错的实用指南 在数字时代&#xff0c;电脑已成为我们工作、学习和娱乐不可或缺的工具。然而&#xff0c;正如任何精密机械都可能遇到故障&#xff0c;电脑在运行过程中也难免会遇到各种问题&#xff0c;如…