blob: ab1e24c9e02f7e6f32543af6ca4550ab54069b72 [file] [log] [blame]
/* 登录页面容器 */
.login-container {
min-height: 100vh;
min-height: 100dvh; /* 动态视口高度,避免移动端地址栏影响 */
height: 100vh;
height: 100dvh;
display: flex;
align-items: center;
justify-content: center;
position: relative;
overflow: hidden;
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',
'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',
sans-serif;
/* 确保容器稳定定位 */
box-sizing: border-box;
margin: 0;
padding: 0;
/* 重置文本对齐 */
text-align: initial;
}
/* 小红书风格背景 */
.login-background {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: #f8f8f8;
z-index: -1;
}
/* 登录内容区域 */
.login-content {
width: 100%;
max-width: 500px; /* 增加桌面端最大宽度 */
padding: 0;
z-index: 1;
/* 确保内容稳定定位 */
box-sizing: border-box;
position: relative;
display: flex;
justify-content: center;
}
/* 小红书风格登录卡片 */
.login-card {
background: #fff;
border-radius: 8px;
padding: 40px; /* 增加桌面端内边距 */
box-shadow: 0 1px 4px rgba(0, 0, 0, 0.1);
border: 1px solid #e1e1e1;
width: 100%;
max-width: 450px; /* 增加桌面端卡片最大宽度 */
transition: none;
}
/* 登录头部 */
.login-header {
text-align: center;
margin-bottom: 40px;
}
/* Logo样式 */
.logo-section {
margin-bottom: 24px;
}
.logo-icon {
width: 60px;
height: 60px;
background: #ff2442;
border-radius: 12px;
display: flex;
align-items: center;
justify-content: center;
font-size: 28px;
margin: 0 auto 16px;
box-shadow: 0 4px 12px rgba(255, 36, 66, 0.2);
}
.login-title {
font-size: 24px;
font-weight: 600;
color: #333;
margin: 0 0 12px 0;
text-align: center;
}
.login-title::after {
display: none;
}
.login-subtitle {
font-size: 14px;
color: #999;
margin: 0 0 32px 0;
font-weight: 400;
text-align: center;
}
/* 表单样式 */
.login-form {
display: flex;
flex-direction: column;
gap: 24px;
width: 100%;
}
.form-group {
display: flex;
flex-direction: column;
gap: 6px;
width: 100%;
box-sizing: border-box;
margin-bottom: 2px;
position: relative; /* 为绝对定位的错误提示提供参考点 */
}
.form-group .input-wrapper {
width: 100%;
box-sizing: border-box;
}
.form-label {
font-size: 14px;
font-weight: 500;
color: #333;
margin-bottom: 8px;
}
.input-wrapper {
position: relative;
display: flex;
align-items: center;
width: 100%;
box-sizing: border-box;
}
.form-input {
width: 100% !important;
height: 44px;
padding: 12px 16px 12px 48px;
border: 1px solid #e1e1e1;
border-radius: 6px;
font-size: 14px;
transition: border-color 0.2s ease;
background: #fff;
color: #333;
box-sizing: border-box !important;
flex: 1;
min-width: 0;
}
/* 针对 Antd Input 组件的特定样式 */
.form-input.ant-input,
.form-input.ant-input-affix-wrapper {
width: 100% !important;
height: 44px !important;
border: 1px solid #e1e1e1 !important;
border-radius: 6px !important;
padding: 12px 48px 12px 48px !important;
font-size: 14px !important;
background: #fff !important;
color: #333 !important;
box-sizing: border-box !important;
flex: 1 !important;
min-width: 0 !important;
display: flex !important;
align-items: center !important;
}
.form-input.ant-input-affix-wrapper .ant-input {
width: 100% !important;
height: 100% !important;
padding: 0 !important;
border: none !important;
background: transparent !important;
flex: 1 !important;
min-width: 0 !important;
box-sizing: border-box !important;
}
.form-input:focus {
outline: none;
border-color: #ff2442;
box-shadow: none;
transform: none;
}
/* Antd Input focus 样式 */
.form-input.ant-input:focus,
.form-input.ant-input-affix-wrapper:focus,
.form-input.ant-input-affix-wrapper-focused {
outline: none !important;
border-color: #ff2442 !important;
box-shadow: none !important;
transform: none !important;
}
.form-input::placeholder {
color: #9ca3af;
}
.input-icon {
position: absolute;
left: 16px;
top: 50%;
transform: translateY(-50%);
color: #9ca3af;
pointer-events: none;
transition: color 0.3s ease;
z-index: 2;
}
.form-input:focus + .input-icon {
color: #ff2442;
}
.password-toggle {
position: absolute;
right: 12px;
top: 50%;
transform: translateY(-50%);
background: none;
border: none;
color: #9ca3af;
cursor: pointer;
padding: 4px;
border-radius: 4px;
transition: all 0.3s ease;
display: flex;
align-items: center;
justify-content: center;
z-index: 2;
width: 24px;
height: 24px;
}
.password-toggle:hover {
color: #ff2442;
background-color: rgba(255, 36, 66, 0.1);
}
/* 表单选项 */
.form-options {
display: flex;
justify-content: space-between;
align-items: center;
margin-top: 8px;
margin-bottom: 16px;
width: 100%;
flex-wrap: nowrap; /* 确保不换行 */
min-height: 24px;
gap: 8px; /* 添加基础间距 */
}
/* Ant Design Checkbox 样式兼容 */
.form-options .ant-checkbox-wrapper {
flex: 0 0 auto; /* 不伸缩,保持原始大小 */
font-size: 14px;
color: #64748b;
white-space: nowrap; /* 防止文字换行 */
overflow: hidden;
text-overflow: ellipsis;
max-width: 50%; /* 限制最大宽度 */
}
.form-options .ant-checkbox-wrapper .ant-checkbox {
margin-right: 8px;
}
.form-options .forgot-password {
flex: 0 0 auto; /* 不伸缩,保持原始大小 */
margin-left: auto;
white-space: nowrap;
color: #ff2442;
text-decoration: none;
font-size: 14px;
transition: color 0.3s ease;
max-width: 45%; /* 限制最大宽度 */
overflow: hidden;
text-overflow: ellipsis;
}
.form-options .forgot-password:hover {
color: #ff1a3a;
text-decoration: underline;
}
.checkbox-wrapper {
display: flex;
align-items: center;
gap: 8px;
cursor: pointer;
font-size: 14px;
color: #64748b;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
flex-shrink: 0;
}
.checkbox {
position: relative;
width: 18px;
height: 18px;
margin: 0;
cursor: pointer;
opacity: 0;
}
.checkmark {
position: absolute;
top: 0;
left: 0;
width: 18px;
height: 18px;
background-color: #fff;
border: 1px solid #e1e1e1;
border-radius: 3px;
transition: all 0.2s ease;
}
.checkbox:checked + .checkmark {
background-color: #ff2442;
border-color: #ff2442;
}
.checkmark:after {
content: "";
position: absolute;
display: none;
left: 5px;
top: 2px;
width: 4px;
height: 8px;
border: solid white;
border-width: 0 2px 2px 0;
transform: rotate(45deg);
}
.checkbox:checked + .checkmark:after {
display: block;
}
.forgot-password {
font-size: 14px;
color: #ff2442;
text-decoration: none;
font-weight: 400;
transition: color 0.2s ease;
margin-left: auto;
flex-shrink: 0;
white-space: nowrap;
}
.forgot-password:hover {
color: #d91e3a;
text-decoration: underline;
}
/* 小红书风格登录按钮 */
.login-button {
width: 100%;
height: 48px; /* 固定高度,防止布局变化 */
padding: 12px;
background: #ff2442;
color: white;
border: none;
border-radius: 6px;
font-size: 14px;
font-weight: 500;
cursor: pointer;
transition: background-color 0.2s ease;
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
margin-top: 8px;
box-sizing: border-box; /* 确保padding包含在总尺寸内 */
min-width: 0; /* 防止flex子元素造成宽度变化 */
}
.login-button:hover:not(:disabled) {
background: #d91e3a;
transform: none;
box-shadow: none;
}
.login-button:active:not(:disabled) {
transform: none;
}
.login-button:disabled {
background: #ccc;
cursor: not-allowed;
opacity: 0.8;
}
.login-button.loading {
background: #ff7b8a;
cursor: not-allowed;
}
.loading-spinner {
width: 16px;
height: 16px;
border: 2px solid rgba(255, 255, 255, 0.3);
border-radius: 50%;
border-top-color: #fff;
animation: spin 1s ease-in-out infinite;
}
@keyframes spin {
to { transform: rotate(360deg); }
}
/* 加载遮罩层 */
.loading-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba(0, 0, 0, 0.5);
display: flex;
align-items: center;
justify-content: center;
z-index: 1000;
backdrop-filter: blur(4px);
}
.loading-content {
display: flex;
flex-direction: column;
align-items: center;
gap: 16px;
background: white;
padding: 32px;
border-radius: 12px;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.15);
}
.loading-spinner-large {
width: 40px;
height: 40px;
border: 4px solid rgba(255, 36, 66, 0.2);
border-radius: 50%;
border-top-color: #ff2442;
animation: spin 1s ease-in-out infinite;
}
.loading-text {
margin: 0;
color: #333;
font-size: 16px;
font-weight: 500;
}
/* 分隔线 */
.login-divider {
position: relative;
text-align: center;
margin: 32px 0;
color: #9ca3af;
font-size: 14px;
}
.login-divider::before {
content: '';
position: absolute;
top: 50%;
left: 0;
right: 0;
height: 1px;
background: linear-gradient(to right, transparent, #e5e7eb, transparent);
}
.login-divider span {
background: rgba(255, 255, 255, 0.95);
padding: 0 16px;
position: relative;
z-index: 1;
}
/* 社交登录 */
.social-login {
display: flex;
flex-direction: column;
gap: 12px;
}
.social-button {
width: 100%;
padding: 12px 16px;
border: 1px solid #e1e1e1;
border-radius: 6px;
background: white;
color: #333;
font-size: 14px;
font-weight: 400;
cursor: pointer;
transition: border-color 0.2s ease;
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
}
.social-button:hover {
border-color: #ccc;
}
.social-button.google:hover {
border-color: #4285f4;
box-shadow: 0 4px 12px rgba(66, 133, 244, 0.2);
}
.social-button.github:hover {
border-color: #333;
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.2);
}
.social-button.xiaohongshu:hover {
border-color: #ff2442;
box-shadow: 0 4px 12px rgba(255, 36, 66, 0.2);
}
/* 注册链接 */
.signup-link {
text-align: center;
margin-top: 20px;
padding-top: 20px;
border-top: 1px solid #e5e7eb;
}
.signup-link p {
margin: 0;
font-size: 14px;
color: #64748b;
}
.signup-link a {
color: #ff2442;
text-decoration: none;
font-weight: 500;
transition: color 0.2s ease;
}
.signup-link a:hover {
color: #d91e3a;
text-decoration: underline;
}
/* 有左侧图标时的内边距调整 */
.input-wrapper.has-icon .form-input {
padding-left: 48px !important;
}
.input-wrapper.has-icon .form-input.ant-input,
.input-wrapper.has-icon .form-input.ant-input-affix-wrapper {
padding-left: 48px !important;
}
/* 有右侧切换按钮时的内边距调整 */
.input-wrapper.has-toggle .form-input {
padding-right: 48px !important;
}
.input-wrapper.has-toggle .form-input.ant-input,
.input-wrapper.has-toggle .form-input.ant-input-affix-wrapper {
padding-right: 48px !important;
}
/* 没有图标时的内边距调整 */
.input-wrapper:not(.has-icon) .form-input {
padding-left: 16px !important;
}
.input-wrapper:not(.has-icon) .form-input.ant-input,
.input-wrapper:not(.has-icon) .form-input.ant-input-affix-wrapper {
padding-left: 16px !important;
}
/* 没有切换按钮时的内边距调整 */
.input-wrapper:not(.has-toggle) .form-input {
padding-right: 16px !important;
}
.input-wrapper:not(.has-toggle) .form-input.ant-input,
.input-wrapper:not(.has-toggle) .form-input.ant-input-affix-wrapper {
padding-right: 16px !important;
}
/* 确保输入框内容完全填充 */
.form-input.ant-input-affix-wrapper .ant-input-suffix {
position: absolute !important;
right: 12px !important;
top: 50% !important;
transform: translateY(-50%) !important;
margin: 0 !important;
padding: 0 !important;
}
.form-input.ant-input-affix-wrapper .ant-input-prefix {
position: absolute !important;
left: 16px !important;
top: 50% !important;
transform: translateY(-50%) !important;
margin: 0 !important;
padding: 0 !important;
}
/* 确保所有输入框完全填充其容器 */
.form-group {
display: flex;
flex-direction: column;
gap: 8px;
width: 100%;
box-sizing: border-box;
}
.form-group .input-wrapper {
width: 100%;
box-sizing: border-box;
}
/* 防止输入框溢出容器 */
.form-input,
.form-input.ant-input,
.form-input.ant-input-affix-wrapper {
max-width: 100% !important;
overflow: hidden !important;
}
/* 确保内部输入元素不会超出边界 */
.form-input.ant-input-affix-wrapper .ant-input {
max-width: 100% !important;
overflow: hidden !important;
text-overflow: ellipsis !important;
}
/* 精细间距控制 */
.login-header + .login-form {
margin-top: -4px;
}
.login-form .form-group:not(:last-child) {
margin-bottom: 2px;
}
.login-form .form-group:last-of-type {
margin-bottom: 6px;
}
.login-button + .signup-link {
margin-top: 14px;
}
/* 响应式设计 */
@media (max-width: 768px) {
/* 重置body和html确保一致性 */
html, body {
height: 100%;
height: 100dvh;
margin: 0;
padding: 0;
overflow-x: hidden;
box-sizing: border-box;
}
.login-container {
padding: 16px;
align-items: center;
justify-content: center;
min-height: 100vh;
min-height: 100dvh; /* 动态视口高度 */
/* 强制重置可能影响定位的样式 */
margin: 0;
box-sizing: border-box;
/* 防止内容溢出影响布局 */
overflow-x: hidden;
overflow-y: auto;
/* 确保flexbox在所有移动设备上表现一致 */
-webkit-box-align: center;
-webkit-box-pack: center;
display: flex !important;
position: relative;
}
.login-content {
max-width: 100%;
padding: 20px;
/* 确保内容区域稳定 */
margin: 0 auto;
box-sizing: border-box;
/* 防止宽度计算问题 */
width: calc(100% - 40px);
max-width: 480px; /* 增加最大宽度 */
position: relative;
display: flex;
justify-content: center;
}
.login-card {
padding: 32px 28px; /* 增加内边距 */
border-radius: 16px;
/* 确保卡片稳定定位 */
margin: 0;
box-sizing: border-box;
width: 100%;
max-width: 450px; /* 增加卡片最大宽度 */
/* 防止backdrop-filter导致的渲染差异 */
will-change: auto;
position: relative;
/* 防止触摸操作影响布局 */
-webkit-touch-callout: none;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
-webkit-tap-highlight-color: transparent;
}
.login-title {
font-size: 24px;
}
.form-input {
width: 100% !important;
height: 44px !important;
padding: 12px 48px 12px 48px;
font-size: 16px; /* 防止iOS Safari缩放 */
box-sizing: border-box !important;
flex: 1 !important;
min-width: 0 !important;
}
.form-input.ant-input,
.form-input.ant-input-affix-wrapper {
width: 100% !important;
height: 44px !important;
padding: 12px 48px 12px 48px !important;
font-size: 16px !important;
box-sizing: border-box !important;
flex: 1 !important;
min-width: 0 !important;
}
.form-input.ant-input-affix-wrapper .ant-input {
width: 100% !important;
height: 100% !important;
padding: 0 !important;
border: none !important;
background: transparent !important;
flex: 1 !important;
min-width: 0 !important;
box-sizing: border-box !important;
}
.social-login {
gap: 10px;
}
.social-button {
padding: 12px 16px;
font-size: 14px;
}
.form-options {
display: flex !important;
flex-direction: row !important;
justify-content: space-between !important;
align-items: center !important;
gap: 8px !important;
width: 100% !important;
flex-wrap: nowrap !important;
min-height: 22px !important;
margin-top: 8px !important;
margin-bottom: 16px !important;
}
.checkbox-wrapper {
font-size: 13px;
flex: 0 0 auto !important;
white-space: nowrap !important;
overflow: hidden !important;
text-overflow: ellipsis !important;
max-width: 48% !important;
}
.forgot-password {
font-size: 13px;
margin-left: auto;
flex: 0 0 auto !important;
white-space: nowrap !important;
overflow: hidden !important;
text-overflow: ellipsis !important;
max-width: 48% !important;
}
/* Ant Design Checkbox 的特殊处理 */
.form-options .ant-checkbox-wrapper {
flex: 0 0 auto !important;
font-size: 13px !important;
white-space: nowrap !important;
overflow: hidden !important;
text-overflow: ellipsis !important;
max-width: 48% !important;
}
}
@media (max-width: 480px) {
.login-container {
padding: 16px;
align-items: center;
justify-content: center;
min-height: 100vh;
min-height: 100dvh; /* 动态视口高度 */
/* 强制重置样式 */
margin: 0;
box-sizing: border-box;
position: relative;
/* 确保垂直居中 */
display: flex !important;
}
.login-content {
/* 更严格的尺寸控制 */
width: calc(100vw - 32px);
max-width: 420px; /* 增加最大宽度 */
padding: 16px;
margin: 0 auto;
box-sizing: border-box;
display: flex;
justify-content: center;
}
.login-card {
padding: 28px 24px; /* 增加内边距 */
border-radius: 12px;
/* 确保卡片完全稳定 */
margin: 0;
box-sizing: border-box;
width: 100%;
position: relative;
/* 防止变换导致的位置偏移 */
transform: none !important;
/* 防止触摸操作影响布局 */
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
/* 防止点击时的高亮效果影响布局 */
-webkit-tap-highlight-color: transparent;
}
.login-title {
font-size: 22px;
}
.form-input {
width: 100% !important;
height: 44px !important;
padding: 12px 48px 12px 48px;
font-size: 16px; /* 防止iOS Safari缩放 */
box-sizing: border-box !important;
flex: 1 !important;
min-width: 0 !important;
}
.form-input.ant-input,
.form-input.ant-input-affix-wrapper {
width: 100% !important;
height: 44px !important;
padding: 12px 48px 12px 48px !important;
font-size: 16px !important;
box-sizing: border-box !important;
flex: 1 !important;
min-width: 0 !important;
}
.form-input.ant-input-affix-wrapper .ant-input {
width: 100% !important;
height: 100% !important;
padding: 0 !important;
border: none !important;
background: transparent !important;
flex: 1 !important;
min-width: 0 !important;
box-sizing: border-box !important;
}
.social-login {
gap: 10px;
}
.social-button {
padding: 12px 16px;
font-size: 14px;
}
.form-options {
display: flex !important;
flex-direction: row !important;
justify-content: space-between !important;
align-items: center !important;
gap: 6px !important;
width: 100% !important;
min-height: 20px !important;
flex-wrap: nowrap !important;
margin-top: 8px !important;
margin-bottom: 16px !important;
}
.checkbox-wrapper {
flex: 0 0 auto !important;
font-size: 12px !important;
white-space: nowrap !important;
overflow: hidden !important;
text-overflow: ellipsis !important;
max-width: 45% !important;
}
.forgot-password {
flex: 0 0 auto !important;
font-size: 12px !important;
margin-left: auto !important;
white-space: nowrap !important;
overflow: hidden !important;
text-overflow: ellipsis !important;
max-width: 45% !important;
}
/* 移动端优化 */
.background-pattern {
display: none;
}
/* 禁用可能影响位置的悬停效果 */
.login-card:hover {
transform: none !important;
}
}
/* 超小屏幕优化(320px及以下) */
@media (max-width: 320px) {
.login-content {
padding: 16px;
}
.login-card {
padding: 24px;
}
.form-options {
display: flex !important;
flex-direction: row !important;
justify-content: space-between !important;
align-items: center !important;
gap: 4px !important;
width: 100% !important;
flex-wrap: nowrap !important;
min-height: 18px !important;
margin-top: 6px !important;
margin-bottom: 14px !important;
}
.checkbox-wrapper {
flex: 0 0 auto !important;
font-size: 11px !important;
white-space: nowrap !important;
overflow: hidden !important;
text-overflow: ellipsis !important;
max-width: 42% !important;
line-height: 1.2 !important;
}
.forgot-password {
flex: 0 0 auto !important;
font-size: 11px !important;
margin-left: auto !important;
white-space: nowrap !important;
overflow: hidden !important;
text-overflow: ellipsis !important;
max-width: 42% !important;
line-height: 1.2 !important;
}
/* Ant Design Checkbox 的特殊处理 */
.form-options .ant-checkbox-wrapper {
flex: 0 0 auto !important;
font-size: 11px !important;
white-space: nowrap !important;
overflow: hidden !important;
text-overflow: ellipsis !important;
max-width: 42% !important;
line-height: 1.2 !important;
}
}
/* 极小屏幕优化(280px及以下) */
@media (max-width: 280px) {
.form-options {
display: flex !important;
flex-direction: row !important;
justify-content: space-between !important;
align-items: center !important;
gap: 2px !important;
width: 100% !important;
flex-wrap: nowrap !important;
min-height: 16px !important;
margin-top: 6px !important;
margin-bottom: 14px !important;
}
.form-options .ant-checkbox-wrapper {
flex: 0 0 auto !important;
font-size: 10px !important;
white-space: nowrap !important;
overflow: hidden !important;
text-overflow: ellipsis !important;
max-width: 40% !important;
line-height: 1.1 !important;
}
.form-options .forgot-password {
flex: 0 0 auto !important;
font-size: 10px !important;
margin-left: auto !important;
white-space: nowrap !important;
overflow: hidden !important;
text-overflow: ellipsis !important;
max-width: 40% !important;
line-height: 1.1 !important;
}
.form-options .ant-checkbox-wrapper .ant-checkbox {
margin-right: 2px !important;
transform: scale(0.8) !important; /* 进一步缩小checkbox */
}
}
/* 高对比度模式支持 */
@media (prefers-contrast: high) {
.login-card {
background: white;
border: 2px solid #000;
}
.form-input {
border-color: #000;
}
.form-input:focus {
border-color: #0066cc;
box-shadow: 0 0 0 2px #0066cc;
}
}
/* 减少动画模式 */
@media (prefers-reduced-motion: reduce) {
.background-pattern {
animation: none;
}
.login-card,
.form-input,
.login-button,
.social-button {
transition: none;
}
}
/* 深色模式支持 */
@media (prefers-color-scheme: dark) {
.login-background {
background: linear-gradient(135deg, #1a202c 0%, #2d3748 100%);
}
.login-card {
background: rgba(26, 32, 44, 0.95);
border-color: rgba(255, 255, 255, 0.1);
}
.login-title {
color: #f7fafc;
}
.login-subtitle {
color: #a0aec0;
}
.form-label {
color: #e2e8f0;
}
.form-input {
background: #2d3748;
border-color: #4a5568;
color: #f7fafc;
}
.form-input:focus {
border-color: #ff2442;
}
.social-button {
background: #2d3748;
border-color: #4a5568;
color: #f7fafc;
}
.signup-link {
border-color: #4a5568;
}
.signup-link p {
color: #a0aec0;
}
/* 深色模式下的错误提示样式 */
.error-message {
background: rgba(26, 32, 44, 0.95);
color: #ff6b6b;
}
/* 深色模式下的错误弹窗样式 */
.error-modal .ant-modal-header {
background: #2d3748;
border-color: #4a5568;
}
.error-modal .ant-modal-title {
color: #f7fafc;
}
.error-modal .ant-modal-body {
background: #2d3748;
color: #f7fafc;
}
.error-modal .ant-modal-footer {
background: #2d3748;
}
.error-modal .ant-modal-content {
background: #2d3748;
}
}
/* 错误提示样式 - 使用绝对定位避免影响布局 */
.error-message {
position: absolute;
top: 95%;
left: 4px;
right: 4px;
font-size: 12px;
color: #ff4d4f;
margin-top: 4px;
display: flex;
align-items: center;
min-height: 16px;
animation: fadeInDown 0.3s ease-out;
font-weight: 400;
line-height: 1.2;
background: rgba(255, 255, 255, 0.95);
backdrop-filter: blur(4px);
padding: 2px 4px;
border-radius: 4px;
z-index: 10;
pointer-events: none; /* 避免干扰用户交互 */
}
@keyframes fadeInDown {
from {
opacity: 0;
transform: translateY(-8px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
/* 输入框错误状态样式 */
.form-input.input-error,
.form-input.input-error.ant-input,
.form-input.input-error.ant-input-affix-wrapper {
border-color: #ff4d4f !important;
box-shadow: 0 0 0 2px rgba(255, 77, 79, 0.1) !important;
transition: all 0.3s ease !important;
}
.form-input.input-error:focus,
.form-input.input-error.ant-input:focus,
.form-input.input-error.ant-input-affix-wrapper:focus,
.form-input.input-error.ant-input-affix-wrapper-focused {
border-color: #ff4d4f !important;
box-shadow: 0 0 0 2px rgba(255, 77, 79, 0.2) !important;
}
/* 错误状态下的图标颜色 */
.form-input.input-error .anticon {
color: #ff4d4f !important;
}
/* 确保表单组间距一致 */
.form-group {
margin-bottom: 0px;
}
.form-group:last-of-type {
margin-bottom: 0px;
}
/* 错误弹窗样式 */
.error-modal .ant-modal-header {
background: #fff;
border-bottom: 1px solid #f0f0f0;
padding: 16px 24px;
}
.error-modal .ant-modal-title {
color: #333;
font-weight: 600;
font-size: 16px;
}
.error-modal .ant-modal-body {
padding: 16px 24px 24px;
}
.error-modal .ant-modal-footer {
padding: 12px 24px 24px;
border-top: none;
text-align: center;
}
.error-modal .ant-btn-primary {
background: #ff2442;
border-color: #ff2442;
font-weight: 500;
height: 40px;
padding: 0 24px;
border-radius: 6px;
transition: all 0.2s ease;
}
.error-modal .ant-btn-primary:hover {
background: #d91e3a;
border-color: #d91e3a;
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(255, 36, 66, 0.3);
}
.error-modal .ant-modal-content {
border-radius: 12px;
overflow: hidden;
box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15);
}
/* 错误弹窗遮罩层 */
.error-modal .ant-modal-mask {
background: rgba(0, 0, 0, 0.6);
backdrop-filter: blur(4px);
}
/* 错误弹窗动画 */
.error-modal .ant-modal {
animation: errorModalSlideIn 0.3s ease-out;
}
@keyframes errorModalSlideIn {
from {
opacity: 0;
transform: translateY(-20px) scale(0.95);
}
to {
opacity: 1;
transform: translateY(0) scale(1);
}
}