From 4e9d7c0e363d313a273700865afb8b0d665e6c69 Mon Sep 17 00:00:00 2001
From: xiangpei <xiangpei@timesnew.cn>
Date: 星期三, 18 六月 2025 14:11:23 +0800
Subject: [PATCH] 视频相关页面优化、功能bug
---
/dev/null | 144 -------------
components/dropdown-menu.vue | 2
pages.json | 6
pages/video/video-play.vue | 433 +++++++++++++++++++++++++++++++-------
pages/tabbar/index/home.vue | 2
pages/video/home-page.vue | 44 ++--
6 files changed, 370 insertions(+), 261 deletions(-)
diff --git a/components/dropdown-menu.vue b/components/dropdown-menu.vue
index 6dee7c9..066a6d6 100644
--- a/components/dropdown-menu.vue
+++ b/components/dropdown-menu.vue
@@ -149,7 +149,7 @@
.dropdown-menu {
position: absolute;
- left: 0;
+ left: -50rpx;
display: inline-block;
white-space: nowrap;
background-color: #fff;
diff --git a/pages.json b/pages.json
index ea4a9f3..71ab3f6 100644
--- a/pages.json
+++ b/pages.json
@@ -26,12 +26,6 @@
"navigationStyle": "custom" // 闅愯棌椤堕儴瀵艰埅鏍�
}
},
- // {
- // "path": "pages/tabbar/index/home1",
- // "style": {
- // "navigationBarTitleText": ""
- // }
- // },
{
"path": "pages/tabbar/home/index",
"style": {
diff --git a/pages/tabbar/index/home.vue b/pages/tabbar/index/home.vue
index df33ed7..ade53fe 100644
--- a/pages/tabbar/index/home.vue
+++ b/pages/tabbar/index/home.vue
@@ -916,7 +916,7 @@
.video-info {
width: 70%;
position: absolute;
- bottom: 70px;
+ bottom: 20px;
left: 20px;
color: #f8f8f8;
z-index: 10;
diff --git a/pages/tabbar/index/home1.vue b/pages/tabbar/index/home1.vue
deleted file mode 100644
index 1a5edcc..0000000
--- a/pages/tabbar/index/home1.vue
+++ /dev/null
@@ -1,144 +0,0 @@
-<template>
- <!-- 鑷畾涔夋帶鍒舵潯 -->
- <view
- @touchstart="handleTouchStart"
- @touchmove="handleTouchMove"
- @touchend="handleTouchEnd"
- class="container">
- <!-- 杩涘害鏉� - 鏁翠釜鍖哄煙鍙嫋鍔� -->
- <view class="process-warp" :style="{ opacity: showProcess ? 1 : 0 }">
- <!-- 鏄剧ず褰撳墠杩涘害 -->
- <view class="progress-text">{{ hasPlayTime }}/{{formartDuration}}</view>
- <view
- class="progress-bar"
- id="progressBar"
- >
-
- <!-- 宸插~鍏呴儴鍒� -->
- <view class="progress-fill" :style="{ width: progress + '%' }"></view>
- </view>
- </view>
- </view>
-</template>
-
-<script>
-export default {
- data() {
- return {
- startX: 0,
- progress: 0, // 瑙嗛杩涘害
- startProgress : 0, // 寮�濮嬫粦鍔ㄦ椂鐨勮繘搴�
- barLeft: 0, // 杩涘害鏉″乏杈圭晫浣嶇疆
- barWidth: 0, // 杩涘害鏉″搴�
- isDragging: false, // 鏄惁姝e湪鎷栧姩
- processHidenTimer: null, // 杩涘害鏉¢殣钘忓畾鏃跺櫒
- showProcess: false, // 鏄惁鏄剧ず杩涘害鏉�
- };
- },
- mounted() {
- // 鑾峰彇杩涘害鏉$殑灏哄鍜屼綅缃俊鎭�
- this.getBarRect();
- },
- methods: {
- // 鑾峰彇杩涘害鏉$殑浣嶇疆鍜屽昂瀵�
- getBarRect() {
- const query = uni.createSelectorQuery().in(this);
- query.select('#progressBar').boundingClientRect(rect => {
- if (rect) {
- this.barLeft = rect.left;
- this.barWidth = rect.width;
- }
- }).exec();
- },
-
- // 瑙︽懜寮�濮�
- handleTouchStart(e) {
- this.isDragging = true;
- this.showProcess = true;
- this.startProgress = this.progress; // 璁板綍寮�濮嬫椂鐨勮繘搴�
- this.startX = e.touches[0].pageX;
- console.log("璁板綍寮�濮嬫椂鐨勮繘搴�", this.startProgress);
- this.videoContexts[this.currentIndex].pause()
- // this.updateProgress(e);
- },
-
- // 瑙︽懜绉诲姩
- handleTouchMove(e) {
- if (!this.isDragging || !this.barWidth) return;
- clearTimeout(this.processHidenTimer)
- this.videoContexts[this.currentIndex].pause()
- this.updateProgress(e);
- },
-
- // 瑙︽懜缁撴潫
- handleTouchEnd() {
- this.isDragging = false;
- console.log("婊戝姩缁撴潫", this.duration * this.progress);
- this.videoContexts[this.currentIndex].seek(this.duration * this.progress / 100)
- this.videoContexts[this.currentIndex].play()
- this.processHidenTimer = setTimeout(() => {
- this.showProcess = false;
- }, 1000);
- },
-
- // 鏇存柊杩涘害
- updateProgress(e) {
- // 鑾峰彇褰撳墠瑙︽懜鐐筙鍧愭爣
- const currentX = e.touches[0].pageX;
-
- // 璁$畻婊戝姩璺濈(鍍忕礌)
- const deltaX = currentX - this.startX;
-
- // 灏嗗儚绱犺窛绂昏浆鎹负杩涘害澧為噺
- const deltaProgress = (deltaX / this.barWidth) * 100;
- console.log("杩涘害澧為噺", deltaProgress);
- // 璁$畻鏂拌繘搴� = 寮�濮嬫椂鐨勮繘搴� + 婊戝姩澧為噺
- let newProgress = this.startProgress + deltaProgress;
-
- // 闄愬埗鑼冨洿鍦�0-100涔嬮棿
- newProgress = Math.max(0, Math.min(100, newProgress));
-
- this.progress = newProgress;
- }
- }
-};
-</script>
-
-<style>
-.container {
- display: flex;
- flex-direction: column;
- align-items: center;
- position: absolute;
- bottom: 0;
- width: 100%;
- }
-
- .progress-bar {
- position: relative;
- width: 100%;
- height: 16px;
- background-color: #eee;
- overflow: hidden;
- }
-
- .progress-fill {
- position: absolute;
- left: 0;
- top: 0;
- height: 100%;
- background-color: lightgray;
- transition: width 0.1s;
- }
- .process-warp {
- width: 100%;
- display: flex;
- flex-direction: column;
- align-items: center;
- }
- .progress-text {
- margin-top: 10px;
- font-size: 14px;
- color: #666;
- }
-</style>
\ No newline at end of file
diff --git a/pages/video/home-page.vue b/pages/video/home-page.vue
index 1e29861..76ca651 100644
--- a/pages/video/home-page.vue
+++ b/pages/video/home-page.vue
@@ -61,12 +61,13 @@
<!-- 瑙嗛鍒楄〃 -->
<scroll-view class="video-list" scroll-y :show-scrollbar="false" @scrolltolower="getPage" v-show="currentTab === 'works' && videoList.length > 0">
+ <view class="video-container">
<view
class="video-item"
v-for="(item, index) in videoList"
:key="item.id"
>
- <image class="video-cover" @click="playAuthorVideo(index)" :src="item.coverUrl" mode="aspectFill"></image>
+ <image class="video-cover" @click="playAuthorVideo(index)" :src="item.videoContentType === 'video' ? item.coverUrl : item.imgs[0]" mode="aspectFill"></image>
<view class="video-info">
<view class="video-stats">
<view class="stat">
@@ -83,6 +84,7 @@
</view>
</view>
</view>
+ </view>
</view>
</scroll-view>
<scroll-view class="video-list" scroll-y :show-scrollbar="false" @scrolltolower="getPage" v-show="currentTab === 'likes' && collectVideoList.length > 0">
@@ -93,7 +95,7 @@
:key="item.id"
@click="playCollectVideo(index)"
>
- <image class="video-cover" :src="item.coverUrl" mode="aspectFill"></image>
+ <image class="video-cover" :src="item.videoContentType === 'video' ? item.coverUrl : item.imgs[0]" mode="aspectFill"></image>
<view class="video-info">
<view class="video-stats">
<view class="stat">
@@ -301,7 +303,7 @@
});
},
// 鎾斁鏀惰棌瑙嗛
- playAuthorVideo(index) {
+ playCollectVideo(index) {
const playInfo = {
videoList: this.collectVideoList,
nomore: this.nomoreCollectVideo,
@@ -460,16 +462,21 @@
}
.video-list {
- width: calc(100% - 20rpx);
- padding: 0 10rpx;
- height: calc(100vh - 554rpx);
- background-color: #fff;
+ width: 100%;
+ padding: 0 10rpx;
+ height: calc(100vh - 554rpx);
+ background-color: #fff;
+}
+
+.video-container {
+ display: flex;
+ flex-wrap: wrap;
+ justify-content: space-between;
}
.video-item {
- width: 50%;
- padding: 10rpx;
- box-sizing: border-box;
+ width: 49%;
+ margin-bottom: 20rpx;
position: relative;
}
@@ -481,15 +488,12 @@
}
.video-info {
- display: flex;
- height: 60rpx;
- align-items: center;
- font-size: 24rpx;
- width: 100%;
- padding-right: 20rpx;
- box-sizing: border-box;
position: absolute;
- bottom: 20rpx;
+ bottom: 10rpx;
+ left: 0;
+ right: 0;
+ padding: 0 10rpx;
+ box-sizing: border-box;
}
.video-title {
@@ -569,8 +573,4 @@
}
}
-.video-container {
- display: flex;
- flex-wrap: wrap
-}
</style>
\ No newline at end of file
diff --git a/pages/video/video-play.vue b/pages/video/video-play.vue
index d98f74e..4cf61c2 100644
--- a/pages/video/video-play.vue
+++ b/pages/video/video-play.vue
@@ -9,89 +9,141 @@
@change="onSwiperChange"
>
<swiper-item v-for="(item, index) in videoList" :key="item.id">
- <!-- 鎾斁鎸夐挳锛堜粎褰撹棰戞殏鍋滄椂鏄剧ず锛� -->
- <view
- class="play-icon"
- @click="togglePlay(index)"
- v-if="!currentVideoIsPlaying"
- >
- <image src="/static/video/play.png" style="width: 45px;height: 45px" mode="aspectFit"></image>
- </view>
- <video
- :id="'video'+index"
- :ref="'video'+index"
- :src="item.videoUrl"
- :autoplay="currentIndex === index"
- :controls="false"
- :loop="true"
- :object-fit="item.objectFit"
- class="video-item"
- @play="onPlay(item.id, index)"
- @pause="onPause(index)"
- @ended="onEnded(index)"
- @click="togglePlay(index)"
- @timeupdate="onTimeUpdate($event)"
- ></video>
-
- <!-- 鎮寕鍟嗗搧閾炬帴灞� -->
- <view class="goods-link-warp">
- <view class="goods-link">
- <view class="goods-container">
- <!-- 鍟嗗搧鍥剧墖 -->
- <image class="goods-image" :src="item.goods.imageUrl" mode="aspectFill"></image>
-
- <!-- 鍟嗗搧淇℃伅 -->
- <view class="goods-info">
- <text class="goods-name">{{item.goods.name}}</text>
- <view class="price-section">
- <text class="current-price">楼{{item.goods.price}}</text>
- <text class="original-price" v-if="item.goods.originalPrice">楼{{item.goods.originalPrice}}</text>
- </view>
- <text class="sales-count">{{item.goods.saleNum}}浜哄凡璐�</text>
- </view>
-
- <!-- 璐拱鎸夐挳 -->
- <view class="buy-button">
- <text>璐拱</text>
- </view>
- </view>
- </view>
- </view>
-
-
- <!-- 瑙嗛淇℃伅灞� -->
- <view class="video-info">
- <view>
- <text class="video-author">@{{item.authorName}}</text>
- </view>
- <view style="width: 100%;word-wrap: break-word;white-space: normal;overflow-wrap: break-word;">
- <text class="video-title">{{item.title}}</text>
- <text class="video-tag" v-for="(tag, index) in item.tagList" :key="tag.id">#{{tag.tagName}}</text>
- </view>
- </view>
-
- <!-- 鍙充晶浜掑姩鎸夐挳 -->
- <view class="action-buttons">
- <view class="avatar-container">
- <image class="avatar" @click="jumpToHomePage(item.authorId)" :src="item.authorAvatar" mode="aspectFill"></image>
- <!-- 鍏虫敞鍥炬爣 - 浣跨敤缁濆瀹氫綅 -->
- <view v-if="!item.subscribeThisAuthor" class="follow-icon" @click="subscribeAuth(index, item.authorId)">
- <text class="iconfont"></text>
- </view>
- </view>
- <view class="action-item" @click="toggleCollect(item, index)">
- <text class="iconfont" v-if="item.collected"></text>
- <text class="iconfont" v-else></text>
- <text style="font-size: 10px;font-weight: lighter;">{{item.collectNum}}</text>
+ <view style="width: 100%;height: 100%;" v-if="item.videoContentType === 'video'">
+ <!-- 鎾斁鎸夐挳锛堜粎褰撹棰戞殏鍋滄椂鏄剧ず锛� -->
+ <view
+ class="play-icon"
+ @click="togglePlay(index)"
+ v-if="!currentVideoIsPlaying"
+ >
+ <image src="/static/video/play.png" style="width: 45px;height: 45px" mode="aspectFit"></image>
+ </view>
+ <video
+ :id="'video'+index"
+ :ref="'video'+index"
+ :src="item.videoUrl"
+ :autoplay="currentIndex === index"
+ :controls="false"
+ :loop="true"
+ :object-fit="item.objectFit"
+ :enable-progress-gesture="false"
+ class="video-item"
+ @play="onPlay(item.id, index)"
+ @pause="onPause(index)"
+ @ended="onEnded(index)"
+ @click="togglePlay(index)"
+ @timeupdate="onTimeUpdate($event)"
+ @loadedmetadata="onLoadedMetadata($event)"
+
+ ></video>
+ <!-- 鑷畾涔夋帶鍒舵潯 -->
+ <view
+ @touchstart="handleTouchStart"
+ @touchmove="handleTouchMove"
+ @touchend="handleTouchEnd"
+ class="container">
+ <!-- 杩涘害鏉� - 鏁翠釜鍖哄煙鍙嫋鍔� -->
+ <view class="process-warp" :style="{ opacity: showProcess ? 1 : 0 }">
+ <!-- 鏄剧ず褰撳墠杩涘害 -->
+ <view class="progress-text">{{ hasPlayTime }}/{{formartDuration}}</view>
+ <view
+ class="progress-bar"
+ id="progressBar"
+ >
+
+ <!-- 宸插~鍏呴儴鍒� -->
+ <view class="progress-fill" :style="{ width: progress + '%' }"></view>
+ </view>
+ </view>
+ </view>
+ </view>
+ <view style="width: 100%; height: 100%;" v-else-if="item.videoContentType === 'img'">
+ <uni-swiper-dot
+ :info="item.imgs"
+ :current="currentImgIndex"
+ mode="round"
+ style="width: 100%;height: 100%;display: flex;justify-content: center;align-items: center;"
+ :dots-styles="{width: 24, bottom: 24,selectedBackgroundColor: 'green', backgroundColor: 'gray'}"
+ >
+ <swiper class="swiper-box" @change="imgChange" :autoplay="true" :interval="3000">
+ <swiper-item v-for="img in item.imgs" :key="img">
+ <view class="swiper-item">
+ <!-- 璋冩暣 image 鏍峰紡锛屼娇鍏跺眳涓笖鎸夋瘮渚嬬缉鏀� -->
+ <image
+ :src="img"
+ mode="aspectFit"
+ style="width: 100%; height: 100%; display: block; margin: 0 auto;"
+ ></image>
+ </view>
+ </swiper-item>
+ </swiper>
+ </uni-swiper-dot>
+ </view>
+
+
+ <!-- 鎮寕鍟嗗搧閾炬帴灞� -->
+ <view class="goods-link-warp" v-if="item.goodsList.length > 0">
+ <view class="goods-link">
+ <swiper @change="goodsChange" :autoplay="true" :interval="4000" style="height: 120rpx;">
+ <swiper-item v-for="goods in item.goodsList" :key="goods.goodsId">
+ <view class="goods-container" @click="jumpToPay(item.id)">
+ <!-- 鍟嗗搧鍥剧墖 -->
+ <image class="goods-image" :src="goods.thumbnail" mode="aspectFill"></image>
+
+ <!-- 鍟嗗搧淇℃伅 -->
+ <view class="goods-info">
+ <text class="goods-name">{{goods.goodsName}}</text>
+ <view class="price-section">
+ <text class="current-price">楼{{goods.price}}</text>
+ <text class="original-price" v-if="goods.originalPrice">楼{{goods.originalPrice}}</text>
+ </view>
+ </view>
+ </view>
+ </swiper-item>
+ </swiper>
+ </view>
+ </view>
+
+
+ <!-- 瑙嗛淇℃伅灞� -->
+ <view class="video-info">
+ <view>
+ <text class="video-author">@{{item.authorName}}</text>
+ </view>
+ <view style="width: 100%;word-wrap: break-word;white-space: normal;overflow-wrap: break-word;">
+ <text class="video-title">{{item.title}}</text>
+ <text class="video-tag" v-for="(tag, index) in item.tagList" :key="tag.id">#{{tag.tagName}}</text>
+ </view>
</view>
- <view class="action-item" @click="showComments(item)">
- <text class="iconfont"></text>
- <text style="font-size: 10px;font-weight: lighter;">{{item.commentNum}}</text>
+
+ <!-- 鍙充晶浜掑姩鎸夐挳 -->
+ <view class="action-buttons">
+ <view class="avatar-container">
+ <image class="avatar" @click="jumpToHomePage(item.authorId)" :src="item.authorAvatar" mode="aspectFill"></image>
+ <!-- 鍏虫敞鍥炬爣 - 浣跨敤缁濆瀹氫綅 -->
+ <view v-if="!item.subscribeThisAuthor" class="follow-icon" @click="subscribeAuth(index, item.authorId)">
+ <text class="iconfont"></text>
+ </view>
+ </view>
+ <view class="action-item" @click="toggleCollect(item, index)">
+ <text class="iconfont" v-if="item.collected"></text>
+ <text class="iconfont" v-else></text>
+ <text style="font-size: 10px;font-weight: lighter;">{{item.collectNum}}</text>
+ </view>
+ <view class="action-item" @click="showComments(item)">
+ <text class="iconfont"></text>
+ <text style="font-size: 10px;font-weight: lighter;">{{item.commentNum}}</text>
+ </view>
+ <view class="action-item">
+ <button open-type="share" class="custom-share-btn" :data-obj="item">
+ <text class="iconfont"></text>
+ </button>
+
+ </view>
</view>
- </view>
-
- </swiper-item>
- </swiper>
+
+ </swiper-item>
+ </swiper>
<!-- 璇勮寮圭獥 -->
<uni-popup ref="commentPopup" type="bottom" :is-mask-click="true" @maskClick="closeCommentPopup">
@@ -178,9 +230,29 @@
<script>
import { getRecommendVideos, savePlayRecord, subscribe, getVideoComments, addVideoComment, thubmsUpComment, cancelThubmsUpComment } from "@/api/video.js";
import { changeCollect } from "@/api/collect.js";
+import { saveShare } from "@/api/share.js";
+import storage from "@/utils/storage.js";
export default {
+ computed: {
+ hasPlayTime() {
+ return this.sliderFormatTime(this.progress > 0 ? this.duration * this.progress / 100 : 0);
+ }
+ },
data() {
return {
+ currentImgIndex: 0, // 鎾斁鍒扮鍑犲紶鍥�--绱㈠紩
+ currentGoodsIndex: 0, // 鎾斁鍒扮鍑犱釜鍟嗗搧--绱㈠紩
+ currentTime: 0,
+ formartDuration: '',
+ duration: 0,
+ startX: 0,
+ progress: 0, // 瑙嗛杩涘害
+ startProgress : 0, // 寮�濮嬫粦鍔ㄦ椂鐨勮繘搴�
+ barLeft: 0, // 杩涘害鏉″乏杈圭晫浣嶇疆
+ barWidth: 0, // 杩涘害鏉″搴�
+ isDragging: false, // 鏄惁姝e湪鎷栧姩
+ processHidenTimer: null, // 杩涘害鏉¢殣钘忓畾鏃跺櫒
+ showProcess: false, // 鏄惁鏄剧ず杩涘害鏉�
videoNoMore: false, // 鏄惁杩樻湁鏇村瑙嗛
commentNoMore: false, // 鏄惁杩樻湁鏇村璇勮
commentQuery: {
@@ -253,6 +325,7 @@
const playInfo = uni.getStorageSync("playInfo", playInfo);
if(playInfo) {
this.videoList = playInfo.videoList;
+ console.log("鎷垮埌鏁版嵁浜�",playInfo);
this.videoQuery.pageNumber = playInfo.pageNumber;
this.videoNoMore = playInfo.nomore;
this.videoQuery.authorId = option.authorId;
@@ -267,7 +340,51 @@
// 鍒濆鍖栬棰戜笂涓嬫枃
this.initVideoContexts();
},
+ onShareAppMessage(e) {
+ const userInfo = storage.getUserInfo();
+ if(!userInfo) {
+ console.log("鏈櫥褰曚笉鑳藉垎浜�");
+ return
+ }
+ const videoInfo = e.target.dataset.obj;
+ // 淇濆瓨鍒嗕韩璁板綍
+ const data = {
+ shareType: 'video',
+ refId: videoInfo.id,
+ shareUser: userInfo.id
+ }
+ saveShare(data)
+ return {
+ title: videoInfo.title,
+ path: `/pages/tabbar/index/home?videoId=${videoInfo.id}&userId=${userInfo.id}`,
+ imageUrl: videoInfo.coverUrl
+ }
+ },
methods: {
+ // 鐐瑰嚮鍟嗗搧璺宠浆
+ jumpToPay(videoId) {
+ uni.navigateTo({
+ url: '/pages/video/video-goods-detail?videoId=' + videoId
+ });
+ },
+ // 杞挱鍥惧彉鍖�
+ imgChange(e) {
+ this.currentImgIndex = e.detail.current;
+ },
+ // 鍟嗗搧杞挱鍥惧彉鍖�
+ goodsChange(e) {
+ this.currentGoodsIndex = e.detail.current;
+ },
+ // 鑾峰彇杩涘害鏉$殑浣嶇疆鍜屽昂瀵�
+ getBarRect() {
+ const query = uni.createSelectorQuery().in(this);
+ query.select('#progressBar').boundingClientRect(rect => {
+ if (rect) {
+ this.barLeft = rect.left;
+ this.barWidth = rect.width;
+ }
+ }).exec();
+ },
// 璺宠浆涓汉涓婚〉
jumpToHomePage(authorId) {
uni.navigateTo({
@@ -364,6 +481,12 @@
const input = this.$refs.commentInput;
if (input) input.focus();
});
+ },
+ // 杩涘害鏉℃椂闂存牸寮忓寲 (00:00)
+ sliderFormatTime(seconds) {
+ const mins = Math.floor(seconds / 60);
+ const secs = Math.floor(seconds % 60);
+ return `${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`;
},
// 鏍煎紡鍖栨椂闂�
formatTime(time) {
@@ -561,6 +684,67 @@
this.videoContexts[this.currentIndex].play();
}
},
+
+ // 鑾峰彇杩涘害鏉$殑浣嶇疆鍜屽昂瀵�
+ getBarRect() {
+ const query = uni.createSelectorQuery().in(this);
+ query.select('#progressBar').boundingClientRect(rect => {
+ if (rect) {
+ this.barLeft = rect.left;
+ this.barWidth = rect.width;
+ }
+ }).exec();
+ },
+
+ // 瑙︽懜寮�濮�
+ handleTouchStart(e) {
+ this.isDragging = true;
+ this.showProcess = true;
+ this.startProgress = this.progress; // 璁板綍寮�濮嬫椂鐨勮繘搴�
+ this.startX = e.touches[0].pageX;
+ console.log("璁板綍寮�濮嬫椂鐨勮繘搴�", this.startProgress);
+ this.videoContexts[this.currentIndex].pause()
+ // this.updateProgress(e);
+ },
+
+ // 瑙︽懜绉诲姩
+ handleTouchMove(e) {
+ if (!this.isDragging || !this.barWidth) return;
+ clearTimeout(this.processHidenTimer)
+ this.videoContexts[this.currentIndex].pause()
+ this.updateProgress(e);
+ },
+
+ // 瑙︽懜缁撴潫
+ handleTouchEnd() {
+ this.isDragging = false;
+ console.log("婊戝姩缁撴潫", this.duration * this.progress);
+ this.videoContexts[this.currentIndex].seek(this.duration * this.progress / 100)
+ this.videoContexts[this.currentIndex].play()
+ this.processHidenTimer = setTimeout(() => {
+ this.showProcess = false;
+ }, 1000);
+ },
+
+ // 鏇存柊杩涘害
+ updateProgress(e) {
+ // 鑾峰彇褰撳墠瑙︽懜鐐筙鍧愭爣
+ const currentX = e.touches[0].pageX;
+
+ // 璁$畻婊戝姩璺濈(鍍忕礌)
+ const deltaX = currentX - this.startX;
+
+ // 灏嗗儚绱犺窛绂昏浆鎹负杩涘害澧為噺
+ const deltaProgress = (deltaX / this.barWidth) * 100;
+ console.log("杩涘害澧為噺", deltaProgress);
+ // 璁$畻鏂拌繘搴� = 寮�濮嬫椂鐨勮繘搴� + 婊戝姩澧為噺
+ let newProgress = this.startProgress + deltaProgress;
+
+ // 闄愬埗鑼冨洿鍦�0-100涔嬮棿
+ newProgress = Math.max(0, Math.min(100, newProgress));
+
+ this.progress = newProgress;
+ },
// 鏀惰棌/鍙栨秷鏀惰棌
toggleCollect(item, index) {
@@ -594,9 +778,15 @@
},
// 瑙嗛鎾斁浜嬩欢
onPlay(id, index) {
- console.log(id, index, "瑙﹀彂鎾斁");
+ this.getBarRect()
+ this.progress = 0
if(index === this.currentIndex) {
this.currentVideoIsPlaying = true;
+ if(! this.duration) {
+ // 璁剧疆褰撳墠鎾斁瑙嗛鐨勬�绘椂闀�
+ this.duration = this.videoList[this.currentIndex].videoDuration;
+ this.formartDuration = this.sliderFormatTime(this.duration);
+ }
} else {
this.currentVideoIsPlaying = false;
return
@@ -632,8 +822,15 @@
// 璁板綍鎾斁鏃堕暱
onTimeUpdate(e) {
this.playRecord.playAt = e.detail.currentTime
+ this.currentTime = e.detail.currentTime;
+ this.progress = (e.detail.currentTime / this.duration) * 100
},
-
+ // 鑾峰彇瑙嗛鎬绘椂闀�
+ onLoadedMetadata(e) {
+ // this.duration = e.detail.duration;
+ // this.formartDuration = this.sliderFormatTime(this.duration);
+ // console.log("瑙嗛鎬绘椂闀�", this.duration);
+ },
// 淇濆瓨鎾斁璁板綍
async savePlayRecord() {
console.log(Date.now(), this.playRecord.startPlayTime, this.totalHidenTime);
@@ -669,7 +866,7 @@
.video-swiper {
width: 100%;
- height: 100%;
+ height: calc(100% - 20rpx);
}
.video-item {
@@ -691,7 +888,7 @@
.video-info {
width: 70%;
position: absolute;
- bottom: 70px;
+ bottom: 20px;
left: 20px;
color: #f8f8f8;
z-index: 10;
@@ -765,6 +962,7 @@
}
.goods-link {
position: relative;
+ width: 450rpx;
margin: 20rpx 0;
padding: 12rpx;
background-color: rgba(255, 255, 255, 0.9);
@@ -773,6 +971,7 @@
}
.goods-container {
+ width: 100%;
display: flex;
align-items: center;
}
@@ -795,11 +994,13 @@
font-size: 28rpx;
color: #333;
font-weight: bold;
- display: -webkit-box;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
- overflow: hidden;
margin-bottom: 8rpx;
+ width: 280rpx; /* 闇�瑕佹寚瀹氬搴� */
+ overflow: hidden;
+ white-space: nowrap;
+ text-overflow: ellipsis;
}
.price-section {
@@ -1025,4 +1226,62 @@
.thumbs-num {
margin-left: 4rpx;
}
+ .container {
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ position: absolute;
+ bottom: 0;
+ width: 100%;
+ }
+
+ .progress-bar {
+ position: relative;
+ width: 100%;
+ height: 16px;
+ background-color: #eee;
+ overflow: hidden;
+ }
+
+ .progress-fill {
+ position: absolute;
+ left: 0;
+ top: 0;
+ height: 100%;
+ background-color: lightgray;
+ transition: width 0.1s;
+ }
+ .process-warp {
+ width: 100%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ }
+ .progress-text {
+ margin-top: 10px;
+ font-size: 14px;
+ color: #666;
+ }
+ .swiper-box {
+ width: 100%;
+ height: 1200rpx;
+ }
+ .swiper-item {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ width: 100%;
+ height: 100%;
+ }
+ .custom-share-btn {
+ font-size: unset;
+ background: none;
+ padding: 0;
+ margin: 0;
+ line-height: normal;
+ border: none;
+ }
+ .custom-share-btn::after {
+ border: none;
+ }
</style>
\ No newline at end of file
--
Gitblit v1.8.0