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

1393 lines
23 KiB

  1. /* 基础样式 */
  2. page {
  3. background: #f8fafc;
  4. overflow-x: hidden;
  5. }
  6. .auth-container {
  7. min-height: 100vh;
  8. position: relative;
  9. padding-bottom: 40rpx;
  10. }
  11. /* 背景装饰 */
  12. .background-design {
  13. position: fixed;
  14. top: 0;
  15. left: 0;
  16. right: 0;
  17. bottom: 0;
  18. z-index: 0;
  19. overflow: hidden;
  20. }
  21. .bg-circle {
  22. position: absolute;
  23. border-radius: 50%;
  24. background: linear-gradient(135deg, rgba(20, 184, 166, 0.08) 0%, rgba(20, 184, 166, 0.03) 100%);
  25. animation: float 20s infinite ease-in-out;
  26. }
  27. .circle-1 {
  28. width: 600rpx;
  29. height: 600rpx;
  30. top: -200rpx;
  31. right: -200rpx;
  32. animation-delay: 0s;
  33. }
  34. .circle-2 {
  35. width: 400rpx;
  36. height: 400rpx;
  37. top: 300rpx;
  38. left: -100rpx;
  39. animation-delay: 5s;
  40. }
  41. .bg-wave {
  42. position: absolute;
  43. bottom: 0;
  44. left: 0;
  45. right: 0;
  46. height: 300rpx;
  47. background: linear-gradient(to top, rgba(20, 184, 166, 0.05) 0%, transparent 100%);
  48. clip-path: polygon(0% 100%, 100% 100%, 100% 30%, 80% 20%, 60% 40%, 40% 20%, 20% 40%, 0% 20%);
  49. }
  50. @keyframes float {
  51. 0%, 100% { transform: translateY(0) scale(1); }
  52. 50% { transform: translateY(-20rpx) scale(1.05); }
  53. }
  54. /* 头部区域 */
  55. .header-section {
  56. position: relative;
  57. z-index: 1;
  58. padding: 60rpx 40rpx 30rpx;
  59. animation: slideInDown 0.6s ease-out;
  60. }
  61. .brand-header {
  62. display: flex;
  63. align-items: center;
  64. margin-bottom: 40rpx;
  65. }
  66. .brand-text {
  67. flex: 1;
  68. animation: fadeInRight 0.8s ease-out 0.2s both;
  69. }
  70. .brand-name {
  71. font-size: 44rpx;
  72. font-weight: 800;
  73. color: #0f766e;
  74. letter-spacing: 2rpx;
  75. margin-bottom: 6rpx;
  76. background: linear-gradient(135deg, #0f766e 0%, #14b8a6 100%);
  77. -webkit-background-clip: text;
  78. -webkit-text-fill-color: transparent;
  79. background-clip: text;
  80. }
  81. .brand-slogan {
  82. font-size: 26rpx;
  83. color: #64748b;
  84. }
  85. .auth-header {
  86. text-align: center;
  87. margin-bottom: 30rpx;
  88. animation: fadeInUp 0.6s ease-out 0.4s both;
  89. }
  90. .auth-title {
  91. display: flex;
  92. align-items: center;
  93. justify-content: center;
  94. gap: 20rpx;
  95. margin-bottom: 16rpx;
  96. }
  97. .title-text {
  98. font-size: 40rpx;
  99. font-weight: 700;
  100. color: #0f172a;
  101. }
  102. .title-badge {
  103. background: linear-gradient(135deg, #f97316 0%, #ea580c 100%);
  104. color: white;
  105. font-size: 22rpx;
  106. padding: 4rpx 16rpx;
  107. border-radius: 20rpx;
  108. font-weight: 500;
  109. animation: pulse 2s infinite;
  110. }
  111. @keyframes pulse {
  112. 0%, 100% { transform: scale(1); }
  113. 50% { transform: scale(1.05); }
  114. }
  115. .auth-description {
  116. font-size: 28rpx;
  117. color: #64748b;
  118. line-height: 1.5;
  119. }
  120. /* 进度指示器 */
  121. .progress-indicator {
  122. display: flex;
  123. align-items: center;
  124. justify-content: center;
  125. padding: 0 40rpx 50rpx;
  126. position: relative;
  127. z-index: 1;
  128. animation: fadeInUp 0.6s ease-out 0.6s both;
  129. }
  130. .progress-step {
  131. display: flex;
  132. flex-direction: column;
  133. align-items: center;
  134. position: relative;
  135. flex: 1;
  136. transition: all 0.3s ease;
  137. }
  138. .step-bubble {
  139. width: 60rpx;
  140. height: 60rpx;
  141. background: #e2e8f0;
  142. border-radius: 50%;
  143. display: flex;
  144. align-items: center;
  145. justify-content: center;
  146. margin-bottom: 12rpx;
  147. transition: all 0.3s ease;
  148. position: relative;
  149. overflow: hidden;
  150. }
  151. .step-bubble::before {
  152. content: '';
  153. position: absolute;
  154. top: -2rpx;
  155. left: -2rpx;
  156. right: -2rpx;
  157. bottom: -2rpx;
  158. background: linear-gradient(135deg, #0f766e 0%, #14b8a6 100%);
  159. border-radius: 50%;
  160. opacity: 0;
  161. transition: opacity 0.3s ease;
  162. }
  163. .progress-step.active .step-bubble::before {
  164. opacity: 1;
  165. }
  166. .step-number {
  167. font-size: 28rpx;
  168. font-weight: 600;
  169. color: #64748b;
  170. position: relative;
  171. z-index: 1;
  172. transition: all 0.3s ease;
  173. }
  174. .progress-step.active .step-number {
  175. color: white;
  176. }
  177. .step-label {
  178. font-size: 26rpx;
  179. color: #94a3b8;
  180. font-weight: 500;
  181. transition: all 0.3s ease;
  182. }
  183. .progress-step.active .step-label {
  184. color: #0f766e;
  185. font-weight: 600;
  186. }
  187. .progress-line {
  188. flex: 1;
  189. height: 4rpx;
  190. background: #e2e8f0;
  191. border-radius: 2rpx;
  192. position: relative;
  193. margin: 0 20rpx;
  194. overflow: hidden;
  195. transition: all 0.3s ease;
  196. }
  197. .line-progress {
  198. position: absolute;
  199. top: 0;
  200. left: 0;
  201. height: 100%;
  202. background: linear-gradient(90deg, #0f766e 0%, #14b8a6 100%);
  203. border-radius: 2rpx;
  204. transition: width 0.5s ease;
  205. }
  206. /* 表单区域 */
  207. .form-section {
  208. position: relative;
  209. z-index: 1;
  210. padding: 0 40rpx;
  211. }
  212. .input-card {
  213. background: white;
  214. border-radius: 24rpx;
  215. padding: 32rpx;
  216. margin-bottom: 30rpx;
  217. box-shadow: 0 8rpx 32rpx rgba(0, 0, 0, 0.08);
  218. border: 1rpx solid #f1f5f9;
  219. transition: all 0.3s ease;
  220. overflow: hidden;
  221. animation: fadeInUp 0.6s ease-out;
  222. opacity: 0;
  223. animation-fill-mode: forwards;
  224. position: relative;
  225. }
  226. .input-card:nth-child(1) {
  227. animation-delay: 0.7s;
  228. }
  229. .input-card:nth-child(2) {
  230. animation-delay: 0.8s;
  231. }
  232. .input-card:focus-within::before {
  233. content: '';
  234. position: absolute;
  235. top: 0;
  236. left: 0;
  237. right: 0;
  238. height: 3rpx;
  239. background: linear-gradient(90deg, #0f766e 0%, #14b8a6 100%);
  240. animation: underlineProgress 0.3s ease forwards;
  241. }
  242. @keyframes underlineProgress {
  243. from { transform: translateX(-100%); }
  244. to { transform: translateX(0); }
  245. }
  246. .input-label {
  247. display: flex;
  248. align-items: center;
  249. margin-bottom: 24rpx;
  250. transition: all 0.3s ease;
  251. }
  252. .label-icon {
  253. width: 28rpx;
  254. height: 28rpx;
  255. margin-right: 12rpx;
  256. transition: all 0.3s ease;
  257. }
  258. .input-field:focus + .input-label .label-icon,
  259. .input-card:focus-within .label-icon {
  260. transform: scale(1.1) rotate(5deg);
  261. filter: brightness(1.2);
  262. }
  263. .label-text {
  264. font-size: 30rpx;
  265. font-weight: 600;
  266. color: #0f172a;
  267. flex: 1;
  268. }
  269. .required-star {
  270. color: #ef4444;
  271. font-size: 24rpx;
  272. margin-left: 4rpx;
  273. }
  274. .input-container {
  275. position: relative;
  276. margin-bottom: 8rpx;
  277. }
  278. /* 输入框样式 */
  279. .input-field {
  280. height: 88rpx;
  281. font-size: 32rpx;
  282. color: #0f172a;
  283. padding: 0 80rpx 0 24rpx;
  284. background: #f8fafc;
  285. border-radius: 16rpx;
  286. border: 2rpx solid #e2e8f0;
  287. transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
  288. z-index: 2;
  289. position: relative;
  290. width: 100%;
  291. box-sizing: border-box;
  292. }
  293. .input-field.error {
  294. border-color: #ef4444;
  295. background: rgba(239, 68, 68, 0.02);
  296. animation: shake 0.5s cubic-bezier(0.36, 0.07, 0.19, 0.97) both;
  297. }
  298. .input-field.valid {
  299. border-color: #22c55e;
  300. background: rgba(34, 197, 94, 0.02);
  301. }
  302. .input-field.has-value {
  303. border-color: #94a3b8;
  304. }
  305. .placeholder {
  306. color: #94a3b8;
  307. font-size: 28rpx;
  308. transition: all 0.3s ease;
  309. }
  310. /* 清除按钮 */
  311. .clear-wrapper {
  312. position: absolute;
  313. right: 20rpx;
  314. top: 50%;
  315. transform: translateY(-50%);
  316. z-index: 10;
  317. animation: fadeIn 0.3s ease-out;
  318. }
  319. .clear-btn {
  320. width: 44rpx;
  321. height: 44rpx;
  322. padding: 0;
  323. margin: 0;
  324. background: transparent;
  325. display: flex;
  326. align-items: center;
  327. justify-content: center;
  328. border-radius: 50%;
  329. transition: all 0.2s ease;
  330. position: relative;
  331. overflow: hidden;
  332. line-height: 1;
  333. }
  334. .clear-btn::after {
  335. display: none;
  336. border: none;
  337. }
  338. .clear-btn:active {
  339. background-color: rgba(0, 0, 0, 0.1);
  340. transform: scale(0.95);
  341. }
  342. .clear-icon {
  343. width: 26rpx;
  344. height: 26rpx;
  345. opacity: 0.6;
  346. filter: brightness(0%);
  347. transition: all 0.2s ease;
  348. }
  349. .clear-btn:active .clear-icon {
  350. opacity: 1;
  351. }
  352. /* 字符计数 */
  353. .char-count {
  354. position: absolute;
  355. right: 80rpx;
  356. top: 50%;
  357. transform: translateY(-50%);
  358. font-size: 24rpx;
  359. color: #94a3b8;
  360. z-index: 1;
  361. transition: all 0.3s ease;
  362. opacity: 0.8;
  363. background: transparent;
  364. pointer-events: none;
  365. }
  366. .input-field.focused ~ .char-count {
  367. opacity: 1;
  368. transform: translateY(-50%) scale(1.1);
  369. }
  370. .char-count.warning {
  371. color: #f59e0b;
  372. animation: pulse 1.5s infinite;
  373. }
  374. /* 输入框下划线 */
  375. .input-underline {
  376. position: relative;
  377. height: 2rpx;
  378. margin-top: -2rpx;
  379. overflow: hidden;
  380. }
  381. .underline-bg {
  382. position: absolute;
  383. top: 0;
  384. left: 0;
  385. right: 0;
  386. height: 100%;
  387. background: #e2e8f0;
  388. }
  389. .underline-progress {
  390. position: absolute;
  391. top: 0;
  392. left: 0;
  393. width: 0;
  394. height: 100%;
  395. background: #14b8a6;
  396. transition: width 0.3s ease;
  397. }
  398. .underline-progress.active {
  399. width: 100%;
  400. animation: underlineExpand 0.3s ease forwards;
  401. }
  402. @keyframes underlineExpand {
  403. from { width: 0; }
  404. to { width: 100%; }
  405. }
  406. /* 身份证分段显示 */
  407. .id-segments {
  408. position: absolute;
  409. bottom: -40rpx;
  410. left: 0;
  411. right: 0;
  412. display: flex;
  413. justify-content: space-between;
  414. padding: 0 8rpx;
  415. opacity: 0;
  416. transform: translateY(10rpx);
  417. transition: all 0.3s ease;
  418. pointer-events: none;
  419. }
  420. .id-segments.show {
  421. opacity: 0.7;
  422. transform: translateY(0);
  423. }
  424. .id-segment {
  425. font-size: 20rpx;
  426. color: #94a3b8;
  427. padding: 4rpx 8rpx;
  428. background: #f1f5f9;
  429. border-radius: 6rpx;
  430. min-width: 60rpx;
  431. text-align: center;
  432. transition: all 0.3s ease;
  433. transform: scale(0.9);
  434. }
  435. .id-segment.filled {
  436. color: #0f766e;
  437. background: rgba(20, 184, 166, 0.1);
  438. font-weight: 500;
  439. transform: scale(1);
  440. animation: segmentFill 0.3s ease-out;
  441. }
  442. @keyframes segmentFill {
  443. 0% {
  444. transform: scale(0.9);
  445. opacity: 0.5;
  446. }
  447. 50% {
  448. transform: scale(1.05);
  449. }
  450. 100% {
  451. transform: scale(1);
  452. opacity: 1;
  453. }
  454. }
  455. .id-segment.last {
  456. min-width: 40rpx;
  457. }
  458. /* 提示信息*/
  459. .hint-container {
  460. display: flex;
  461. align-items: center;
  462. min-height: 36rpx;
  463. padding-top: 8rpx;
  464. opacity: 1;
  465. transform: translateY(0);
  466. transition: all 0.3s ease;
  467. pointer-events: none;
  468. }
  469. .hint-text {
  470. font-size: 24rpx;
  471. line-height: 1.4;
  472. flex: 1;
  473. transition: all 0.3s ease;
  474. }
  475. .hint-text.normal {
  476. color: #64748b;
  477. }
  478. .hint-text.error {
  479. color: #ef4444;
  480. animation: fadeInUp 0.3s ease-out;
  481. }
  482. /* 协议卡片 */
  483. .agreement-card {
  484. background: white;
  485. border-radius: 24rpx;
  486. padding: 32rpx;
  487. margin-top: 40rpx;
  488. box-shadow: 0 8rpx 32rpx rgba(0, 0, 0, 0.08);
  489. transition: all 0.3s ease;
  490. animation: fadeInUp 0.6s ease-out 0.9s both;
  491. }
  492. .agreement-item {
  493. display: flex;
  494. align-items: center;
  495. cursor: pointer;
  496. }
  497. .agreement-checkbox {
  498. width: 40rpx;
  499. height: 40rpx;
  500. border: 2rpx solid #cbd5e1;
  501. border-radius: 10rpx;
  502. margin-right: 20rpx;
  503. flex-shrink: 0;
  504. display: flex;
  505. align-items: center;
  506. justify-content: center;
  507. transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
  508. position: relative;
  509. overflow: hidden;
  510. }
  511. .agreement-checkbox::before {
  512. content: '';
  513. position: absolute;
  514. top: 0;
  515. left: 0;
  516. right: 0;
  517. bottom: 0;
  518. background: linear-gradient(135deg, #0f766e 0%, #14b8a6 100%);
  519. opacity: 0;
  520. transition: opacity 0.3s ease;
  521. }
  522. .agreement-checkbox.checked {
  523. border-color: #14b8a6;
  524. animation: checkboxCheck 0.4s ease-out;
  525. }
  526. .agreement-checkbox.checked::before {
  527. opacity: 1;
  528. }
  529. @keyframes checkboxCheck {
  530. 0% {
  531. transform: scale(0.8);
  532. opacity: 0.5;
  533. }
  534. 50% {
  535. transform: scale(1.1);
  536. }
  537. 100% {
  538. transform: scale(1);
  539. opacity: 1;
  540. }
  541. }
  542. .checkmark {
  543. width: 26rpx;
  544. height: 26rpx;
  545. position: relative;
  546. z-index: 1;
  547. animation: checkmarkAppear 0.3s ease-out 0.1s both;
  548. }
  549. @keyframes checkmarkAppear {
  550. 0% {
  551. transform: scale(0);
  552. opacity: 0;
  553. }
  554. 100% {
  555. transform: scale(1);
  556. opacity: 1;
  557. }
  558. }
  559. .agreement-content {
  560. font-size: 28rpx;
  561. color: #475569;
  562. line-height: 1.5;
  563. flex: 1;
  564. transition: color 0.3s ease;
  565. }
  566. .link-text {
  567. color: #0f766e;
  568. font-weight: 600;
  569. margin: 0 4rpx;
  570. position: relative;
  571. display: inline-block;
  572. transition: all 0.3s ease;
  573. }
  574. .link-text::after {
  575. content: '';
  576. position: absolute;
  577. bottom: -2rpx;
  578. left: 0;
  579. right: 0;
  580. height: 2rpx;
  581. background: #0f766e;
  582. transform: scaleX(0);
  583. transform-origin: right;
  584. transition: transform 0.3s ease;
  585. }
  586. .link-text:active::after {
  587. transform: scaleX(1);
  588. transform-origin: left;
  589. }
  590. /* 提交区域*/
  591. .submit-section {
  592. position: relative;
  593. z-index: 1;
  594. padding: 40rpx 40rpx 30rpx;
  595. animation: fadeInUp 0.6s ease-out 1s both;
  596. }
  597. .submit-button {
  598. width: 100%;
  599. padding: 10rpx 0;
  600. border-radius: 50rpx;
  601. font-size: 32rpx;
  602. font-weight: 600;
  603. margin: 0;
  604. transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
  605. position: relative;
  606. overflow: hidden;
  607. border: none;
  608. outline: none;
  609. display: block;
  610. }
  611. .submit-button::after {
  612. border: none;
  613. }
  614. .submit-button.disabled {
  615. background: #cbd5e1 !important;
  616. color: #94a3b8 !important;
  617. box-shadow: none !important;
  618. transform: none !important;
  619. cursor: not-allowed;
  620. }
  621. .submit-button.active {
  622. background: linear-gradient(135deg, #0f766e 0%, #14b8a6 100%);
  623. color: white;
  624. box-shadow: 0 12rpx 40rpx rgba(20, 184, 166, 0.4);
  625. }
  626. .submit-button.active::before {
  627. content: '';
  628. position: absolute;
  629. top: 0;
  630. left: 0;
  631. right: 0;
  632. bottom: 0;
  633. background: linear-gradient(
  634. 90deg,
  635. transparent 0%,
  636. rgba(255, 255, 255, 0.2) 50%,
  637. transparent 100%
  638. );
  639. transform: translateX(-100%);
  640. animation: shimmer 2s infinite;
  641. }
  642. .button-hover {
  643. opacity: 0.95;
  644. transform: translateY(-2rpx) scale(1.01) !important;
  645. }
  646. /* 协议弹窗 */
  647. .modal-overlay {
  648. position: fixed;
  649. top: 0;
  650. left: 0;
  651. right: 0;
  652. bottom: 0;
  653. background: rgba(15, 23, 42, 0.5);
  654. backdrop-filter: blur(10rpx);
  655. display: flex;
  656. align-items: center;
  657. justify-content: center;
  658. z-index: 1000;
  659. opacity: 0;
  660. visibility: hidden;
  661. transition: all 0.3s ease;
  662. }
  663. .modal-overlay.show {
  664. opacity: 1;
  665. visibility: visible;
  666. }
  667. .modal-overlay.show .modal-container {
  668. animation: modalSlideUp 0.4s cubic-bezier(0.4, 0, 0.2, 1);
  669. }
  670. @keyframes modalSlideUp {
  671. 0% {
  672. transform: translateY(50rpx);
  673. opacity: 0;
  674. }
  675. 100% {
  676. transform: translateY(0);
  677. opacity: 1;
  678. }
  679. }
  680. .modal-container {
  681. width: 680rpx;
  682. background: white;
  683. border-radius: 32rpx;
  684. overflow: hidden;
  685. box-shadow: 0 20rpx 60rpx rgba(0, 0, 0, 0.3);
  686. max-height: 80vh;
  687. display: flex;
  688. flex-direction: column;
  689. }
  690. .modal-header {
  691. padding: 40rpx 48rpx 24rpx;
  692. display: flex;
  693. align-items: center;
  694. justify-content: space-between;
  695. border-bottom: 1rpx solid #f1f5f9;
  696. }
  697. .modal-title {
  698. font-size: 36rpx;
  699. font-weight: 700;
  700. color: #0f172a;
  701. }
  702. .modal-close {
  703. width: 44rpx;
  704. height: 44rpx;
  705. padding: 0;
  706. margin: 0;
  707. background: #f1f5f9;
  708. border-radius: 50%;
  709. display: flex;
  710. align-items: center;
  711. justify-content: center;
  712. transition: all 0.2s ease;
  713. border: none;
  714. outline: none;
  715. }
  716. .modal-close::after {
  717. border: none;
  718. }
  719. .modal-close:active {
  720. background: #e2e8f0;
  721. transform: scale(0.95);
  722. }
  723. .close-icon {
  724. width: 26rpx;
  725. height: 26rpx;
  726. filter: brightness(0);
  727. }
  728. .modal-content {
  729. flex: 1;
  730. padding: 32rpx 48rpx;
  731. max-height: 60vh;
  732. box-sizing: border-box;
  733. }
  734. .modal-text {
  735. font-size: 28rpx;
  736. color: #475569;
  737. line-height: 1.6;
  738. white-space: pre-line;
  739. animation: fadeIn 0.5s ease-out 0.2s both;
  740. }
  741. .modal-footer {
  742. padding: 32rpx 48rpx 30rpx;
  743. margin-top: 20rpx;
  744. }
  745. .modal-confirm {
  746. width: 100%;
  747. background: linear-gradient(135deg, #0f766e 0%, #14b8a6 100%);
  748. border-radius: 24rpx;
  749. font-size: 30rpx;
  750. font-weight: 600;
  751. color: white;
  752. padding: 0;
  753. margin: 0;
  754. transition: all 0.2s ease;
  755. border: none;
  756. outline: none;
  757. height: 88rpx;
  758. display: flex;
  759. align-items: center;
  760. justify-content: center;
  761. }
  762. .modal-confirm::after {
  763. border: none;
  764. }
  765. .modal-confirm:active {
  766. opacity: 0.9;
  767. transform: scale(0.98);
  768. }
  769. /* 成功弹窗 */
  770. .success-modal {
  771. position: fixed;
  772. top: 0;
  773. left: 0;
  774. right: 0;
  775. bottom: 0;
  776. z-index: 1000;
  777. display: flex;
  778. align-items: center;
  779. justify-content: center;
  780. opacity: 0;
  781. visibility: hidden;
  782. transition: all 0.3s ease;
  783. }
  784. .success-modal.show {
  785. opacity: 1;
  786. visibility: visible;
  787. }
  788. .success-overlay {
  789. position: absolute;
  790. top: 0;
  791. left: 0;
  792. right: 0;
  793. bottom: 0;
  794. background: rgba(15, 23, 42, 0.5);
  795. backdrop-filter: blur(10rpx);
  796. }
  797. .success-modal.show .success-container {
  798. animation: successZoomIn 0.6s cubic-bezier(0.4, 0, 0.2, 1);
  799. }
  800. @keyframes successZoomIn {
  801. 0% {
  802. transform: scale(0.9);
  803. opacity: 0;
  804. }
  805. 50% {
  806. transform: scale(1.05);
  807. }
  808. 100% {
  809. transform: scale(1);
  810. opacity: 1;
  811. }
  812. }
  813. .success-container {
  814. position: relative;
  815. width: 680rpx;
  816. background: white;
  817. border-radius: 32rpx;
  818. overflow: hidden;
  819. box-shadow: 0 20rpx 60rpx rgba(0, 0, 0, 0.3);
  820. }
  821. .success-icon {
  822. padding: 60rpx 0 40rpx;
  823. text-align: center;
  824. position: relative;
  825. }
  826. .success-badge {
  827. width: 120rpx;
  828. height: 120rpx;
  829. margin: 0 auto;
  830. position: relative;
  831. z-index: 1;
  832. filter: brightness(0);
  833. animation: successBadge 0.8s ease-out;
  834. }
  835. @keyframes successBadge {
  836. 0% {
  837. transform: scale(0);
  838. opacity: 0;
  839. }
  840. 50% {
  841. transform: scale(1.2);
  842. }
  843. 100% {
  844. transform: scale(1);
  845. opacity: 1;
  846. }
  847. }
  848. .success-ring {
  849. position: absolute;
  850. top: 50%;
  851. left: 50%;
  852. border: 2rpx solid rgba(20, 184, 166, 0.3);
  853. border-radius: 50%;
  854. }
  855. .ring-1 {
  856. width: 160rpx;
  857. height: 160rpx;
  858. animation: ringPulse 2s ease-out infinite;
  859. }
  860. .ring-2 {
  861. width: 200rpx;
  862. height: 200rpx;
  863. animation: ringPulse 2s ease-out 0.5s infinite;
  864. }
  865. @keyframes ringPulse {
  866. 0% {
  867. transform: translate(-50%, -50%) scale(0.8);
  868. opacity: 0;
  869. }
  870. 50% {
  871. opacity: 1;
  872. }
  873. 100% {
  874. transform: translate(-50%, -50%) scale(1.2);
  875. opacity: 0;
  876. }
  877. }
  878. .success-body {
  879. padding: 0 48rpx 40rpx;
  880. animation: fadeInUp 0.6s ease-out 0.3s both;
  881. }
  882. .success-title {
  883. font-size: 44rpx;
  884. font-weight: 700;
  885. color: #0f172a;
  886. text-align: center;
  887. margin-bottom: 16rpx;
  888. }
  889. .success-message {
  890. font-size: 32rpx;
  891. color: #475569;
  892. text-align: center;
  893. margin-bottom: 40rpx;
  894. }
  895. .brand {
  896. color: #0f766e;
  897. font-weight: 700;
  898. margin: 0 4rpx;
  899. }
  900. .success-details {
  901. background: #f8fafc;
  902. border-radius: 20rpx;
  903. padding: 32rpx;
  904. animation: fadeInUp 0.6s ease-out 0.5s both;
  905. }
  906. .detail-item {
  907. display: flex;
  908. flex-direction: column;
  909. gap: 12rpx;
  910. }
  911. .detail-item:not(:last-child) {
  912. margin-bottom: 24rpx;
  913. }
  914. .detail-label {
  915. display: flex;
  916. align-items: center;
  917. gap: 12rpx;
  918. }
  919. .detail-icon {
  920. width: 24rpx;
  921. height: 24rpx;
  922. animation: iconBounce 0.6s ease-out;
  923. }
  924. @keyframes iconBounce {
  925. 0%, 100% {
  926. transform: translateY(0);
  927. }
  928. 50% {
  929. transform: translateY(-4rpx);
  930. }
  931. }
  932. .detail-label text {
  933. font-size: 26rpx;
  934. color: #64748b;
  935. }
  936. .detail-value {
  937. font-size: 30rpx;
  938. font-weight: 600;
  939. color: #0f172a;
  940. padding-left: 36rpx;
  941. }
  942. .success-footer {
  943. padding: 0 48rpx 40rpx;
  944. animation: fadeInUp 0.6s ease-out 0.7s both;
  945. }
  946. .success-button {
  947. width: 100%;
  948. height: 88rpx;
  949. background: linear-gradient(135deg, #0f766e 0%, #14b8a6 100%);
  950. border-radius: 24rpx;
  951. font-size: 30rpx;
  952. font-weight: 600;
  953. color: white;
  954. padding: 0;
  955. margin: 0;
  956. display: flex;
  957. align-items: center;
  958. justify-content: center;
  959. gap: 12rpx;
  960. transition: all 0.2s ease;
  961. border: none;
  962. outline: none;
  963. }
  964. .success-button::after {
  965. border: none;
  966. }
  967. .success-button:active {
  968. opacity: 0.9;
  969. transform: scale(0.98);
  970. }
  971. @keyframes homeFloat {
  972. 0%, 100% {
  973. transform: translateY(0);
  974. }
  975. 50% {
  976. transform: translateY(-4rpx);
  977. }
  978. }
  979. /* 通用动画 */
  980. @keyframes fadeIn {
  981. from {
  982. opacity: 0;
  983. }
  984. to {
  985. opacity: 1;
  986. }
  987. }
  988. @keyframes fadeInUp {
  989. from {
  990. opacity: 0;
  991. transform: translateY(20rpx);
  992. }
  993. to {
  994. opacity: 1;
  995. transform: translateY(0);
  996. }
  997. }
  998. @keyframes fadeInRight {
  999. from {
  1000. opacity: 0;
  1001. transform: translateX(-20rpx);
  1002. }
  1003. to {
  1004. opacity: 1;
  1005. transform: translateX(0);
  1006. }
  1007. }
  1008. @keyframes fadeInDown {
  1009. from {
  1010. opacity: 0;
  1011. transform: translateY(-20rpx);
  1012. }
  1013. to {
  1014. opacity: 1;
  1015. transform: translateY(0);
  1016. }
  1017. }
  1018. @keyframes slideInDown {
  1019. from {
  1020. transform: translateY(-50rpx);
  1021. opacity: 0;
  1022. }
  1023. to {
  1024. transform: translateY(0);
  1025. opacity: 1;
  1026. }
  1027. }
  1028. @keyframes bounceIn {
  1029. 0%, 20%, 40%, 60%, 80%, 100% {
  1030. animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000);
  1031. }
  1032. 0% {
  1033. opacity: 0;
  1034. transform: scale3d(0.3, 0.3, 0.3);
  1035. }
  1036. 20% {
  1037. transform: scale3d(1.1, 1.1, 1.1);
  1038. }
  1039. 40% {
  1040. transform: scale3d(0.9, 0.9, 0.9);
  1041. }
  1042. 60% {
  1043. opacity: 1;
  1044. transform: scale3d(1.03, 1.03, 1.03);
  1045. }
  1046. 80% {
  1047. transform: scale3d(0.97, 0.97, 0.97);
  1048. }
  1049. 100% {
  1050. opacity: 1;
  1051. transform: scale3d(1, 1, 1);
  1052. }
  1053. }
  1054. @keyframes shake {
  1055. 10%, 90% {
  1056. transform: translateX(-1rpx);
  1057. }
  1058. 20%, 80% {
  1059. transform: translateX(2rpx);
  1060. }
  1061. 30%, 50%, 70% {
  1062. transform: translateX(-4rpx);
  1063. }
  1064. 40%, 60% {
  1065. transform: translateX(4rpx);
  1066. }
  1067. }
  1068. /* 响应式适配 */
  1069. @media (max-width: 480px) {
  1070. .header-section,
  1071. .form-section,
  1072. .submit-section,
  1073. .progress-indicator {
  1074. padding-left: 30rpx;
  1075. padding-right: 30rpx;
  1076. }
  1077. .input-card,
  1078. .agreement-card {
  1079. padding: 24rpx;
  1080. }
  1081. .modal-container,
  1082. .success-container {
  1083. width: 90%;
  1084. margin: 0 5%;
  1085. }
  1086. .modal-header,
  1087. .modal-content,
  1088. .modal-footer,
  1089. .success-body,
  1090. .success-footer {
  1091. padding-left: 32rpx;
  1092. padding-right: 32rpx;
  1093. }
  1094. .id-segments {
  1095. display: none;
  1096. }
  1097. }
  1098. /* 加载状态 */
  1099. .loading-indicator {
  1100. position: fixed;
  1101. top: 0;
  1102. left: 0;
  1103. right: 0;
  1104. bottom: 0;
  1105. background: rgba(255, 255, 255, 0.9);
  1106. display: flex;
  1107. align-items: center;
  1108. justify-content: center;
  1109. z-index: 9999;
  1110. opacity: 0;
  1111. visibility: hidden;
  1112. transition: all 0.3s ease;
  1113. }
  1114. .loading-indicator.show {
  1115. opacity: 1;
  1116. visibility: visible;
  1117. }
  1118. .loading-spinner {
  1119. width: 60rpx;
  1120. height: 60rpx;
  1121. border: 4rpx solid #f3f3f3;
  1122. border-top: 4rpx solid #14b8a6;
  1123. border-radius: 50%;
  1124. animation: spin 1s linear infinite;
  1125. }
  1126. @keyframes spin {
  1127. 0% { transform: rotate(0deg); }
  1128. 100% { transform: rotate(360deg); }
  1129. }
  1130. /* 错误弹窗样式 */
  1131. .error-modal .modal-container {
  1132. background: #fff;
  1133. border-radius: 20rpx;
  1134. overflow: hidden;
  1135. animation: modalSlideUp 0.3s ease;
  1136. }
  1137. .error-modal .modal-header {
  1138. padding: 40rpx 40rpx 20rpx;
  1139. text-align: center;
  1140. border-bottom: 2rpx solid #f0f0f0;
  1141. }
  1142. .error-modal .error-title {
  1143. color: #ff4444;
  1144. font-size: 36rpx;
  1145. font-weight: 600;
  1146. text-align: center;
  1147. width: 100%;
  1148. }
  1149. .error-modal .modal-content {
  1150. padding: 40rpx;
  1151. text-align: center;
  1152. }
  1153. .error-modal .error-message {
  1154. color: #666;
  1155. font-size: 28rpx;
  1156. line-height: 1.6;
  1157. text-align: center;
  1158. padding: 0 20rpx;
  1159. }
  1160. .error-modal .modal-footer {
  1161. padding: 30rpx 40rpx 40rpx;
  1162. }
  1163. .error-modal .error-confirm {
  1164. background: linear-gradient(135deg, #ff4444, #ff6666);
  1165. color: white;
  1166. border: none;
  1167. border-radius: 50rpx;
  1168. height: 80rpx;
  1169. line-height: 80rpx;
  1170. font-size: 30rpx;
  1171. font-weight: 500;
  1172. width: 100%;
  1173. transition: all 0.3s ease;
  1174. }
  1175. .error-modal .error-confirm:active {
  1176. opacity: 0.9;
  1177. transform: scale(0.98);
  1178. }
  1179. /* 弹窗动画 */
  1180. @keyframes modalSlideUp {
  1181. from {
  1182. opacity: 0;
  1183. transform: translateY(100rpx);
  1184. }
  1185. to {
  1186. opacity: 1;
  1187. transform: translateY(0);
  1188. }
  1189. }
  1190. /* 修复原有的模态框样式 */
  1191. .modal-overlay {
  1192. position: fixed;
  1193. top: 0;
  1194. left: 0;
  1195. right: 0;
  1196. bottom: 0;
  1197. background: rgba(0, 0, 0, 0.5);
  1198. display: flex;
  1199. align-items: center;
  1200. justify-content: center;
  1201. opacity: 0;
  1202. visibility: hidden;
  1203. transition: all 0.3s ease;
  1204. z-index: 9999;
  1205. padding: 40rpx;
  1206. }
  1207. .modal-overlay.show {
  1208. opacity: 1;
  1209. visibility: visible;
  1210. }
  1211. .modal-container {
  1212. width: 600rpx;
  1213. max-width: 90vw;
  1214. background: #fff;
  1215. border-radius: 20rpx;
  1216. overflow: hidden;
  1217. transform: translateY(20rpx);
  1218. transition: transform 0.3s ease;
  1219. }
  1220. .modal-overlay.show .modal-container {
  1221. transform: translateY(0);
  1222. }