与牧同行-小程序用户端
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.

1066 lines
20 KiB

  1. /* pages/training/training.wxss */
  2. .training-container {
  3. min-height: 100vh;
  4. background: linear-gradient(135deg, #f8fafc 0%, #e2e8f0 100%);
  5. padding: 20rpx 30rpx 100rpx;
  6. position: relative;
  7. overflow-x: hidden;
  8. }
  9. /* 头部样式优化 */
  10. .header {
  11. text-align: center;
  12. margin-bottom: 50rpx;
  13. padding-top: 60rpx;
  14. position: relative;
  15. z-index: 1;
  16. }
  17. .title {
  18. font-size: 56rpx;
  19. font-weight: 800;
  20. color: transparent;
  21. background: linear-gradient(45deg, #3498db, #2ecc71, #3498db);
  22. background-size: 200% auto;
  23. -webkit-background-clip: text;
  24. background-clip: text;
  25. margin-bottom: 20rpx;
  26. letter-spacing: 1rpx;
  27. position: relative;
  28. display: inline-block;
  29. animation: gradientText 3s ease infinite;
  30. }
  31. @keyframes gradientText {
  32. 0%,
  33. 100% {
  34. background-position: 0% center;
  35. }
  36. 50% {
  37. background-position: 100% center;
  38. }
  39. }
  40. .title::after {
  41. content: '';
  42. position: absolute;
  43. bottom: -8rpx;
  44. left: 50%;
  45. transform: translateX(-50%);
  46. width: 80rpx;
  47. height: 4rpx;
  48. background: linear-gradient(45deg, #3498db, #2ecc71);
  49. border-radius: 2rpx;
  50. }
  51. .subtitle {
  52. font-size: 28rpx;
  53. color: #64748b;
  54. letter-spacing: 2rpx;
  55. font-weight: 400;
  56. opacity: 0.9;
  57. position: relative;
  58. padding-top: 10rpx;
  59. }
  60. .header-decoration {
  61. position: absolute;
  62. top: 0;
  63. left: 0;
  64. right: 0;
  65. bottom: 0;
  66. pointer-events: none;
  67. z-index: -1;
  68. }
  69. .decoration-circle {
  70. position: absolute;
  71. border-radius: 50%;
  72. background: linear-gradient(45deg, rgba(52, 152, 219, 0.1), rgba(46, 204, 113, 0.1));
  73. animation: float 6s ease-in-out infinite;
  74. }
  75. .circle-1 {
  76. width: 120rpx;
  77. height: 120rpx;
  78. top: 20rpx;
  79. left: 10%;
  80. animation-delay: 0s;
  81. }
  82. .circle-2 {
  83. width: 80rpx;
  84. height: 80rpx;
  85. top: 60rpx;
  86. right: 15%;
  87. animation-delay: 2s;
  88. }
  89. .circle-3 {
  90. width: 60rpx;
  91. height: 60rpx;
  92. top: 100rpx;
  93. left: 20%;
  94. animation-delay: 4s;
  95. }
  96. @keyframes float {
  97. 0%,
  98. 100% {
  99. transform: translateY(0) scale(1);
  100. }
  101. 50% {
  102. transform: translateY(-20rpx) scale(1.05);
  103. }
  104. }
  105. /* 主选项卡样式优化 - 去除图标,优化切换样式 */
  106. .tabs {
  107. display: flex;
  108. background: rgba(255, 255, 255, 0.95);
  109. backdrop-filter: blur(10rpx);
  110. border-radius: 18rpx;
  111. margin-bottom: 50rpx;
  112. box-shadow:
  113. 0 8rpx 30rpx rgba(0, 0, 0, 0.08),
  114. inset 0 1rpx 0 rgba(255, 255, 255, 0.9);
  115. border: 1rpx solid rgba(226, 232, 240, 0.8);
  116. position: relative;
  117. overflow: hidden;
  118. z-index: 1;
  119. padding: 6rpx;
  120. height: 88rpx;
  121. }
  122. .tab-item {
  123. flex: 1;
  124. text-align: center;
  125. font-size: 32rpx;
  126. color: #64748b;
  127. position: relative;
  128. transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
  129. font-weight: 500;
  130. display: flex;
  131. align-items: center;
  132. justify-content: center;
  133. height: 100%;
  134. border-radius: 12rpx;
  135. z-index: 2;
  136. letter-spacing: 1rpx;
  137. }
  138. .tab-item.active {
  139. color: #ffffff;
  140. font-weight: 600;
  141. text-shadow: 0 1rpx 2rpx rgba(0, 0, 0, 0.1);
  142. }
  143. .tab-slider {
  144. position: absolute;
  145. top: 6rpx;
  146. width: calc(50% - 6rpx);
  147. height: calc(100% - 12rpx);
  148. background: linear-gradient(135deg, #3498db, #2ecc71);
  149. border-radius: 12rpx;
  150. transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
  151. box-shadow:
  152. 0 4rpx 20rpx rgba(52, 152, 219, 0.25),
  153. 0 2rpx 8rpx rgba(52, 152, 219, 0.15);
  154. z-index: 1;
  155. }
  156. .tab-slider.left {
  157. left: 6rpx;
  158. transform: translateX(0);
  159. }
  160. .tab-slider.right {
  161. left: 6rpx;
  162. transform: translateX(100%);
  163. }
  164. .tab-highlight {
  165. position: absolute;
  166. bottom: -6rpx;
  167. left: 50%;
  168. transform: translateX(-50%);
  169. width: 24rpx;
  170. height: 4rpx;
  171. background: linear-gradient(135deg, #3498db, #2ecc71);
  172. border-radius: 2rpx;
  173. opacity: 0;
  174. transition: all 0.3s ease;
  175. box-shadow: 0 2rpx 6rpx rgba(52, 152, 219, 0.3);
  176. }
  177. .tab-item.active .tab-highlight {
  178. opacity: 1;
  179. animation: highlightPulse 2s ease infinite;
  180. }
  181. @keyframes highlightPulse {
  182. 0%,
  183. 100% {
  184. box-shadow: 0 2rpx 6rpx rgba(52, 152, 219, 0.3);
  185. transform: translateX(-50%) scale(1);
  186. }
  187. 50% {
  188. box-shadow: 0 2rpx 12rpx rgba(52, 152, 219, 0.5);
  189. transform: translateX(-50%) scale(1.1);
  190. }
  191. }
  192. /* 内容区域 */
  193. .content-section {
  194. animation: slideUp 0.6s cubic-bezier(0.4, 0, 0.2, 1);
  195. }
  196. @keyframes slideUp {
  197. from {
  198. opacity: 0;
  199. transform: translateY(40rpx);
  200. }
  201. to {
  202. opacity: 1;
  203. transform: translateY(0);
  204. }
  205. }
  206. /* 搜索框样式优化 */
  207. .search-box {
  208. position: relative;
  209. margin-bottom: 50rpx;
  210. animation: slideIn 0.8s ease;
  211. }
  212. @keyframes slideIn {
  213. from {
  214. opacity: 0;
  215. transform: translateX(-30rpx);
  216. }
  217. to {
  218. opacity: 1;
  219. transform: translateX(0);
  220. }
  221. }
  222. .search-input {
  223. background: rgba(255, 255, 255, 0.95);
  224. backdrop-filter: blur(10rpx);
  225. border-radius: 25rpx;
  226. padding: 20rpx 40rpx 20rpx 100rpx;
  227. font-size: 28rpx;
  228. box-shadow:
  229. 0 8rpx 30rpx rgba(0, 0, 0, 0.08),
  230. inset 0 1rpx 0 rgba(255, 255, 255, 0.8);
  231. border: 1rpx solid rgba(255, 255, 255, 0.5);
  232. transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
  233. position: relative;
  234. z-index: 2;
  235. }
  236. .search-input:focus {
  237. border-color: rgba(52, 152, 219, 0.3);
  238. box-shadow:
  239. 0 12rpx 40rpx rgba(52, 152, 219, 0.15),
  240. inset 0 1rpx 0 rgba(255, 255, 255, 0.8);
  241. transform: translateY(-2rpx);
  242. }
  243. .search-icon {
  244. position: absolute;
  245. left: 40rpx;
  246. top: 50%;
  247. transform: translateY(-50%);
  248. width: 36rpx;
  249. height: 36rpx;
  250. z-index: 3;
  251. transition: all 0.3s ease;
  252. }
  253. .search-input:focus+.search-decoration .search-wave,
  254. .search-input:focus .search-icon {
  255. animation: pulse 2s ease infinite;
  256. }
  257. .search-decoration {
  258. position: absolute;
  259. top: 0;
  260. left: 0;
  261. right: 0;
  262. bottom: 0;
  263. border-radius: 25rpx;
  264. overflow: hidden;
  265. z-index: 1;
  266. }
  267. .search-wave {
  268. position: absolute;
  269. top: 0;
  270. left: -100%;
  271. width: 200%;
  272. height: 100%;
  273. background: linear-gradient(90deg,
  274. transparent,
  275. rgba(52, 152, 219, 0.1),
  276. transparent);
  277. animation: waveFlow 3s ease-in-out infinite;
  278. }
  279. @keyframes waveFlow {
  280. 0% {
  281. transform: translateX(0);
  282. }
  283. 100% {
  284. transform: translateX(50%);
  285. }
  286. }
  287. @keyframes pulse {
  288. 0%,
  289. 100% {
  290. transform: translateY(-50%) scale(1);
  291. opacity: 1;
  292. }
  293. 50% {
  294. transform: translateY(-50%) scale(1.1);
  295. opacity: 0.8;
  296. }
  297. }
  298. .placeholder-style {
  299. color: #94a3b8;
  300. font-size: 28rpx;
  301. }
  302. /* 分类筛选样式优化 - 去除图标 */
  303. .category-scroll {
  304. white-space: nowrap;
  305. margin-bottom: 50rpx;
  306. padding: 0 10rpx;
  307. }
  308. .category-list {
  309. display: inline-flex;
  310. padding: 0 20rpx 20rpx;
  311. gap: 20rpx;
  312. }
  313. .category-item {
  314. display: inline-flex;
  315. align-items: center;
  316. justify-content: center;
  317. padding: 20rpx 36rpx;
  318. background: rgba(255, 255, 255, 0.9);
  319. backdrop-filter: blur(10rpx);
  320. border-radius: 25rpx;
  321. font-size: 28rpx;
  322. color: #64748b;
  323. box-shadow:
  324. 0 4rpx 15rpx rgba(0, 0, 0, 0.05),
  325. inset 0 1rpx 0 rgba(255, 255, 255, 0.8);
  326. border: 1rpx solid rgba(255, 255, 255, 0.3);
  327. transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
  328. position: relative;
  329. overflow: hidden;
  330. white-space: nowrap;
  331. font-weight: 500;
  332. min-width: 120rpx;
  333. }
  334. .category-item:active {
  335. transform: scale(0.96);
  336. }
  337. .category-item.active {
  338. background: linear-gradient(135deg, #3498db, #2ecc71);
  339. color: white;
  340. box-shadow:
  341. 0 8rpx 25rpx rgba(52, 152, 219, 0.25),
  342. inset 0 1rpx 0 rgba(255, 255, 255, 0.3);
  343. border-color: transparent;
  344. font-weight: 600;
  345. animation: categoryPulse 2s ease infinite;
  346. }
  347. @keyframes categoryPulse {
  348. 0%,
  349. 100% {
  350. box-shadow:
  351. 0 8rpx 25rpx rgba(52, 152, 219, 0.25),
  352. inset 0 1rpx 0 rgba(255, 255, 255, 0.3);
  353. }
  354. 50% {
  355. box-shadow:
  356. 0 12rpx 35rpx rgba(52, 152, 219, 0.4),
  357. inset 0 1rpx 0 rgba(255, 255, 255, 0.3);
  358. }
  359. }
  360. .category-indicator {
  361. position: absolute;
  362. bottom: 8rpx;
  363. left: 50%;
  364. transform: translateX(-50%);
  365. width: 6rpx;
  366. height: 6rpx;
  367. background: white;
  368. border-radius: 50%;
  369. opacity: 0;
  370. transition: all 0.3s ease;
  371. }
  372. .category-item.active .category-indicator {
  373. opacity: 1;
  374. animation: indicatorBounce 1s ease infinite;
  375. }
  376. @keyframes indicatorBounce {
  377. 0%,
  378. 100% {
  379. transform: translateX(-50%) translateY(0);
  380. }
  381. 50% {
  382. transform: translateX(-50%) translateY(-4rpx);
  383. }
  384. }
  385. /* 文章列表样式优化 */
  386. .articles-list {
  387. margin-top: 10rpx;
  388. }
  389. .article-card {
  390. background: rgba(255, 255, 255, 0.95);
  391. backdrop-filter: blur(10rpx);
  392. border-radius: 25rpx;
  393. margin-bottom: 35rpx;
  394. overflow: hidden;
  395. box-shadow:
  396. 0 10rpx 35rpx rgba(0, 0, 0, 0.08),
  397. inset 0 1rpx 0 rgba(255, 255, 255, 0.8);
  398. border: 1rpx solid rgba(255, 255, 255, 0.5);
  399. transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
  400. position: relative;
  401. opacity: 0;
  402. transform: translateY(30rpx);
  403. animation: cardAppear 0.6s ease forwards;
  404. }
  405. @keyframes cardAppear {
  406. to {
  407. opacity: 1;
  408. transform: translateY(0);
  409. }
  410. }
  411. .article-card:nth-child(1) {
  412. animation-delay: 0.1s;
  413. }
  414. .article-card:nth-child(2) {
  415. animation-delay: 0.2s;
  416. }
  417. .article-card:nth-child(3) {
  418. animation-delay: 0.3s;
  419. }
  420. .article-card:nth-child(4) {
  421. animation-delay: 0.4s;
  422. }
  423. .article-card:nth-child(5) {
  424. animation-delay: 0.5s;
  425. }
  426. .article-card:active {
  427. transform: translateY(-8rpx);
  428. box-shadow:
  429. 0 20rpx 50rpx rgba(0, 0, 0, 0.15),
  430. inset 0 1rpx 0 rgba(255, 255, 255, 0.8);
  431. }
  432. .article-card::before {
  433. content: '';
  434. position: absolute;
  435. top: 0;
  436. left: 0;
  437. right: 0;
  438. height: 4rpx;
  439. background: linear-gradient(45deg, #3498db, #2ecc71);
  440. opacity: 0;
  441. transition: opacity 0.4s ease;
  442. z-index: 2;
  443. }
  444. .article-card:active::before {
  445. opacity: 1;
  446. }
  447. .article-cover-container {
  448. position: relative;
  449. height: 320rpx;
  450. overflow: hidden;
  451. border-radius: 25rpx 25rpx 0 0;
  452. }
  453. .article-cover {
  454. width: 100%;
  455. height: 100%;
  456. transition: transform 0.8s cubic-bezier(0.4, 0, 0.2, 1);
  457. }
  458. .article-card:active .article-cover {
  459. transform: scale(1.08);
  460. }
  461. .cover-overlay {
  462. position: absolute;
  463. top: 0;
  464. left: 0;
  465. right: 0;
  466. bottom: 0;
  467. background: linear-gradient(to bottom, transparent 50%, rgba(0, 0, 0, 0.3));
  468. }
  469. .category-tag {
  470. position: absolute;
  471. top: 25rpx;
  472. right: 25rpx;
  473. background: rgba(52, 152, 219, 0.95);
  474. backdrop-filter: blur(10rpx);
  475. color: white;
  476. padding: 10rpx 25rpx;
  477. border-radius: 20rpx;
  478. font-size: 22rpx;
  479. font-weight: 600;
  480. box-shadow: 0 4rpx 15rpx rgba(0, 0, 0, 0.2);
  481. z-index: 2;
  482. }
  483. .article-hover-effect {
  484. position: absolute;
  485. top: 0;
  486. left: 0;
  487. right: 0;
  488. bottom: 0;
  489. background: linear-gradient(45deg, transparent, rgba(52, 152, 219, 0.1), transparent);
  490. opacity: 0;
  491. transition: opacity 0.4s ease;
  492. }
  493. .article-card:active .article-hover-effect {
  494. opacity: 1;
  495. }
  496. .article-info {
  497. padding: 35rpx;
  498. }
  499. .article-title {
  500. font-size: 34rpx;
  501. font-weight: 700;
  502. color: #1e293b;
  503. margin-bottom: 20rpx;
  504. line-height: 1.4;
  505. letter-spacing: 0.5rpx;
  506. display: -webkit-box;
  507. -webkit-box-orient: vertical;
  508. -webkit-line-clamp: 2;
  509. overflow: hidden;
  510. transition: color 0.3s ease;
  511. }
  512. .article-card:active .article-title {
  513. color: #3498db;
  514. }
  515. .article-desc {
  516. font-size: 26rpx;
  517. color: #64748b;
  518. line-height: 1.6;
  519. margin-bottom: 25rpx;
  520. display: -webkit-box;
  521. -webkit-box-orient: vertical;
  522. -webkit-line-clamp: 2;
  523. overflow: hidden;
  524. }
  525. .article-meta {
  526. display: flex;
  527. justify-content: space-between;
  528. margin-bottom: 25rpx;
  529. padding-bottom: 25rpx;
  530. border-bottom: 1rpx solid rgba(226, 232, 240, 0.8);
  531. }
  532. .meta-item {
  533. display: flex;
  534. align-items: center;
  535. gap: 10rpx;
  536. }
  537. .meta-icon {
  538. width: 30rpx;
  539. height: 30rpx;
  540. transition: all 0.3s ease;
  541. border-radius: 50%;
  542. }
  543. .meta-item:active .meta-icon {
  544. opacity: 1;
  545. transform: scale(1.1);
  546. }
  547. .meta-text {
  548. font-size: 24rpx;
  549. color: #94a3b8;
  550. font-weight: 400;
  551. }
  552. .article-stats {
  553. display: flex;
  554. justify-content: flex-end;
  555. align-items: center;
  556. }
  557. .stat-item {
  558. display: flex;
  559. align-items: center;
  560. gap: 10rpx;
  561. font-size: 24rpx;
  562. color: #64748b;
  563. font-weight: 500;
  564. }
  565. .stat-icon {
  566. width: 28rpx;
  567. height: 28rpx;
  568. opacity: 0.7;
  569. transition: all 0.3s ease;
  570. }
  571. .stat-item:active .stat-icon {
  572. opacity: 1;
  573. transform: scale(1.1);
  574. }
  575. /* 视频列表样式优化 */
  576. .videos-grid {
  577. display: grid;
  578. grid-template-columns: repeat(2, 1fr);
  579. gap: 35rpx;
  580. margin-top: 20rpx;
  581. }
  582. .video-card {
  583. background: rgba(255, 255, 255, 0.95);
  584. backdrop-filter: blur(10rpx);
  585. border-radius: 25rpx;
  586. overflow: hidden;
  587. box-shadow:
  588. 0 10rpx 35rpx rgba(0, 0, 0, 0.08),
  589. inset 0 1rpx 0 rgba(255, 255, 255, 0.8);
  590. border: 1rpx solid rgba(255, 255, 255, 0.5);
  591. transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
  592. position: relative;
  593. opacity: 0;
  594. transform: scale(0.9);
  595. animation: videoCardAppear 0.6s ease forwards;
  596. }
  597. @keyframes videoCardAppear {
  598. to {
  599. opacity: 1;
  600. transform: scale(1);
  601. }
  602. }
  603. .video-card:nth-child(1) {
  604. animation-delay: 0.1s;
  605. }
  606. .video-card:nth-child(2) {
  607. animation-delay: 0.2s;
  608. }
  609. .video-card:nth-child(3) {
  610. animation-delay: 0.3s;
  611. }
  612. .video-card:nth-child(4) {
  613. animation-delay: 0.4s;
  614. }
  615. .video-card:nth-child(5) {
  616. animation-delay: 0.5s;
  617. }
  618. .video-card:nth-child(6) {
  619. animation-delay: 0.6s;
  620. }
  621. .video-card:active {
  622. transform: scale(0.95);
  623. box-shadow:
  624. 0 20rpx 50rpx rgba(0, 0, 0, 0.15),
  625. inset 0 1rpx 0 rgba(255, 255, 255, 0.8);
  626. }
  627. .video-card::before {
  628. content: '';
  629. position: absolute;
  630. top: 0;
  631. left: 0;
  632. right: 0;
  633. height: 4rpx;
  634. background: linear-gradient(45deg, #3498db, #2ecc71);
  635. opacity: 0;
  636. transition: opacity 0.4s ease;
  637. z-index: 2;
  638. }
  639. .video-card:active::before {
  640. opacity: 1;
  641. }
  642. .video-cover-container {
  643. position: relative;
  644. height: 280rpx;
  645. overflow: hidden;
  646. border-radius: 25rpx 25rpx 0 0;
  647. }
  648. .video-cover {
  649. width: 100%;
  650. height: 100%;
  651. transition: transform 0.8s cubic-bezier(0.4, 0, 0.2, 1);
  652. }
  653. .video-card:active .video-cover {
  654. transform: scale(1.08);
  655. }
  656. .video-duration {
  657. position: absolute;
  658. bottom: 15rpx;
  659. right: 15rpx;
  660. background: rgba(0, 0, 0, 0.9);
  661. backdrop-filter: blur(10rpx);
  662. color: white;
  663. padding: 8rpx 18rpx;
  664. border-radius: 15rpx;
  665. font-size: 22rpx;
  666. font-weight: 600;
  667. z-index: 2;
  668. }
  669. .play-button {
  670. position: absolute;
  671. top: 50%;
  672. left: 50%;
  673. transform: translate(-50%, -50%);
  674. width: 80rpx;
  675. height: 80rpx;
  676. background: rgba(255, 255, 255, 0.95);
  677. backdrop-filter: blur(10rpx);
  678. border-radius: 50%;
  679. display: flex;
  680. align-items: center;
  681. justify-content: center;
  682. box-shadow:
  683. 0 10rpx 30rpx rgba(0, 0, 0, 0.3),
  684. inset 0 1rpx 0 rgba(255, 255, 255, 0.8);
  685. z-index: 2;
  686. transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
  687. }
  688. .video-card:active .play-button {
  689. transform: translate(-50%, -50%) scale(1.1);
  690. box-shadow:
  691. 0 15rpx 40rpx rgba(0, 0, 0, 0.4),
  692. inset 0 1rpx 0 rgba(255, 255, 255, 0.8);
  693. }
  694. .play-icon {
  695. width: 30rpx;
  696. height: 30rpx;
  697. margin-left: 4rpx;
  698. transition: transform 0.3s ease;
  699. }
  700. .video-card:active .play-icon {
  701. transform: scale(1.1);
  702. }
  703. .play-ripple {
  704. position: absolute;
  705. top: 50%;
  706. left: 50%;
  707. transform: translate(-50%, -50%);
  708. width: 0;
  709. height: 0;
  710. border-radius: 50%;
  711. background: rgba(255, 255, 255, 0.3);
  712. transition: all 0.6s ease;
  713. }
  714. .video-card:active .play-ripple {
  715. width: 120rpx;
  716. height: 120rpx;
  717. animation: playRipple 0.8s ease-out;
  718. }
  719. @keyframes playRipple {
  720. from {
  721. opacity: 1;
  722. transform: translate(-50%, -50%) scale(0);
  723. }
  724. to {
  725. opacity: 0;
  726. transform: translate(-50%, -50%) scale(1);
  727. }
  728. }
  729. .video-hover-effect {
  730. position: absolute;
  731. top: 0;
  732. left: 0;
  733. right: 0;
  734. bottom: 0;
  735. background: linear-gradient(45deg, transparent, rgba(52, 152, 219, 0.1), transparent);
  736. opacity: 0;
  737. transition: opacity 0.4s ease;
  738. }
  739. .video-card:active .video-hover-effect {
  740. opacity: 1;
  741. }
  742. .video-info {
  743. padding: 25rpx;
  744. }
  745. .video-title {
  746. font-size: 28rpx;
  747. font-weight: 700;
  748. color: #1e293b;
  749. margin-bottom: 20rpx;
  750. line-height: 1.4;
  751. display: -webkit-box;
  752. -webkit-box-orient: vertical;
  753. -webkit-line-clamp: 2;
  754. overflow: hidden;
  755. letter-spacing: 0.5rpx;
  756. }
  757. .video-instructor {
  758. display: flex;
  759. align-items: center;
  760. margin-bottom: 20rpx;
  761. gap: 12rpx;
  762. }
  763. .instructor-avatar {
  764. width: 40rpx;
  765. height: 40rpx;
  766. border-radius: 50%;
  767. border: 2rpx solid rgba(52, 152, 219, 0.3);
  768. box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.1);
  769. transition: all 0.3s ease;
  770. }
  771. .video-card:active .instructor-avatar {
  772. border-color: #3498db;
  773. transform: scale(1.05);
  774. }
  775. .instructor-name {
  776. font-size: 24rpx;
  777. color: #64748b;
  778. font-weight: 500;
  779. }
  780. .video-meta {
  781. display: flex;
  782. justify-content: space-between;
  783. align-items: center;
  784. }
  785. .video-meta-item {
  786. display: flex;
  787. align-items: center;
  788. gap: 8rpx;
  789. font-size: 22rpx;
  790. color: #94a3b8;
  791. }
  792. .video-meta-item image {
  793. width: 22rpx;
  794. height: 22rpx;
  795. opacity: 0.6;
  796. transition: all 0.3s ease;
  797. }
  798. .video-meta-item:active image {
  799. opacity: 1;
  800. transform: scale(1.1);
  801. }
  802. /* 空状态样式优化 */
  803. .empty-state {
  804. display: flex;
  805. flex-direction: column;
  806. align-items: center;
  807. justify-content: center;
  808. padding: 150rpx 0;
  809. text-align: center;
  810. position: relative;
  811. }
  812. .empty-animation {
  813. position: absolute;
  814. top: 50%;
  815. left: 50%;
  816. transform: translate(-50%, -50%);
  817. width: 300rpx;
  818. height: 300rpx;
  819. }
  820. .empty-circle {
  821. position: absolute;
  822. top: 50%;
  823. left: 50%;
  824. transform: translate(-50%, -50%);
  825. width: 100rpx;
  826. height: 100rpx;
  827. border: 8rpx solid rgba(52, 152, 219, 0.1);
  828. border-radius: 50%;
  829. animation: emptyFloat 4s ease-in-out infinite;
  830. }
  831. .empty-circle.circle-2 {
  832. width: 150rpx;
  833. height: 150rpx;
  834. border-width: 6rpx;
  835. animation-delay: 1s;
  836. }
  837. .empty-circle.circle-3 {
  838. width: 200rpx;
  839. height: 200rpx;
  840. border-width: 4rpx;
  841. animation-delay: 2s;
  842. }
  843. @keyframes emptyFloat {
  844. 0%,
  845. 100% {
  846. transform: translate(-50%, -50%) scale(1);
  847. opacity: 0.3;
  848. }
  849. 50% {
  850. transform: translate(-50%, -50%) scale(1.1);
  851. opacity: 0.1;
  852. }
  853. }
  854. .empty-text {
  855. font-size: 32rpx;
  856. color: #64748b;
  857. font-weight: 600;
  858. margin-bottom: 15rpx;
  859. letter-spacing: 1rpx;
  860. position: relative;
  861. z-index: 1;
  862. }
  863. .empty-hint {
  864. font-size: 26rpx;
  865. color: #94a3b8;
  866. position: relative;
  867. z-index: 1;
  868. }
  869. /* 响应式调整 */
  870. @media screen and (max-width: 750rpx) {
  871. .videos-grid {
  872. grid-template-columns: 1fr;
  873. }
  874. .articles-list {
  875. padding: 0 10rpx;
  876. }
  877. .category-item {
  878. font-size: 26rpx;
  879. padding: 18rpx 28rpx;
  880. min-width: 110rpx;
  881. }
  882. .header {
  883. padding-top: 40rpx;
  884. }
  885. .title {
  886. font-size: 48rpx;
  887. }
  888. .tabs {
  889. height: 80rpx;
  890. }
  891. .tab-item {
  892. font-size: 30rpx;
  893. }
  894. }
  895. /* 加载动画优化 */
  896. @keyframes pulse {
  897. 0%,
  898. 100% {
  899. opacity: 1;
  900. transform: scale(1);
  901. }
  902. 50% {
  903. opacity: 0.7;
  904. transform: scale(0.95);
  905. }
  906. }
  907. .loading {
  908. animation: pulse 1.5s ease-in-out infinite;
  909. }
  910. /* 滚动条样式 */
  911. ::-webkit-scrollbar {
  912. width: 0;
  913. height: 0;
  914. color: transparent;
  915. }