Files
frontend/src/pages/login/index.css

515 lines
10 KiB
CSS
Raw Normal View History

/* ============================================
登录页面样式 - 爱印通 Apple Liquid Glass 设计系统
大字体大控件版本 - 微信小程序优化
============================================ */
@import '../../styles/variables.css';
page {
background: var(--bg-page-gradient);
min-height: 100vh;
}
.login-page {
min-height: 100vh;
padding: 160rpx 48rpx 96rpx;
display: flex;
flex-direction: column;
position: relative;
}
/* ========== 头部区域 ========== */
.login-header {
text-align: center;
margin-bottom: 80rpx;
animation: fadeInDown 0.6s cubic-bezier(0.34, 1.56, 0.64, 1) forwards;
}
.login-logo {
width: 144rpx;
height: 144rpx;
background: var(--primary-gradient);
border-radius: var(--radius-xl);
display: flex;
align-items: center;
justify-content: center;
margin: 0 auto 40rpx;
box-shadow: 0 16rpx 48rpx rgba(0, 122, 255, 0.25);
font-size: 72rpx;
position: relative;
overflow: hidden;
}
.login-logo::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent 0%, rgba(255,255,255,0.3) 50%, transparent 100%);
animation: logoShimmer 3s ease-in-out infinite;
}
@keyframes logoShimmer {
0%, 100% { left: -100%; }
50% { left: 100%; }
}
.login-title {
font-size: 64rpx;
font-weight: 700;
color: var(--text-primary);
letter-spacing: -0.5px;
display: block;
margin-bottom: 16rpx;
line-height: 1.2;
}
.login-subtitle {
font-size: 30rpx;
color: var(--text-tertiary);
display: block;
font-weight: 400;
}
/* ========== 表单卡片 ========== */
.login-form {
background: var(--bg-glass-heavy);
backdrop-filter: blur(48rpx) saturate(180%);
-webkit-backdrop-filter: blur(48rpx) saturate(180%);
border-radius: var(--radius-2xl);
padding: 64rpx 48rpx;
box-shadow: var(--shadow-xl);
border: 1px solid var(--glass-border);
animation: springUp 0.6s cubic-bezier(0.34, 1.56, 0.64, 1) 0.15s forwards;
opacity: 0;
}
@keyframes springUp {
0% {
opacity: 0;
transform: translateY(60rpx) scale(0.95);
}
50% {
transform: translateY(-10rpx) scale(1.01);
}
100% {
opacity: 1;
transform: translateY(0) scale(1);
}
}
.form-item {
margin-bottom: 40rpx;
}
.form-label {
font-size: 28rpx;
color: var(--text-secondary);
font-weight: 500;
display: block;
margin-bottom: 16rpx;
padding-left: 8rpx;
letter-spacing: 0.3px;
}
.form-input {
width: 100%;
height: 96rpx;
background: var(--glass-background);
backdrop-filter: blur(32rpx);
-webkit-backdrop-filter: blur(32rpx);
border-radius: var(--radius-md);
padding: 0 32rpx;
font-size: 32rpx;
color: var(--text-primary);
border: 2rpx solid var(--border-primary);
transition: all var(--transition-base);
outline: none;
}
.form-input:focus {
border-color: var(--primary);
background: var(--bg-card-solid);
box-shadow: 0 0 0 6rpx var(--primary-opacity-20);
}
.form-input::placeholder {
color: var(--text-placeholder);
}
.form-error {
font-size: 26rpx;
color: var(--error);
margin-top: 12rpx;
display: block;
padding-left: 8rpx;
font-weight: 400;
}
/* ========== 登录相关样式 ========== */
.login-btn {
width: 100%;
height: 88rpx;
background: var(--primary);
color: var(--text-inverse);
font-size: 32rpx;
font-weight: 700;
border-radius: var(--radius-md);
display: flex;
align-items: center;
justify-content: center;
margin-top: 48rpx;
/* 增强的多层边框描边 */
border: 3rpx solid rgba(0, 122, 255, 0.5);
outline: 1rpx solid rgba(255, 255, 255, 0.3);
outline-offset: -3rpx;
/* 增强的阴影效果 */
box-shadow:
0 8rpx 32rpx rgba(0, 122, 255, 0.3),
0 2rpx 8rpx rgba(0, 0, 0, 0.1),
inset 0 1rpx 0 rgba(255, 255, 255, 0.3),
inset 0 -1rpx 0 rgba(0, 0, 0, 0.1);
transition: all var(--transition-scale);
letter-spacing: 1rpx;
cursor: pointer;
position: relative;
overflow: hidden;
}
/* 按钮内部光泽效果 */
.login-btn::before {
content: '';
position: absolute;
top: 0;
left: -100%;
width: 100%;
height: 100%;
background: linear-gradient(90deg, transparent 0%, rgba(255, 255, 255, 0.2) 50%, transparent 100%);
transition: left 0.5s ease;
}
.login-btn:active::before {
left: 100%;
}
.login-btn:active {
transform: scale(0.98);
border-color: rgba(0, 122, 255, 0.7);
box-shadow:
0 4rpx 16rpx rgba(0, 122, 255, 0.2),
0 1rpx 4rpx rgba(0, 0, 0, 0.08),
inset 0 1rpx 0 rgba(255, 255, 255, 0.2);
}
.login-btn[disabled],
.login-btn.disabled {
background: var(--border-primary);
color: var(--text-tertiary);
border-color: rgba(0, 0, 0, 0.1);
box-shadow: none;
outline: none;
}
/* ========== 用户协议复选框 ========== */
.agreement-section {
display: flex;
align-items: flex-start;
margin-top: 40rpx;
padding: 24rpx;
background: rgba(0, 122, 255, 0.03);
border-radius: var(--radius-md);
border: 1px solid rgba(0, 122, 255, 0.08);
}
.agreement-checkbox {
display: flex;
align-items: center;
margin-right: 16rpx;
flex-shrink: 0;
}
.checkbox-input {
width: 40rpx;
height: 40rpx;
border: 3rpx solid var(--border-primary);
border-radius: 8rpx;
display: flex;
align-items: center;
justify-content: center;
transition: all var(--transition-base);
background: #fff;
}
.checkbox-input.checked {
background: var(--primary);
border-color: var(--primary);
}
.checkbox-icon {
width: 24rpx;
height: 24rpx;
color: #fff;
display: none;
}
.checkbox-input.checked .checkbox-icon {
display: flex;
align-items: center;
justify-content: center;
}
.agreement-text {
font-size: 24rpx;
color: var(--text-secondary);
line-height: 1.5;
}
.agreement-text .link {
color: var(--primary);
font-weight: 500;
text-decoration: none;
}
/* ========== 分割线 ========== */
.divider {
display: flex;
align-items: center;
margin: 48rpx 0;
}
.divider-line {
flex: 1;
height: 2rpx;
background: var(--border-separator);
}
.divider-text {
padding: 0 32rpx;
font-size: 28rpx;
color: var(--text-secondary);
white-space: nowrap;
font-weight: 500;
}
/* ========== 微信登录按钮 ========== */
.wechat-btn {
width: 100%;
height: 88rpx;
background: #07C160;
color: #ffffff;
font-size: 32rpx;
font-weight: 600;
border-radius: var(--radius-md);
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 8rpx 32rpx rgba(7, 193, 96, 0.25);
transition: all var(--transition-scale);
letter-spacing: 1rpx;
border: none;
cursor: pointer;
}
.wechat-btn:active {
transform: scale(0.98);
opacity: 0.95;
}
/* ========== 手机号一键登录按钮 ========== */
.phone-btn {
width: 100%;
height: 88rpx;
background: var(--primary);
color: #07C160;
font-size: 32rpx;
font-weight: 600;
border-radius: var(--radius-md);
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 8rpx 32rpx rgba(0, 122, 255, 0.25);
transition: all var(--transition-scale);
letter-spacing: 1rpx;
border: none;
cursor: pointer;
}
.phone-btn:active {
transform: scale(0.98);
opacity: 0.95;
}
/* ========== 底部链接 ========== */
.login-footer {
display: flex;
justify-content: center;
align-items: center;
margin-top: 64rpx;
flex-wrap: wrap;
gap: 8rpx;
}
.footer-text {
font-size: 28rpx;
color: var(--text-secondary);
font-weight: 400;
}
.link-text {
font-size: 28rpx;
color: var(--primary);
font-weight: 500;
text-decoration: none;
transition: opacity var(--transition-fast);
}
.link-text:active {
opacity: 0.7;
}
/* ========== 昵称弹窗 ========== */
.nickname-modal {
background: var(--bg-glass-heavy);
backdrop-filter: blur(64rpx) saturate(180%);
-webkit-backdrop-filter: blur(64rpx) saturate(180%);
border-radius: var(--radius-2xl);
padding: 72rpx 56rpx;
margin-top: 160rpx;
box-shadow: var(--shadow-xl);
border: 1px solid var(--glass-border);
animation: modalSpringIn 0.4s cubic-bezier(0.34, 1.56, 0.64, 1) forwards;
}
@keyframes modalSpringIn {
0% {
opacity: 0;
transform: scale(0.9) translateY(40rpx);
}
60% {
transform: scale(1.02) translateY(-10rpx);
}
100% {
opacity: 1;
transform: scale(1) translateY(0);
}
}
.modal-title {
font-size: 44rpx;
font-weight: 700;
color: var(--text-primary);
display: block;
text-align: center;
margin-bottom: 16rpx;
letter-spacing: -0.3px;
}
.modal-subtitle {
font-size: 30rpx;
color: var(--text-tertiary);
display: block;
text-align: center;
margin-bottom: 56rpx;
font-weight: 400;
}
.nickname-input {
width: 100%;
height: 96rpx;
background: var(--glass-background);
backdrop-filter: blur(32rpx);
-webkit-backdrop-filter: blur(32rpx);
border-radius: var(--radius-md);
padding: 0 32rpx;
font-size: 32rpx;
color: var(--text-primary);
border: 2rpx solid var(--border-primary);
margin-bottom: 40rpx;
transition: all var(--transition-base);
outline: none;
}
.nickname-input:focus {
border-color: var(--primary);
background: var(--bg-card-solid);
box-shadow: 0 0 0 6rpx var(--primary-opacity-20);
}
.nickname-input::placeholder {
color: var(--text-placeholder);
}
.submit-nickname-btn {
width: 100%;
height: 88rpx;
background: var(--primary);
color: var(--text-inverse);
font-size: 32rpx;
font-weight: 600;
border-radius: var(--radius-md);
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 8rpx 32rpx rgba(0, 122, 255, 0.25);
border: none;
cursor: pointer;
transition: all var(--transition-scale);
}
.submit-nickname-btn:active {
transform: scale(0.98);
}
/* ========== 动画 ========== */
@keyframes fadeInDown {
from {
opacity: 0;
transform: translateY(-32rpx);
}
to {
opacity: 1;
transform: translateY(0);
}
}
/* ========== 装饰光晕 ========== */
.login-page::before {
content: '';
position: fixed;
top: -300rpx;
right: -300rpx;
width: 800rpx;
height: 800rpx;
background: radial-gradient(circle, rgba(0, 122, 255, 0.08) 0%, transparent 70%);
border-radius: 50%;
pointer-events: none;
z-index: 0;
}
.login-page::after {
content: '';
position: fixed;
bottom: -200rpx;
left: -200rpx;
width: 700rpx;
height: 700rpx;
background: radial-gradient(circle, rgba(90, 200, 250, 0.06) 0%, transparent 70%);
border-radius: 50%;
pointer-events: none;
z-index: 0;
}