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

1046 lines
20 KiB

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