hookehuyr

feat(视频播放器): 添加倍速播放功能并优化控件样式

...@@ -51,6 +51,8 @@ const videoOptions = computed(() => ({ ...@@ -51,6 +51,8 @@ const videoOptions = computed(() => ({
51 preload: "auto", 51 preload: "auto",
52 responsive: true, 52 responsive: true,
53 autoplay: props.autoplay, 53 autoplay: props.autoplay,
54 + // 启用倍速播放功能
55 + playbackRates: [0.5, 0.75, 1, 1.25, 1.5, 2],
54 sources: [ 56 sources: [
55 { 57 {
56 src: props.videoUrl, 58 src: props.videoUrl,
...@@ -172,4 +174,154 @@ defineExpose({ ...@@ -172,4 +174,154 @@ defineExpose({
172 :deep(.vjs-big-play-button) { 174 :deep(.vjs-big-play-button) {
173 display: none !important; 175 display: none !important;
174 } 176 }
177 +
178 +/* 倍速播放控件样式优化 */
179 +:deep(.vjs-playback-rate) {
180 + order: 7;
181 + position: relative;
182 + display: flex !important;
183 + align-items: center;
184 + z-index: 10;
185 + margin-right: 12px;
186 +}
187 +
188 +/* 隐藏可能存在的图标 */
189 +:deep(.vjs-playback-rate .vjs-icon-chapters) {
190 + display: none !important;
191 +}
192 +
193 +:deep(.vjs-playback-rate .vjs-playback-rate-value) {
194 + font-size: 1.5em;
195 + line-height: 2;
196 + color: #fff;
197 + background: transparent;
198 + border-radius: 4px;
199 + padding: 0 8px;
200 + margin: 0;
201 + transition: all 0.3s ease;
202 + cursor: pointer;
203 + min-width: auto;
204 + text-align: center;
205 + width: auto;
206 + display: inline-block;
207 +}
208 +
209 +:deep(.vjs-playback-rate:hover .vjs-playback-rate-value) {
210 + background: transparent;
211 + transform: scale(1.05);
212 +}
213 +
214 +/* 菜单容器优化 - 解决遮挡问题 */
215 +:deep(.vjs-playback-rate .vjs-menu) {
216 + background: rgba(0, 0, 0, 0.95);
217 + border-radius: 8px;
218 + box-shadow: 0 4px 20px rgba(0, 0, 0, 0.4);
219 + backdrop-filter: blur(15px);
220 + border: 1px solid rgba(255, 255, 255, 0.1);
221 + position: absolute;
222 + bottom: 100%;
223 + right: 0;
224 + margin-bottom: 8px;
225 + min-width: 80px;
226 + max-height: 200px;
227 + overflow-y: auto;
228 + z-index: 1000;
229 +}
230 +
231 +/* 确保菜单在视口内显示 */
232 +:deep(.vjs-playback-rate .vjs-menu.vjs-lock-showing) {
233 + display: block !important;
234 + opacity: 1 !important;
235 + visibility: visible !important;
236 +}
237 +
238 +:deep(.vjs-playback-rate .vjs-menu-content) {
239 + padding: 4px 0;
240 +}
241 +
242 +:deep(.vjs-playback-rate .vjs-menu-item) {
243 + color: #fff;
244 + padding: 10px 16px;
245 + font-size: 14px;
246 + transition: all 0.2s ease;
247 + border-radius: 4px;
248 + margin: 2px 4px;
249 + cursor: pointer;
250 + white-space: nowrap;
251 + text-align: center;
252 +}
253 +
254 +:deep(.vjs-playback-rate .vjs-menu-item:hover) {
255 + background: rgba(255, 255, 255, 0.15);
256 + transform: translateX(2px);
257 +}
258 +
259 +:deep(.vjs-playback-rate .vjs-menu-item.vjs-selected) {
260 + background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
261 + color: #fff;
262 + font-weight: 600;
263 +}
264 +
265 +/* 移动端优化 */
266 +@media (max-width: 768px) {
267 + :deep(.vjs-playback-rate) {
268 + display: flex !important;
269 + visibility: visible !important;
270 + margin-right: 8px;
271 + }
272 +
273 + :deep(.vjs-playback-rate .vjs-playback-rate-value) {
274 + font-size: 1.3em;
275 + padding: 0 6px;
276 + min-width: auto;
277 + height: 36px;
278 + line-height: 36px;
279 + width: auto;
280 + margin: 0;
281 + }
282 +
283 + :deep(.vjs-playback-rate .vjs-menu) {
284 + min-width: 100px;
285 + max-height: 180px;
286 + bottom: 120%;
287 + right: -10px;
288 + }
289 +
290 + :deep(.vjs-playback-rate .vjs-menu-item) {
291 + padding: 12px 16px;
292 + font-size: 16px;
293 + min-height: 44px;
294 + display: flex;
295 + align-items: center;
296 + justify-content: center;
297 + }
298 +}
299 +
300 +/* 小屏幕设备进一步优化 */
301 +@media (max-width: 480px) {
302 + :deep(.vjs-playback-rate) {
303 + margin-right: 6px;
304 + }
305 +
306 + :deep(.vjs-playback-rate .vjs-playback-rate-value) {
307 + font-size: 1.2em;
308 + padding: 0 4px;
309 + min-width: auto;
310 + height: 32px;
311 + line-height: 32px;
312 + width: auto;
313 + margin: 0;
314 + }
315 +
316 + :deep(.vjs-playback-rate .vjs-menu) {
317 + min-width: 90px;
318 + right: -5px;
319 + }
320 +
321 + :deep(.vjs-playback-rate .vjs-menu-item) {
322 + padding: 10px 12px;
323 + font-size: 15px;
324 + min-height: 40px;
325 + }
326 +}
175 </style> 327 </style>
......