小程序视频播放,与父视图一致等样式设置

初始设置的代码:

WXML的代码

<view class="card-wrapper"> <!-- 视频播放容器(默认隐藏) --> <view class="video-container" wx:if="{{isPlaying}}"> <video id="cardVideo" class="card-video" src="{{item.videoUrl}}" autoplay controls bindplay="onVideoPlay" bindpause="onVideoPause" bindended="onVideoEnd" ></video> <view class="video-close-btn" bindtap="togglePlay"> <image src="https://images.biliq.com/images/miniprogram/paopao2.0/paopaoCard/close.png" mode="aspectFit" /> </view> </view> <!-- 封面图容器(播放时隐藏) --> <view class="banner-mask" wx:if="{{!isPlaying}}"> <image class="banner-img" src="{{item.cover}}" mode="aspectFill" /> <!-- 播放按钮 --> <view class="play-mask" bindtap="togglePlay"> <image class="play-icon" src="https://images.biliq.com/images/miniprogram/paopao2.0/paopaoCard/play.png" mode="aspectFit" /> </view> <!-- 点赞、转发、导航 --> <view class="action-bar-wrapper"> <actionBar class="action-bar" item="{{item}}" bind:action="onAction" /> </view> </view> <!-- 名称区域 --> <view class="desc-mask" wx:if="{{!isPlaying}}"> <!-- 名称 --> <text class="banner-title">{{item.title}}</text> <!-- 挂载件 --> <actionMount wx:if="{{item.ismount}}" class="has-mount" item="{{item}}" bind:action="onAction" /> <!-- 无挂载 --> <view wx:elif="{{!item.ismount}}" class="no-mount" item="{{item}}" bind:action="onAction" /> <!-- 详情 --> <view wx:if="{{!item.ismount}}" class="more-mask" bindtap="handleDatail"> <image class="more-img" src="https://images.biliq.com/images/miniprogram/paopao2.0/paopaoCard/more.png" /> </view> </view> <!-- 标签区域 --> <view class="tag-list" wx:if="{{!isPlaying}}"> <block wx:for="{{item.tags}}" wx:key="index" wx:if="{{index < 3}}"> <view class="tag-mask {{item.spotag ? 'has-spot' : ''}}"> <image class="spot-tag" wx:if="{{item.spotag}}" src="https://images.biliq.com/images/miniprogram/paopao2.0/paopaoCard/spotag.png" mode="aspectFit" /> <text class="tag">{{item.text}}</text> </view> </block> </view> </view>

JS的代码

Component({ properties: { item: Object }, data: { isPlaying: false, videoContext: null }, methods: { // 切换播放状态 togglePlay() { if (this.data.isPlaying) { // 如果正在播放,则暂停并隐藏视频 this.data.videoContext.pause(); this.setData({ isPlaying: false }); } else { // 如果未播放,则显示视频并播放 this.setData({ isPlaying: true }, () => { this.data.videoContext = wx.createVideoContext('cardVideo', this); this.data.videoContext.play(); }); } }, // 视频开始播放 onVideoPlay() { console.log('视频开始播放'); }, // 视频暂停 onVideoPause() { console.log('视频已暂停'); }, // 视频播放结束 onVideoEnd() { this.setData({ isPlaying: false }); }, // 其他原有方法... onAction(e) { // 原有逻辑 }, handleDatail() { // 原有逻辑 } }, // 组件卸载时销毁视频实例 detached() { if (this.data.videoContext) { this.data.videoContext.pause(); } } });

WXSS的代码

.card-wrapper { position: relative; width: 100%; border-radius: 12rpx; overflow: hidden; } /* 视频容器样式 */ .video-container { position: relative; width: 100%; height: 0; padding-bottom: 56.25%; /* 16:9 比例 */ } .card-video { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .video-close-btn { position: absolute; top: 20rpx; right: 20rpx; width: 60rpx; height: 60rpx; z-index: 10; } .video-close-btn image { width: 100%; height: 100%; } /* 原有样式保持不变 */ .banner-mask { position: relative; width: 100%; height: 0; padding-bottom: 56.25%; /* 16:9 比例 */ } .banner-img { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } .play-mask { position: absolute; top: 0; left: 0; width: 100%; height: 100%; display: flex; justify-content: center; align-items: center; background-color: rgba(0, 0, 0, 0.3); } .play-icon { width: 100rpx; height: 100rpx; } /* 其他原有样式... */

上述代码展示效果如下

上述代码可以实现视频播放,但是样式不是很好看,我们可以增加一些设置,比如视频和父视图的卡片一样,视频居中展示播放等等,下面是优化后的代码。

WXML的代码

<view class="card-wrapper">

<!-- 视频播放容器(默认隐藏) -->

<view class="video-container" wx:if="{{isPlaying}}">

<!-- 修改为绝对定位的视频包装器 -->

<view class="video-wrapper">

<video

id="cardVideo"

class="card-video"

src="{{item.videoUrl}}"

autoplay

controls

bindplay="onVideoPlay"

bindpause="onVideoPause"

bindended="onVideoEnd"

></video>

</view>

<!-- 关闭按钮 -->

<view class="video-close-btn" bindtap="togglePlay">

<image src="https://images.biliq.com/images/miniprogram/paopao2.0/paopaoCard/close.png" mode="aspectFit" />

</view>

</view>

<!-- 封面图容器(播放时隐藏) -->

<view class="banner-mask" wx:if="{{!isPlaying}}">

<!-- 封面 -->

<image class="banner-img" src="{{item.cover}}" mode="aspectFill" />

<!-- 播放 -->

<view class="play-mask" bindtap="togglePlay">

<image class="play-icon" src="{{isPlaying ? '' : 'https://images.biliq.com/images/miniprogram/paopao2.0/paopaoCard/play.png'}}" mode="aspectFit}}" />

</view>

<!-- 点赞、转发 -->

<view class="action-bar-wrapper">

<actionBar class="action-bar" item="{{item}}" bind:action="onAction" />

</view>

</view>

<!-- 名称区域 -->

<view class="desc-mask" wx:if="{{!isPlaying}}">

<text class="banner-title">{{item.name}}</text>

<view class="more-mask" bind:tap="onDatail">

<image class="more-img" src="https://images.biliq.com/images/miniprogram/paopao2.0/paopaoCard/more.png" />

</view>

<!-- 标签区域 -->

<view class="tag-list">

<block wx:for="{{item.tags}}" wx:key="index" wx:if="{{index < 3}}">

<view class="tag-mask">

<text class="tag">{{item.text}}</text>

</view>

</block>

</view>

</view>

</view>

WXSS的代码

.card-wrapper{

position: absolute;

top: 0;

left: 0;

width: 100%;

height: 100%;

color: #fff;

padding: 0;

}

/* 视频容器样式 - 关键修改 */

.video-container {

position: relative;

width: 100%;

height: 100%;

background: #000;

display: flex;

flex-direction: column; /* 改为列方向布局 */

}

/* 视频包装器 - 移除绝对定位 */

.video-wrapper {

flex: 1; /* 占据剩余空间 */

position: relative;

width: 100%;

padding-bottom: 56.25%; /* 保持16:9比例 */

}

/* 视频样式调整 */

.card-video {

position: absolute;

top: 0;

left: 0;

width: 100%;

height: 100%;

background: #000;

}

/* 强制原生控件在底部 */

.card-video::webkit-media-controls {

position: absolute;

bottom: 0;

width: 100%;

}

.video-close-btn {

position: absolute;

top: 35rpx;

right: 20rpx;

width: 60rpx;

height: 60rpx;

z-index: 10;

display: flex;

justify-content: center;

align-items: center;

}

.video-close-btn image {

width: 100%;

height: 100%;

}


/* 封面图 */

.banner-mask {

position: absolute;

top: 0;

left: 0;

width: 100%;

height: 100%;

margin: 0;

overflow: hidden;

}

.banner-img {

width: 100%;

height: 100%;

border-radius: 20rpx;

}

.play-mask{

position: absolute;

top: 50%;

left: 50%;

transform: translate(-50%, -50%);

width: 88rpx;

height: 88rpx;

padding: 0;

background: none;

display: flex;

justify-content: center;

align-items: center;

}

.play-icon{

width: 100%;

height: 100%;

}

/* 描述区域 */

.desc-mask{

position: absolute;

display: inline-flex;/* 改为inline-flex使宽度自适应内容 */

align-items: center;

left: 30rpx;

height: 104rpx;

bottom: 40rpx;

border-radius: 20rpx;

background-color: rgba(29, 52, 59, 0.4);

backdrop-filter: blur(10rpx);

padding: 0 24rpx;

gap: 5rpx; /* title 与 more-mask 间距 5rpx */

}

.banner-title{

height: 48rpx;

font-weight: 600;

font-size: 34rpx;

color: #FFFFFF;

white-space: nowrap; /* 防止换行 */

}

.more-mask{

flex-shrink: 0;

width: 45rpx;

height: 45rpx;

display: flex;

align-items: center;

justify-content: center;

}

.more-img{

width: 26rpx;

height: 26rpx;

}

/* 标签 */

.tag-list{

position: absolute;

left: 5rpx;

bottom: 114rpx;

display: flex;

flex-wrap: wrap;

gap: 10rpx;

align-items: center;

padding: 6rpx 12rpx;

z-index: 1; /* 确保在desc-mask上层 */

}

.tag-mask{

display: inline-flex; /* 行内弹性布局 */

align-items: center;

background: rgba(0, 0, 0, 0.4);

border-radius: 22rpx;

height: 44rpx;

padding: 5rpx 15rpx;/* 动态宽度由内容撑开 */

}

.tag{

font-weight: 500;

font-size: 20rpx;

color: #E0ED42;

line-height: 28rpx;

text-align: justify;

/* 确保文字不换行 */

white-space: nowrap;

margin-right: 5rpx;

}

/* 收藏、转发 */

.action-bar-wrapper {

position: absolute;

right: 30rpx;

bottom: 30rpx;

width: 60rpx;

height: 380rpx;

z-index: 999;

}

.action-bar {

width: 100%;

height: 100%;

display: flex;

flex-direction: column;

align-items: center;

justify-content: space-between;

gap: 20rpx;

}


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

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

相关文章

Kafka——关于主题管理

引言在Kafka的世界中&#xff0c;主题&#xff08;Topic&#xff09;是消息的基本组织单位&#xff0c;类似于文件系统中的"文件夹"——所有消息都按照主题分类存储&#xff0c;生产者向主题写入消息&#xff0c;消费者从主题读取消息。主题的管理是Kafka运维的基础&…

【VLLM】VLLM使用

一 、安装 二、启动入口 VLLM 提供了多种入口方式启动模型&#xff0c;以适应不同的使用场景&#xff08;如命令行交互、API 服务、自定义集成等&#xff09;。除了最常用的 openai.api_server&#xff08;OpenAI 兼容 API 服务&#xff09;&#xff0c;还有以下主要入口&#…

为Github Copilot创建自定义指令/说明/注意事项

GitHub Copilot 是一个强大的 AI 编程助手&#xff0c;通过合理配置自定义指令&#xff0c;可以让它更好地理解和遵循项目特定的编码规范&#xff0c;省的每次提问时输入重复提示语。 目录 方法一&#xff1a;项目级别指令文件&#xff08;推荐&#xff09;方法二&#xff1a…

信创厚知联盟会长兼创始人莅临绿算技术

2025年7月29日&#xff0c;信创厚知联盟会长兼创始人王杲一行考察广东省绿算技术有限公司&#xff0c;重点调研其在智算中心存储与AI算力协同领域的创新成果。此次交流标志着双方在信创产业生态合作上迈出重要一步&#xff0c;为国产高端高性能全闪存存储与智算基础设施的融合发…

RAG面试内容整理-Prompt Engineering 在 RAG 中的作用

Prompt Engineering(提示工程)指为生成模型精心设计输入提示,以引导模型产生所需的输出。在RAG系统中,prompt设计对充分利用检索到的知识至关重要。因为生成器(通常是LLM)接收到的不仅有用户问题,还有检索的文档内容,我们需要通过提示明确告诉模型如何使用这些信息。例…

【计算机网络】5传输层

传输层是面向通信的最高层&#xff0c;也是用户功能的最底层。 传输层仅存在于主机中&#xff0c;路由器等中间设备只用到下三层&#xff08;无传输层&#xff09;。传输层对上层应用隐藏了底层网络的复杂细节&#xff08;比如数据怎么路由、网络怎么连接等&#xff09;。对应用…

SecureCRT连接密钥交换失败

SecureCRT连接密钥交换失败问题描述&#xff1a;问题分析&#xff1a;解决方案&#xff1a;问题描述&#xff1a; SecureCRT6.7连接银河麒麟操作系统v10版本&#xff0c;报错如下&#xff1a; key exchange failed 密钥交换失败 no compatible key exchange method. The serv…

2021-05-10 求出这十个数据的平均值,并输入高于平均值的所有元素值及下标求出这十个数据的平均值,并输入高于平均值的所有元素值及下标

缘由C语言向一维数组a[10]中输入10个数据&#xff1a;12&#xff0c;15&#xff0c;18&#xff0c;21&#xff0c;24&#xff0c;32&#xff0c;34&#xff0c;36&#xff0c;38&#xff0c;4-其他-CSDN问答 double a[10000]{}, j 0; int n 0;while (n < 10000){std::cin …

WordPress与主流CMS拿Webshell实战

一、wordpress安装环境首先我们在vulhub中启动我们wordpress的doaker容器然后去访问我们的80端口然后选择简体中文进行安装然后就可以登录到我们的后台界面了后台修改模板拿webshell进入后台&#xff0c;我们修改一下404页面的代码&#xff0c;添加我们的一句话木马然后保存&am…

指针的运算与数组

一、指针的运算1.1加法对指针可以进行加法运算&#xff0c;即p n或者p - n。其结果依旧是一个是一个指针&#xff0c;新的指针是在原来的地址值基础上加上/减去n *(sizeof(指针指向的数据类型)&#xff09;个字节。 指针也可以进行自增&#xff0c;即*&#xff08;p &#xf…

【PostgreSQL内核学习:WindowAgg 帧优化与节点去重】

PostgreSQL内核学习&#xff1a;WindowAgg 帧优化与节点去重背景关键词解释本优化主要修改内容描述提交信息提交描述源码解读optimize_window_clauses 函数核心逻辑拆解函数时序图新增结构体类型 SupportRequestOptimizeWindowClause优化后的效果帧优化 sql 用例查询计划输出节…

行业要闻|正式落地!新思科技宣布完成对Ansys的收购

2025年7月17日——新思科技&#xff08;Synopsys, Inc.&#xff0c;纳斯达克股票代码&#xff1a;SNPS&#xff09;宣布完成对Ansys的收购。该交易旨在整合芯片设计、IP核以及仿真与分析领域的领先企业&#xff0c;助力开发者快速创新AI驱动的产品。在扩大至310亿美元的总潜在市…

Elasticsearch 基础速成 5 步跑通索引、文档、映射与查询

1 准备工作运行环境 curl -fsSL https://elastic.co/start-local | sh # 一条命令拉起本地单节点集群 # 浏览器打开 http://localhost:5601 进入 Kibana → DevTools → Console已有云端或 Serverless 集群可以直接跳到第 2 步。操作界面 以下所有请求均可在 Kibana → DevT…

语音表示学习论文总结

语音表示学习&#xff08;Speech Representation Learning&#xff09;是语音信号处理与机器学习交叉领域的核心技术&#xff0c;其目标是通过数据驱动的方式&#xff0c;从原始语音信号中自动提取具有判别性、鲁棒性和泛化能力的特征表示&#xff0c;以替代传统手工设计的声学…

国产芯+单北斗防爆终端:W5-D防爆智能手机,助力工业安全通信升级

在石油石化、煤矿开采、电力检修等高危行业&#xff0c;防爆设备的定位精度、通信可靠性及供应链安全性直接决定作业安全与生产效率。传统防爆手机依赖GPS定位与进口芯片&#xff0c;存在信号盲区、数据泄露风险及断供隐患。针对此&#xff0c;我们推出W5-D防爆智能终端&#x…

Kafka简述及学习课程

Kafka是由Apache软件基金会开发的一个开源流处理平台&#xff0c;由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统&#xff0c;它可以处理消费者在网站中的所有动作流数据。 这种动作&#xff08;网页浏览&#xff0c;搜索和其他用户的行动&#xff09;是在现…

BLE PHY 帧结构

BLE&#xff08;低功耗蓝牙&#xff09;的 PHY&#xff08;物理层&#xff09;帧结构根据传输模式&#xff08;广播、数据&#xff09;和 PHY 类型&#xff08;1M、2M、Coded PHY&#xff09;有所差异&#xff0c;但基本框架一致。以下是 BLE PHY 帧的通用结构及各部分含义&…

海外货运 app 系统架构分析

一、引言海外货运业务涉及众多复杂环节&#xff0c;从货物揽收、仓储管理、运输调度到最后交付&#xff0c;需要一个高效、稳定且功能全面的 APP 系统来协调各方资源&#xff0c;提升物流效率&#xff0c;保障货物安全准确送达。本文将对海外货运 APP 系统架构进行详细剖析&…

【硬件-笔试面试题】硬件/电子工程师,笔试面试题-52,(知识点:简单一阶低通滤波器的设计,RC滤波电路,截止频率)

目录 1、题目 2、解答 3、相关知识点 一、一阶低通滤波器的核心原理 1. 电路结构 2. 关键特性参数 二、一阶低通滤波器的设计步骤&#xff08;以 RC 电路为例&#xff09; 1. 确定截止频率\(f_c\) 2. 选择电阻 R 的阻值 3. 计算电容 C 的容值 4. 验证与调整 三、典…

防火墙安全实验

一、实验拓补图二、实验需求1、VLAN 2属于办公区;VLAN 3属于生产区2、办公区PC在工作日时间(周一至周五&#xff0c;早8到晚6)可以正常访OA Server&#xff0c;其他时间不允许3、办公区PC可以在任意时刻访问Web server4、生产区PC可以在任意时刻访问OA Server&#xff0c;但是不…