11<template >
2- <el-space fill direction =" vertical" :size =" 24" alignment =" center" style =" width :100% ; padding :20px ; " >
3-
4- <!-- <el-collapse>
5- <el-collapse-item>
6- <template #title>
7- <div style="width:100%;">筛选条件</div>
8- </template>
9- <FilterOptions v-model="filterData" :onSubmit="doFilter" :unmodifiedVideos="videos.orignal" />
10- </el-collapse-item>
11- </el-collapse> -->
2+ <el-space fill direction =" vertical" :size =" 24" alignment =" center" style =" width :100% ; padding :10px ; " >
123
134 <!-- 工具菜单 -->
145 <ToolMenus />
156
16-
177 <!-- 视频列表 -->
18- <el-row class =" video-list" >
19- <el-col :xs =" 12" :sm =" 12" :md =" 8" :lg =" 6" v-for = " video in paginatedVideos " :key = " video.video_id "
20- class =" video-card-col " >
8+ <el-row :gutter = " 8 " class =" video-list" >
9+ <el-col :xs =" 12" :sm =" 12" :md =" 8" :lg =" 6" style = " padding-bottom : 8 px ; "
10+ v-for = " video in paginatedVideos " :key =" video.video_id " >
2111 <el-card shadow =" hover" >
22- <div style = " position : relative ; " >
12+ <div class = " card-img-wrapper " >
2313 <img :src =" `https://i.ytimg.com/vi/${video.video_id}/mqdefault.jpg`" alt =" thumbnail" loading =" lazy" />
24- <div class =" card-bottom-shadow" >
14+ <div class =" card-img- bottom-shadow" >
2515 <el-row >
2616 <el-col :span =" 12" >{{ formatDate(video.published_at) }}</el-col >
2717 <el-col :span =" 12" style =" text-align : end ;" >{{ formatDuration(video.duration) }}</el-col >
2818 </el-row >
2919 </div >
3020 </div >
31- <div style =" padding : 10 px 6px 0px 6px ;" >
21+ <div style =" padding : 6 px 6px 0px 6px ;" >
3222 <h3 :title =" video.title" >{{ video.title }}</h3 >
3323 <el-text size =" small" line-clamp =" 1" truncated >{{ video.channel_title }}</el-text >
3424 </div >
4737 </el-col >
4838 </el-row >
4939
50- <!-- 分页 -->
40+ <!-- 分页 这个宽度怎么这么长。。。 -->
5141 <div class =" width-center" >
5242 <el-pagination v-model:current-page =" currentPage" :page-size =" pageSize" :total =" videos.filtered.length"
53- layout =" prev, pager, next " background size =" default " />
43+ layout =" pager" :pager-count = " 5 " background : size =" paginationSize " />
5444 </div >
5545
46+ <!-- 操作按钮点击后弹窗 -->
47+ <ActionDialog v-model =" dialogInfo .visible " >
48+ <ActionYt v-if =" dialogInfo .type === ' Yt' " :video_id =" dialogInfo .videoData .video_id " />
49+ <ActionBili v-else-if =" dialogInfo .type === ' Bili' " :video_list =" dialogInfo .videoData .zh ! " />
50+ <ActionSub v-else-if =" dialogInfo .type === ' Sub' " :video =" dialogInfo .videoData " />
51+ <ActionInfo v-else-if =" dialogInfo .type === ' Info' " :video =" dialogInfo .videoData " />
52+ </ActionDialog >
5653 </el-space >
57-
58- <!-- 操作按钮点击后弹窗 -->
59- <ActionDialog v-model =" dialogInfo .visible " >
60- <ActionYt v-if =" dialogInfo .type === ' Yt' " :video_id =" dialogInfo .videoData .video_id " />
61- <ActionBili v-else-if =" dialogInfo .type === ' Bili' " :video_list =" dialogInfo .videoData .zh ! " />
62- <ActionSub v-else-if =" dialogInfo .type === ' Sub' " :video =" dialogInfo .videoData " />
63- <ActionInfo v-else-if =" dialogInfo .type === ' Info' " :video =" dialogInfo .videoData " />
64- </ActionDialog >
6554</template >
6655
6756<script setup lang="ts">
@@ -115,6 +104,8 @@ const paginatedVideos = computed<YtVideo[]>(() => {
115104 return videos .value .filtered .slice (start , end )
116105});
117106
107+ /** 分页组件的大小 onMount时检测窗口宽度如果过小就改成 small*/
108+ let paginationSize = ref (' default' )
118109
119110// 视频卡片点击事件
120111const card_action_click = (name : ActionType , video : YtVideo ) => {
@@ -148,27 +139,31 @@ const fetchVideos = async () => {
148139
149140onMounted (async () => {
150141 fetchVideos ();
142+ paginationSize .value = window && window .innerWidth < 768 ? ' small' : ' default'
151143});
152144
153145
154146 </script >
155147
156148
157149<style scoped>
150+ @import ' ./pokopea/style.css' ;
151+
158152.video-list {
159153 width : 100% ;
160154}
161155
162- .video-card-col {
163- padding : 10 px ;
156+ .video-list .el-card {
157+ --el-card- padding : 0 px ;
164158}
165159
166- .el-card {
167- --el-card-padding : 0px ;
160+ .video-list .el-card :hover ,
161+ .video-list .el-card :focus {
162+ box-shadow : var (--el-box-shadow-dark );
168163}
169164
170165/* 视频标题 */
171- .el-card h3 {
166+ .video-list . el-card h3 {
172167 all : unset ;
173168 font-size : 15px ;
174169 /* margin: 10px 6px 10px 6px; */
@@ -187,23 +182,29 @@ onMounted(async () => {
187182
188183}
189184
190- .el-card img {
191- width : 100% ;
192- height : auto ;
185+ .video-list .card-img-wrapper {
186+ position : relative ;
193187 /* 图片未加载时也会留出高度 */
194188 aspect-ratio : 16 / 9 ;
195189}
196190
197- .card-bottom-shadow {
191+
192+ .video-list .el-card img {
193+ width : 100% ;
194+ height : auto ;
195+
196+ }
197+
198+ .card-img-bottom-shadow {
198199 position : absolute ;
199200 bottom : 0 ;
200201 left : 0 ;
201202 width : 100% ;
202- height : 38 px ;
203+ height : 42 px ;
203204 font-size : 13px ;
204205 line-height : 18px ;
205206 z-index : 2 ;
206- padding : 16px 6 px 6 px 6 px ;
207+ padding : 16px 10 px 10 px 10 px ;
207208 background-image : linear-gradient (180deg , rgba (0 , 0 , 0 , 0 ) 0% , rgba (0 , 0 , 0 , 0.8 ) 100% );
208209 color : #fff ;
209210 opacity : 1 ;
@@ -219,13 +220,11 @@ onMounted(async () => {
219220 justify-content : center ;
220221 transition : box-shadow 0.3s ease ;
221222 /* 添加过渡效果 */
222-
223223}
224224
225-
226225.card-footer .el-col :hover ,
227226.card-footer .el-col :active {
228- box-shadow : 0 0 5 px rgba ( 0 , 0 , 0 , 0.5 );
227+ box-shadow : var ( --el-box-shadow );
229228 /* 添加灰色阴影 */
230229 cursor : pointer ;
231230 /* 鼠标悬停时显示手型 */
@@ -242,6 +241,9 @@ onMounted(async () => {
242241 margin : auto ;
243242}
244243
244+
245+
246+
245247.width-center {
246248 display : flex ;
247249 justify-content : center ;
0 commit comments