与牧同行-小程序用户端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

663 lines
14 KiB

  1. .video-detail-container {
  2. min-height: 100vh;
  3. background: linear-gradient(135deg, #0f172a 0%, #1a1e2c 100%);
  4. position: relative;
  5. }
  6. /* 导航栏 */
  7. .nav-bar {
  8. position: fixed;
  9. top: 0;
  10. left: 0;
  11. right: 0;
  12. height: 88rpx;
  13. padding: 0 30rpx;
  14. display: flex;
  15. align-items: center;
  16. justify-content: space-between;
  17. background: linear-gradient(180deg, rgba(15, 23, 42, 0.98) 0%, rgba(15, 23, 42, 0.9) 100%);
  18. backdrop-filter: blur(20rpx);
  19. z-index: 1000;
  20. border-bottom: 1rpx solid rgba(255, 255, 255, 0.08);
  21. }
  22. .nav-title {
  23. font-size: 34rpx;
  24. font-weight: 700;
  25. color: #fff;
  26. text-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.3);
  27. }
  28. /* 视频播放器区域 */
  29. .video-player-section {
  30. width: 100%;
  31. height: 500rpx;
  32. position: relative;
  33. background: #000;
  34. overflow: hidden;
  35. }
  36. .video-player {
  37. width: 100%;
  38. height: 100%;
  39. background: #000;
  40. }
  41. /* 视频封面 */
  42. .video-cover {
  43. position: absolute;
  44. top: 0;
  45. left: 0;
  46. right: 0;
  47. bottom: 0;
  48. background: #000;
  49. z-index: 2;
  50. }
  51. .cover-image {
  52. width: 100%;
  53. height: 100%;
  54. opacity: 0.9;
  55. }
  56. .cover-play-btn {
  57. position: absolute;
  58. top: 50%;
  59. left: 50%;
  60. transform: translate(-50%, -50%);
  61. width: 120rpx;
  62. height: 120rpx;
  63. background: rgba(0, 0, 0, 0.6);
  64. backdrop-filter: blur(20rpx);
  65. border-radius: 50%;
  66. display: flex;
  67. align-items: center;
  68. justify-content: center;
  69. border: 3rpx solid rgba(255, 255, 255, 0.3);
  70. box-shadow: 0 8rpx 40rpx rgba(0, 0, 0, 0.5);
  71. }
  72. .cover-play-btn .play-icon {
  73. width: 50rpx;
  74. height: 50rpx;
  75. margin-left: 8rpx;
  76. filter: brightness(2);
  77. }
  78. /* 全屏控制栏 */
  79. .fullscreen-controls {
  80. position: absolute;
  81. top: 0;
  82. left: 0;
  83. right: 0;
  84. bottom: 0;
  85. z-index: 10;
  86. opacity: 1;
  87. transition: opacity 0.3s;
  88. }
  89. .fullscreen-controls.hidden {
  90. opacity: 0;
  91. pointer-events: none;
  92. }
  93. .fullscreen-top-bar {
  94. padding: 80rpx 40rpx 0;
  95. display: flex;
  96. align-items: center;
  97. justify-content: space-between;
  98. background: linear-gradient(to bottom, rgba(0, 0, 0, 0.9) 0%, rgba(0, 0, 0, 0) 100%);
  99. height: 120rpx;
  100. }
  101. .top-bar-left {
  102. display: flex;
  103. align-items: center;
  104. gap: 16rpx;
  105. padding: 16rpx 28rpx;
  106. background: rgba(0, 0, 0, 0.6);
  107. border-radius: 40rpx;
  108. backdrop-filter: blur(20rpx);
  109. border: 1rpx solid rgba(255, 255, 255, 0.1);
  110. }
  111. .back-text {
  112. color: #fff;
  113. font-size: 28rpx;
  114. font-weight: 500;
  115. text-shadow: 0 2rpx 4rpx rgba(0, 0, 0, 0.3);
  116. }
  117. .top-bar-title {
  118. font-size: 32rpx;
  119. color: #fff;
  120. max-width: 400rpx;
  121. overflow: hidden;
  122. text-overflow: ellipsis;
  123. white-space: nowrap;
  124. font-weight: 600;
  125. text-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.5);
  126. padding: 12rpx 24rpx;
  127. background: rgba(0, 0, 0, 0.5);
  128. border-radius: 20rpx;
  129. backdrop-filter: blur(10rpx);
  130. }
  131. /* 中间播放按钮 */
  132. .center-play-btn {
  133. position: absolute;
  134. top: 50%;
  135. left: 50%;
  136. transform: translate(-50%, -50%);
  137. width: 160rpx;
  138. height: 160rpx;
  139. background: rgba(0, 0, 0, 0.7);
  140. backdrop-filter: blur(30rpx);
  141. border-radius: 50%;
  142. display: flex;
  143. align-items: center;
  144. justify-content: center;
  145. border: 4rpx solid rgba(255, 255, 255, 0.3);
  146. z-index: 20;
  147. box-shadow:
  148. 0 12rpx 60rpx rgba(0, 0, 0, 0.5),
  149. inset 0 0 0 1rpx rgba(255, 255, 255, 0.1);
  150. animation: pulse 2s infinite;
  151. }
  152. @keyframes pulse {
  153. 0% {
  154. box-shadow:
  155. 0 12rpx 60rpx rgba(0, 0, 0, 0.5),
  156. inset 0 0 0 1rpx rgba(255, 255, 255, 0.1);
  157. }
  158. 50% {
  159. box-shadow:
  160. 0 12rpx 80rpx rgba(52, 152, 219, 0.4),
  161. inset 0 0 0 1rpx rgba(52, 152, 219, 0.3);
  162. }
  163. 100% {
  164. box-shadow:
  165. 0 12rpx 60rpx rgba(0, 0, 0, 0.5),
  166. inset 0 0 0 1rpx rgba(255, 255, 255, 0.1);
  167. }
  168. }
  169. .play-large-icon {
  170. width: 70rpx;
  171. height: 70rpx;
  172. margin-left: 10rpx;
  173. filter: brightness(2) drop-shadow(0 4rpx 8rpx rgba(0, 0, 0, 0.5));
  174. }
  175. .play-ripple {
  176. position: absolute;
  177. top: 50%;
  178. left: 50%;
  179. transform: translate(-50%, -50%);
  180. width: 0;
  181. height: 0;
  182. border-radius: 50%;
  183. border: 2rpx solid rgba(255, 255, 255, 0.4);
  184. animation: ripple 2s infinite;
  185. }
  186. @keyframes ripple {
  187. 0% {
  188. width: 0;
  189. height: 0;
  190. opacity: 1;
  191. }
  192. 100% {
  193. width: 240rpx;
  194. height: 240rpx;
  195. opacity: 0;
  196. }
  197. }
  198. /* 底部控制栏 */
  199. .fullscreen-bottom-bar {
  200. position: absolute;
  201. bottom: 0;
  202. left: 0;
  203. right: 0;
  204. padding: 0 40rpx 80rpx;
  205. background: linear-gradient(to top, rgba(0, 0, 0, 0.95) 0%, rgba(0, 0, 0, 0) 100%);
  206. }
  207. .fullscreen-progress {
  208. display: flex;
  209. align-items: center;
  210. gap: 24rpx;
  211. margin-bottom: 60rpx;
  212. padding: 0 20rpx;
  213. }
  214. .progress-time {
  215. font-size: 26rpx;
  216. color: rgba(255, 255, 255, 0.95);
  217. min-width: 90rpx;
  218. text-align: center;
  219. font-weight: 500;
  220. text-shadow: 0 2rpx 4rpx rgba(0, 0, 0, 0.5);
  221. }
  222. .progress-slider-container {
  223. flex: 1;
  224. position: relative;
  225. height: 8rpx;
  226. background: rgba(255, 255, 255, 0.2);
  227. border-radius: 4rpx;
  228. overflow: hidden;
  229. }
  230. .progress-bg {
  231. width: 100%;
  232. height: 100%;
  233. background: rgba(255, 255, 255, 0.1);
  234. border-radius: 4rpx;
  235. }
  236. .progress-current {
  237. height: 100%;
  238. background: linear-gradient(90deg, #3498db, #9b59b6);
  239. border-radius: 4rpx;
  240. transition: width 0.1s;
  241. }
  242. .progress-thumb {
  243. position: absolute;
  244. top: 50%;
  245. transform: translate(-50%, -50%);
  246. width: 28rpx;
  247. height: 28rpx;
  248. background: #fff;
  249. border-radius: 50%;
  250. box-shadow:
  251. 0 4rpx 12rpx rgba(0, 0, 0, 0.5),
  252. 0 0 0 2rpx #3498db;
  253. }
  254. .bottom-controls {
  255. display: flex;
  256. justify-content: center;
  257. align-items: center;
  258. gap: 80rpx;
  259. padding: 30rpx 50rpx;
  260. background: rgba(0, 0, 0, 0.7);
  261. border-radius: 80rpx;
  262. backdrop-filter: blur(30rpx);
  263. margin: 0 auto;
  264. max-width: 700rpx;
  265. border: 1rpx solid rgba(255, 255, 255, 0.1);
  266. }
  267. .control-item {
  268. width: 90rpx;
  269. height: 90rpx;
  270. display: flex;
  271. align-items: center;
  272. justify-content: center;
  273. border-radius: 50%;
  274. background: rgba(255, 255, 255, 0.1);
  275. transition: all 0.2s;
  276. box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.3);
  277. }
  278. .control-item:active {
  279. background: rgba(255, 255, 255, 0.2);
  280. transform: scale(0.9);
  281. }
  282. .control-icon {
  283. width: 44rpx;
  284. height: 44rpx;
  285. filter: brightness(2) drop-shadow(0 2rpx 4rpx rgba(0, 0, 0, 0.3));
  286. }
  287. .speed-text {
  288. color: #fff;
  289. font-size: 30rpx;
  290. font-weight: 700;
  291. background: linear-gradient(135deg, #3498db, #9b59b6);
  292. padding: 12rpx 28rpx;
  293. border-radius: 40rpx;
  294. box-shadow: 0 6rpx 24rpx rgba(52, 152, 219, 0.4);
  295. }
  296. /* 触摸控制区域 */
  297. .touch-control-left,
  298. .touch-control-center,
  299. .touch-control-right {
  300. position: absolute;
  301. top: 120rpx;
  302. bottom: 200rpx;
  303. z-index: 5;
  304. }
  305. .touch-control-left {
  306. left: 0;
  307. width: 30%;
  308. }
  309. .touch-control-center {
  310. left: 30%;
  311. width: 40%;
  312. }
  313. .touch-control-right {
  314. left: 70%;
  315. width: 30%;
  316. }
  317. /* 非全屏播放按钮 */
  318. .normal-play-btn {
  319. position: absolute;
  320. top: 50%;
  321. left: 50%;
  322. transform: translate(-50%, -50%);
  323. width: 120rpx;
  324. height: 120rpx;
  325. background: rgba(0, 0, 0, 0.7);
  326. border-radius: 50%;
  327. display: flex;
  328. align-items: center;
  329. justify-content: center;
  330. z-index: 3;
  331. border: 3rpx solid rgba(255, 255, 255, 0.3);
  332. backdrop-filter: blur(10rpx);
  333. box-shadow: 0 8rpx 32rpx rgba(0, 0, 0, 0.5);
  334. }
  335. .normal-play-btn .play-icon {
  336. width: 50rpx;
  337. height: 50rpx;
  338. margin-left: 8rpx;
  339. filter: brightness(2);
  340. }
  341. /* 视频信息区域 */
  342. .video-info-section {
  343. height: calc(100vh - 500rpx);
  344. background: linear-gradient(180deg, #1a1e2c 0%, #0f172a 100%);
  345. }
  346. .video-header {
  347. padding: 50rpx 40rpx 40rpx;
  348. border-bottom: 1rpx solid rgba(255, 255, 255, 0.08);
  349. }
  350. .video-title {
  351. font-size: 40rpx;
  352. font-weight: 800;
  353. color: #fff;
  354. line-height: 1.3;
  355. margin-bottom: 30rpx;
  356. letter-spacing: 0.5rpx;
  357. text-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.3);
  358. }
  359. .video-description {
  360. font-size: 30rpx;
  361. color: rgba(255, 255, 255, 0.85);
  362. line-height: 1.6;
  363. margin-bottom: 40rpx;
  364. }
  365. .video-stats {
  366. display: flex;
  367. gap: 30rpx;
  368. flex-wrap: wrap;
  369. }
  370. .stat-item {
  371. display: flex;
  372. align-items: center;
  373. gap: 14rpx;
  374. font-size: 26rpx;
  375. color: rgba(255, 255, 255, 0.7);
  376. padding: 14rpx 28rpx;
  377. background: rgba(255, 255, 255, 0.08);
  378. border-radius: 40rpx;
  379. backdrop-filter: blur(10rpx);
  380. }
  381. /* 发布者信息 */
  382. .publisher-section {
  383. padding: 40rpx;
  384. display: flex;
  385. align-items: center;
  386. gap: 30rpx;
  387. border-bottom: 1rpx solid rgba(255, 255, 255, 0.08);
  388. background: rgba(255, 255, 255, 0.03);
  389. margin: 0 20rpx;
  390. border-radius: 24rpx;
  391. margin-top: 20rpx;
  392. }
  393. .publisher-avatar {
  394. width: 120rpx;
  395. height: 120rpx;
  396. border-radius: 50%;
  397. border: 4rpx solid #3498db;
  398. box-shadow:
  399. 0 12rpx 40rpx rgba(52, 152, 219, 0.5),
  400. 0 0 0 1rpx rgba(255, 255, 255, 0.1);
  401. background: #1e293b;
  402. }
  403. .publisher-info {
  404. flex: 1;
  405. }
  406. .publisher-name {
  407. font-size: 36rpx;
  408. font-weight: 700;
  409. color: #fff;
  410. margin-bottom: 12rpx;
  411. text-shadow: 0 2rpx 4rpx rgba(0, 0, 0, 0.3);
  412. }
  413. .publisher-desc {
  414. font-size: 26rpx;
  415. color: rgba(255, 255, 255, 0.6);
  416. line-height: 1.4;
  417. }
  418. /* 标签区域 */
  419. .tags-section {
  420. padding: 40rpx;
  421. background: rgba(255, 255, 255, 0.03);
  422. margin: 20rpx;
  423. border-radius: 24rpx;
  424. }
  425. .section-title {
  426. font-size: 32rpx;
  427. font-weight: 700;
  428. color: #fff;
  429. margin-bottom: 30rpx;
  430. text-shadow: 0 2rpx 4rpx rgba(0, 0, 0, 0.3);
  431. }
  432. .tags-container {
  433. display: flex;
  434. flex-wrap: wrap;
  435. gap: 20rpx;
  436. }
  437. .tag-item {
  438. padding: 16rpx 36rpx;
  439. background: linear-gradient(135deg, #3498db, #2ecc71);
  440. color: white;
  441. border-radius: 40rpx;
  442. font-size: 26rpx;
  443. font-weight: 600;
  444. box-shadow: 0 6rpx 24rpx rgba(52, 152, 219, 0.4);
  445. transition: all 0.2s;
  446. }
  447. .tag-item:active {
  448. transform: scale(0.95);
  449. box-shadow: 0 4rpx 16rpx rgba(52, 152, 219, 0.3);
  450. }
  451. /* 加载中 */
  452. .loading-container {
  453. position: fixed;
  454. top: 0;
  455. left: 0;
  456. right: 0;
  457. bottom: 0;
  458. background: linear-gradient(135deg, #0f172a 0%, #1a1e2c 100%);
  459. display: flex;
  460. flex-direction: column;
  461. align-items: center;
  462. justify-content: center;
  463. z-index: 2000;
  464. }
  465. .loading-spinner {
  466. position: relative;
  467. width: 140rpx;
  468. height: 140rpx;
  469. margin-bottom: 50rpx;
  470. }
  471. .spinner-circle {
  472. position: absolute;
  473. top: 50%;
  474. left: 50%;
  475. transform: translate(-50%, -50%);
  476. width: 100%;
  477. height: 100%;
  478. border: 10rpx solid transparent;
  479. border-top-color: #3498db;
  480. border-right-color: #3498db;
  481. border-radius: 50%;
  482. animation: spinnerRotate 1.2s linear infinite;
  483. box-shadow: 0 0 20rpx rgba(52, 152, 219, 0.3);
  484. }
  485. @keyframes spinnerRotate {
  486. 0% {
  487. transform: translate(-50%, -50%) rotate(0deg);
  488. }
  489. 100% {
  490. transform: translate(-50%, -50%) rotate(360deg);
  491. }
  492. }
  493. .loading-text {
  494. font-size: 32rpx;
  495. color: rgba(255, 255, 255, 0.8);
  496. letter-spacing: 3rpx;
  497. font-weight: 500;
  498. text-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.3);
  499. }
  500. /* 错误提示 */
  501. .error-container {
  502. position: fixed;
  503. top: 50%;
  504. left: 50%;
  505. transform: translate(-50%, -50%);
  506. display: flex;
  507. flex-direction: column;
  508. align-items: center;
  509. justify-content: center;
  510. z-index: 2000;
  511. background: linear-gradient(135deg, rgba(15, 23, 42, 0.95), rgba(26, 30, 44, 0.95));
  512. padding: 80rpx 60rpx;
  513. border-radius: 40rpx;
  514. backdrop-filter: blur(40rpx);
  515. border: 1rpx solid rgba(255, 255, 255, 0.1);
  516. min-width: 500rpx;
  517. box-shadow:
  518. 0 20rpx 80rpx rgba(0, 0, 0, 0.5),
  519. inset 0 1rpx 0 rgba(255, 255, 255, 0.1);
  520. }
  521. .error-icon {
  522. width: 140rpx;
  523. height: 140rpx;
  524. margin-bottom: 40rpx;
  525. filter: brightness(1.5) drop-shadow(0 4rpx 12rpx rgba(0, 0, 0, 0.3));
  526. }
  527. .error-text {
  528. font-size: 36rpx;
  529. color: #fff;
  530. margin-bottom: 50rpx;
  531. font-weight: 700;
  532. text-align: center;
  533. text-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.3);
  534. }
  535. .retry-btn {
  536. padding: 24rpx 80rpx;
  537. background: linear-gradient(135deg, #3498db, #2980b9);
  538. color: white;
  539. border-radius: 50rpx;
  540. font-size: 32rpx;
  541. font-weight: 700;
  542. box-shadow:
  543. 0 12rpx 40rpx rgba(52, 152, 219, 0.5),
  544. inset 0 1rpx 0 rgba(255, 255, 255, 0.3);
  545. transition: all 0.2s;
  546. letter-spacing: 2rpx;
  547. }
  548. .retry-btn:active {
  549. transform: scale(0.95);
  550. box-shadow:
  551. 0 6rpx 24rpx rgba(52, 152, 219, 0.4),
  552. inset 0 1rpx 0 rgba(255, 255, 255, 0.2);
  553. }
  554. /* 响应式调整 */
  555. @media screen and (max-width: 750rpx) {
  556. .video-player-section {
  557. height: 450rpx;
  558. }
  559. .video-info-section {
  560. height: calc(100vh - 450rpx);
  561. }
  562. .video-title {
  563. font-size: 36rpx;
  564. }
  565. .video-description {
  566. font-size: 28rpx;
  567. }
  568. .bottom-controls {
  569. gap: 60rpx;
  570. padding: 25rpx 40rpx;
  571. max-width: 650rpx;
  572. }
  573. .center-play-btn {
  574. width: 140rpx;
  575. height: 140rpx;
  576. }
  577. .play-large-icon {
  578. width: 60rpx;
  579. height: 60rpx;
  580. }
  581. .fullscreen-top-bar {
  582. padding: 60rpx 30rpx 0;
  583. }
  584. .fullscreen-bottom-bar {
  585. padding: 0 30rpx 60rpx;
  586. }
  587. }