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

1065 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. }
  542. .meta-item:active .meta-icon {
  543. opacity: 1;
  544. transform: scale(1.1);
  545. }
  546. .meta-text {
  547. font-size: 24rpx;
  548. color: #94a3b8;
  549. font-weight: 400;
  550. }
  551. .article-stats {
  552. display: flex;
  553. justify-content: flex-end;
  554. align-items: center;
  555. }
  556. .stat-item {
  557. display: flex;
  558. align-items: center;
  559. gap: 10rpx;
  560. font-size: 24rpx;
  561. color: #64748b;
  562. font-weight: 500;
  563. }
  564. .stat-icon {
  565. width: 28rpx;
  566. height: 28rpx;
  567. opacity: 0.7;
  568. transition: all 0.3s ease;
  569. }
  570. .stat-item:active .stat-icon {
  571. opacity: 1;
  572. transform: scale(1.1);
  573. }
  574. /* 视频列表样式优化 */
  575. .videos-grid {
  576. display: grid;
  577. grid-template-columns: repeat(2, 1fr);
  578. gap: 35rpx;
  579. margin-top: 20rpx;
  580. }
  581. .video-card {
  582. background: rgba(255, 255, 255, 0.95);
  583. backdrop-filter: blur(10rpx);
  584. border-radius: 25rpx;
  585. overflow: hidden;
  586. box-shadow:
  587. 0 10rpx 35rpx rgba(0, 0, 0, 0.08),
  588. inset 0 1rpx 0 rgba(255, 255, 255, 0.8);
  589. border: 1rpx solid rgba(255, 255, 255, 0.5);
  590. transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
  591. position: relative;
  592. opacity: 0;
  593. transform: scale(0.9);
  594. animation: videoCardAppear 0.6s ease forwards;
  595. }
  596. @keyframes videoCardAppear {
  597. to {
  598. opacity: 1;
  599. transform: scale(1);
  600. }
  601. }
  602. .video-card:nth-child(1) {
  603. animation-delay: 0.1s;
  604. }
  605. .video-card:nth-child(2) {
  606. animation-delay: 0.2s;
  607. }
  608. .video-card:nth-child(3) {
  609. animation-delay: 0.3s;
  610. }
  611. .video-card:nth-child(4) {
  612. animation-delay: 0.4s;
  613. }
  614. .video-card:nth-child(5) {
  615. animation-delay: 0.5s;
  616. }
  617. .video-card:nth-child(6) {
  618. animation-delay: 0.6s;
  619. }
  620. .video-card:active {
  621. transform: scale(0.95);
  622. box-shadow:
  623. 0 20rpx 50rpx rgba(0, 0, 0, 0.15),
  624. inset 0 1rpx 0 rgba(255, 255, 255, 0.8);
  625. }
  626. .video-card::before {
  627. content: '';
  628. position: absolute;
  629. top: 0;
  630. left: 0;
  631. right: 0;
  632. height: 4rpx;
  633. background: linear-gradient(45deg, #3498db, #2ecc71);
  634. opacity: 0;
  635. transition: opacity 0.4s ease;
  636. z-index: 2;
  637. }
  638. .video-card:active::before {
  639. opacity: 1;
  640. }
  641. .video-cover-container {
  642. position: relative;
  643. height: 280rpx;
  644. overflow: hidden;
  645. border-radius: 25rpx 25rpx 0 0;
  646. }
  647. .video-cover {
  648. width: 100%;
  649. height: 100%;
  650. transition: transform 0.8s cubic-bezier(0.4, 0, 0.2, 1);
  651. }
  652. .video-card:active .video-cover {
  653. transform: scale(1.08);
  654. }
  655. .video-duration {
  656. position: absolute;
  657. bottom: 15rpx;
  658. right: 15rpx;
  659. background: rgba(0, 0, 0, 0.9);
  660. backdrop-filter: blur(10rpx);
  661. color: white;
  662. padding: 8rpx 18rpx;
  663. border-radius: 15rpx;
  664. font-size: 22rpx;
  665. font-weight: 600;
  666. z-index: 2;
  667. }
  668. .play-button {
  669. position: absolute;
  670. top: 50%;
  671. left: 50%;
  672. transform: translate(-50%, -50%);
  673. width: 80rpx;
  674. height: 80rpx;
  675. background: rgba(255, 255, 255, 0.95);
  676. backdrop-filter: blur(10rpx);
  677. border-radius: 50%;
  678. display: flex;
  679. align-items: center;
  680. justify-content: center;
  681. box-shadow:
  682. 0 10rpx 30rpx rgba(0, 0, 0, 0.3),
  683. inset 0 1rpx 0 rgba(255, 255, 255, 0.8);
  684. z-index: 2;
  685. transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
  686. }
  687. .video-card:active .play-button {
  688. transform: translate(-50%, -50%) scale(1.1);
  689. box-shadow:
  690. 0 15rpx 40rpx rgba(0, 0, 0, 0.4),
  691. inset 0 1rpx 0 rgba(255, 255, 255, 0.8);
  692. }
  693. .play-icon {
  694. width: 30rpx;
  695. height: 30rpx;
  696. margin-left: 4rpx;
  697. transition: transform 0.3s ease;
  698. }
  699. .video-card:active .play-icon {
  700. transform: scale(1.1);
  701. }
  702. .play-ripple {
  703. position: absolute;
  704. top: 50%;
  705. left: 50%;
  706. transform: translate(-50%, -50%);
  707. width: 0;
  708. height: 0;
  709. border-radius: 50%;
  710. background: rgba(255, 255, 255, 0.3);
  711. transition: all 0.6s ease;
  712. }
  713. .video-card:active .play-ripple {
  714. width: 120rpx;
  715. height: 120rpx;
  716. animation: playRipple 0.8s ease-out;
  717. }
  718. @keyframes playRipple {
  719. from {
  720. opacity: 1;
  721. transform: translate(-50%, -50%) scale(0);
  722. }
  723. to {
  724. opacity: 0;
  725. transform: translate(-50%, -50%) scale(1);
  726. }
  727. }
  728. .video-hover-effect {
  729. position: absolute;
  730. top: 0;
  731. left: 0;
  732. right: 0;
  733. bottom: 0;
  734. background: linear-gradient(45deg, transparent, rgba(52, 152, 219, 0.1), transparent);
  735. opacity: 0;
  736. transition: opacity 0.4s ease;
  737. }
  738. .video-card:active .video-hover-effect {
  739. opacity: 1;
  740. }
  741. .video-info {
  742. padding: 25rpx;
  743. }
  744. .video-title {
  745. font-size: 28rpx;
  746. font-weight: 700;
  747. color: #1e293b;
  748. margin-bottom: 20rpx;
  749. line-height: 1.4;
  750. display: -webkit-box;
  751. -webkit-box-orient: vertical;
  752. -webkit-line-clamp: 2;
  753. overflow: hidden;
  754. letter-spacing: 0.5rpx;
  755. }
  756. .video-instructor {
  757. display: flex;
  758. align-items: center;
  759. margin-bottom: 20rpx;
  760. gap: 12rpx;
  761. }
  762. .instructor-avatar {
  763. width: 40rpx;
  764. height: 40rpx;
  765. border-radius: 50%;
  766. border: 2rpx solid rgba(52, 152, 219, 0.3);
  767. box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.1);
  768. transition: all 0.3s ease;
  769. }
  770. .video-card:active .instructor-avatar {
  771. border-color: #3498db;
  772. transform: scale(1.05);
  773. }
  774. .instructor-name {
  775. font-size: 24rpx;
  776. color: #64748b;
  777. font-weight: 500;
  778. }
  779. .video-meta {
  780. display: flex;
  781. justify-content: space-between;
  782. align-items: center;
  783. }
  784. .video-meta-item {
  785. display: flex;
  786. align-items: center;
  787. gap: 8rpx;
  788. font-size: 22rpx;
  789. color: #94a3b8;
  790. }
  791. .video-meta-item image {
  792. width: 22rpx;
  793. height: 22rpx;
  794. opacity: 0.6;
  795. transition: all 0.3s ease;
  796. }
  797. .video-meta-item:active image {
  798. opacity: 1;
  799. transform: scale(1.1);
  800. }
  801. /* 空状态样式优化 */
  802. .empty-state {
  803. display: flex;
  804. flex-direction: column;
  805. align-items: center;
  806. justify-content: center;
  807. padding: 150rpx 0;
  808. text-align: center;
  809. position: relative;
  810. }
  811. .empty-animation {
  812. position: absolute;
  813. top: 50%;
  814. left: 50%;
  815. transform: translate(-50%, -50%);
  816. width: 300rpx;
  817. height: 300rpx;
  818. }
  819. .empty-circle {
  820. position: absolute;
  821. top: 50%;
  822. left: 50%;
  823. transform: translate(-50%, -50%);
  824. width: 100rpx;
  825. height: 100rpx;
  826. border: 8rpx solid rgba(52, 152, 219, 0.1);
  827. border-radius: 50%;
  828. animation: emptyFloat 4s ease-in-out infinite;
  829. }
  830. .empty-circle.circle-2 {
  831. width: 150rpx;
  832. height: 150rpx;
  833. border-width: 6rpx;
  834. animation-delay: 1s;
  835. }
  836. .empty-circle.circle-3 {
  837. width: 200rpx;
  838. height: 200rpx;
  839. border-width: 4rpx;
  840. animation-delay: 2s;
  841. }
  842. @keyframes emptyFloat {
  843. 0%,
  844. 100% {
  845. transform: translate(-50%, -50%) scale(1);
  846. opacity: 0.3;
  847. }
  848. 50% {
  849. transform: translate(-50%, -50%) scale(1.1);
  850. opacity: 0.1;
  851. }
  852. }
  853. .empty-text {
  854. font-size: 32rpx;
  855. color: #64748b;
  856. font-weight: 600;
  857. margin-bottom: 15rpx;
  858. letter-spacing: 1rpx;
  859. position: relative;
  860. z-index: 1;
  861. }
  862. .empty-hint {
  863. font-size: 26rpx;
  864. color: #94a3b8;
  865. position: relative;
  866. z-index: 1;
  867. }
  868. /* 响应式调整 */
  869. @media screen and (max-width: 750rpx) {
  870. .videos-grid {
  871. grid-template-columns: 1fr;
  872. }
  873. .articles-list {
  874. padding: 0 10rpx;
  875. }
  876. .category-item {
  877. font-size: 26rpx;
  878. padding: 18rpx 28rpx;
  879. min-width: 110rpx;
  880. }
  881. .header {
  882. padding-top: 40rpx;
  883. }
  884. .title {
  885. font-size: 48rpx;
  886. }
  887. .tabs {
  888. height: 80rpx;
  889. }
  890. .tab-item {
  891. font-size: 30rpx;
  892. }
  893. }
  894. /* 加载动画优化 */
  895. @keyframes pulse {
  896. 0%,
  897. 100% {
  898. opacity: 1;
  899. transform: scale(1);
  900. }
  901. 50% {
  902. opacity: 0.7;
  903. transform: scale(0.95);
  904. }
  905. }
  906. .loading {
  907. animation: pulse 1.5s ease-in-out infinite;
  908. }
  909. /* 滚动条样式 */
  910. ::-webkit-scrollbar {
  911. width: 0;
  912. height: 0;
  913. color: transparent;
  914. }