您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 怎么用CSS实现微信小程序简洁登录页面
## 前言
在移动互联网时代,登录页面作为用户与产品交互的第一道门户,其设计直接影响用户体验和转化率。微信小程序凭借其轻量级、即用即走的特性,已成为众多企业和开发者的首选平台。本文将详细介绍如何使用CSS打造一个符合微信小程序设计规范的简洁登录页面,涵盖布局结构、样式设计、交互优化等核心知识点。
## 一、微信小程序登录页面设计原则
### 1.1 简洁性原则
微信官方设计指南强调"简洁至上",建议:
- 去除冗余信息,保留核心功能
- 使用留白创造呼吸感
- 限制色彩数量(通常不超过3种)
### 1.2 品牌一致性
- 保持与主品牌一致的色调
- 使用标准化的图标和按钮样式
- 遵循微信的视觉层次规范
### 1.3 移动优先设计
- 适配不同屏幕尺寸(重点考虑375px-414px宽度)
- 触控区域不小于44×44pt
- 优化键盘弹出时的布局
## 二、HTML结构搭建
### 2.1 基础WXML结构
```html
<view class="login-container">
<view class="header">
<image class="logo" src="/images/logo.png"></image>
<text class="title">欢迎回来</text>
</view>
<form class="form">
<view class="input-group">
<input
type="text"
placeholder="请输入手机号"
placeholder-class="placeholder"
class="input"
/>
<view class="clear-btn" wx:if="{{phoneNumber}}">×</view>
</view>
<view class="input-group">
<input
type="password"
placeholder="请输入密码"
placeholder-class="placeholder"
class="input"
/>
<view class="toggle-pwd" bindtap="togglePassword">
<image src="{{showPassword ? '/images/eye-open.png' : '/images/eye-close.png'}}"></image>
</view>
</view>
<button class="login-btn" formType="submit">登录</button>
</form>
<view class="footer">
<text class="link">忘记密码</text>
<text class="divider">|</text>
<text class="link">快速注册</text>
</view>
</view>
view替代div,符合小程序组件规范/* app.wxss */
page {
background-color: #f7f7f7;
font-family: -apple-system, BlinkMacSystemFont,
'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell,
'Open Sans', 'Helvetica Neue', sans-serif;
line-height: 1.6;
color: #333;
}
button::after {
border: none;
}
.placeholder {
color: #ccc;
}
.login-container {
display: flex;
flex-direction: column;
min-height: 100vh;
padding: 40rpx;
box-sizing: border-box;
}
.header {
display: flex;
flex-direction: column;
align-items: center;
margin: 80rpx 0 120rpx;
}
.logo {
width: 120rpx;
height: 120rpx;
margin-bottom: 30rpx;
border-radius: 24rpx;
}
.title {
font-size: 36rpx;
font-weight: 500;
color: #333;
}
.form {
width: 100%;
}
.input-group {
position: relative;
margin-bottom: 40rpx;
background: #fff;
border-radius: 8rpx;
box-shadow: 0 2rpx 6rpx rgba(0, 0, 0, 0.05);
}
.input {
width: 100%;
height: 100rpx;
padding: 0 30rpx;
font-size: 32rpx;
box-sizing: border-box;
border: 1rpx solid #eee;
border-radius: 8rpx;
transition: border-color 0.3s;
}
.input:focus {
border-color: #07C160;
}
.clear-btn, .toggle-pwd {
position: absolute;
right: 20rpx;
top: 50%;
transform: translateY(-50%);
width: 40rpx;
height: 40rpx;
display: flex;
align-items: center;
justify-content: center;
color: #999;
font-size: 36rpx;
}
.toggle-pwd image {
width: 40rpx;
height: 40rpx;
}
.login-btn {
width: 100%;
height: 90rpx;
line-height: 90rpx;
background: linear-gradient(90deg, #07C160, #09D668);
color: white;
font-size: 34rpx;
border-radius: 45rpx;
margin-top: 60rpx;
transition: opacity 0.3s;
}
.login-btn:active {
opacity: 0.8;
}
.login-btn[disabled] {
background: #ccc;
color: #fff;
}
.footer {
display: flex;
justify-content: center;
margin-top: 80rpx;
}
.link {
color: #07C160;
font-size: 28rpx;
padding: 0 20rpx;
}
.divider {
color: #ddd;
}
/* 添加输入动画 */
@keyframes inputFocus {
from { transform: scale(1); box-shadow: 0 2rpx 6rpx rgba(0, 0, 0, 0.05); }
to { transform: scale(1.01); box-shadow: 0 6rpx 12rpx rgba(7, 193, 96, 0.1); }
}
.input:focus {
animation: inputFocus 0.3s forwards;
}
/* 清除按钮过渡 */
.clear-btn {
opacity: 0;
transition: opacity 0.3s;
}
.input-group.active .clear-btn {
opacity: 1;
}
.loading-btn {
position: relative;
color: transparent !important;
}
.loading-btn::after {
content: "";
position: absolute;
left: 50%;
top: 50%;
width: 30rpx;
height: 30rpx;
margin: -15rpx 0 0 -15rpx;
border: 4rpx solid rgba(255,255,255,0.3);
border-radius: 50%;
border-top-color: #fff;
animation: spin 1s linear infinite;
}
@keyframes spin {
to { transform: rotate(360deg); }
}
@media screen and (min-width: 600px) {
.login-container {
max-width: 500px;
margin: 0 auto;
}
.input {
font-size: 16px;
}
}
// page.js
Page({
data: {
viewHeight: 0
},
onLoad() {
wx.getSystemInfo({
success: (res) => {
this.setData({ viewHeight: res.windowHeight })
}
})
}
})
/* 当键盘弹出时调整布局 */
.keyboard-up .login-container {
padding-top: 20rpx;
}
.keyboard-up .header {
margin: 0 0 60rpx;
}
<view class="login-container {{keyboardHeight > 0 ? 'keyboard-up' : ''}}">
<!-- 头部区域 -->
<view class="header">
<image class="logo" src="/images/logo.png" mode="aspectFit"></image>
<text class="title">欢迎回来</text>
</view>
<!-- 表单区域 -->
<form bindsubmit="formSubmit" class="form">
<view class="input-group {{phoneNumber ? 'active' : ''}}">
<input
name="phone"
type="number"
placeholder="请输入手机号"
placeholder-class="placeholder"
class="input"
bindinput="handlePhoneInput"
value="{{phoneNumber}}"
/>
<view class="clear-btn" bindtap="clearPhone">×</view>
</view>
<view class="input-group">
<input
name="password"
type="{{showPassword ? 'text' : 'password'}}"
placeholder="请输入密码"
placeholder-class="placeholder"
class="input"
bindinput="handlePwdInput"
/>
<view class="toggle-pwd" bindtap="togglePassword">
<image src="{{showPassword ? '/images/eye-open.png' : '/images/eye-close.png'}}"></image>
</view>
</view>
<button
class="login-btn {{isLoading ? 'loading-btn' : ''}}"
formType="submit"
disabled="{{!phoneNumber || !password || isLoading}}"
>
{{isLoading ? '' : '登录'}}
</button>
</form>
<!-- 页脚链接 -->
<view class="footer">
<text class="link" bindtap="navigateToForget">忘记密码</text>
<text class="divider">|</text>
<text class="link" bindtap="navigateToRegister">快速注册</text>
</view>
</view>
/* pages/login/login.wxss */
.login-container {
display: flex;
flex-direction: column;
min-height: 100vh;
padding: 40rpx;
box-sizing: border-box;
transition: all 0.3s ease;
}
/* 头部样式 */
.header {
display: flex;
flex-direction: column;
align-items: center;
margin: 80rpx 0 120rpx;
transition: margin 0.3s ease;
}
.logo {
width: 150rpx;
height: 150rpx;
margin-bottom: 40rpx;
border-radius: 24rpx;
box-shadow: 0 10rpx 20rpx rgba(0, 0, 0, 0.1);
}
.title {
font-size: 38rpx;
font-weight: 500;
color: #333;
letter-spacing: 1rpx;
}
/* 表单样式 */
.form {
width: 100%;
}
.input-group {
position: relative;
margin-bottom: 40rpx;
background: #fff;
border-radius: 12rpx;
box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.05);
transition: all 0.3s ease;
}
.input {
width: 100%;
height: 100rpx;
padding: 0 30rpx;
font-size: 32rpx;
box-sizing: border-box;
border: 1rpx solid #f0f0f0;
border-radius: 12rpx;
transition: all 0.3s ease;
}
.input:focus {
border-color: #07C160;
animation: inputFocus 0.3s forwards;
}
/* 功能按钮 */
.clear-btn, .toggle-pwd {
position: absolute;
right: 20rpx;
top: 50%;
transform: translateY(-50%);
width: 44rpx;
height: 44rpx;
display: flex;
align-items: center;
justify-content: center;
color: #999;
font-size: 36rpx;
border-radius: 50%;
}
.clear-btn {
background: #f0f0f0;
opacity: 0;
transition: opacity 0.3s;
}
.input-group.active .clear-btn {
opacity: 1;
}
.toggle-pwd image {
width: 36rpx;
height: 36rpx;
}
/* 登录按钮 */
.login-btn {
width: 100%;
height: 96rpx;
line-height: 96rpx;
background: linear-gradient(135deg, #07C160, #09D668);
color: white;
font-size: 34rpx;
font-weight: 500;
border-radius: 48rpx;
margin-top: 80rpx;
transition: all 0.3s ease;
box-shadow: 0 8rpx 24rpx rgba(7, 193, 96, 0.3);
}
.login-btn:active {
opacity: 0.9;
transform: translateY(2rpx);
box-shadow: 0 4rpx 12rpx rgba(7, 193, 96, 0.3);
}
.login-btn[disabled] {
background: #ccc;
color: #fff;
box-shadow: none;
transform: none;
}
/* 加载动画 */
.loading-btn::after {
content: "";
position: absolute;
left: 50%;
top: 50%;
width: 36rpx;
height: 36rpx;
margin: -18rpx 0 0 -18rpx;
border: 4rpx solid rgba(255,255,255,0.3);
border-radius: 50%;
border-top-color: #fff;
animation: spin 1s linear infinite;
}
/* 页脚链接 */
.footer {
display: flex;
justify-content: center;
margin-top: auto;
padding-bottom: 40rpx;
}
.link {
color: #07C160;
font-size: 28rpx;
padding: 0 24rpx;
font-weight: 500;
}
.divider {
color: #e0e0e0;
}
/* 动画效果 */
@keyframes inputFocus {
from { transform: scale(1); box-shadow: 0 4rpx 12rpx rgba(0, 0, 0, 0.05); }
to { transform: scale(1.01); box-shadow: 0 8rpx 24rpx rgba(7, 193, 96, 0.15); }
}
@keyframes spin {
to { transform: rotate(360deg); }
}
/* 键盘弹出状态 */
.keyboard-up .login-container {
padding-top: 20rpx;
}
.keyboard-up .header {
margin: 0 0 60rpx;
opacity: 0.8;
transform: scale(0.95);
}
// pages/login/login.js
Page({
data: {
phoneNumber: '',
password: '',
showPassword: false,
isLoading: false,
keyboardHeight: 0
},
onLoad() {
this.getWindowHeight()
this.setupKeyboardListener()
},
getWindowHeight() {
wx.getSystemInfo({
success: (res) => {
this.windowHeight = res.windowHeight
}
})
},
setupKeyboardListener() {
wx.onKeyboardHeightChange(res => {
this.setData({
keyboardHeight: res.height
})
})
},
handlePhoneInput(e) {
this.setData({
phoneNumber: e.detail.value
})
},
handlePwdInput(e) {
this.setData({
password: e.detail.value
})
},
clearPhone() {
this.setData({
phoneNumber: ''
})
},
togglePassword() {
this.setData({
showPassword: !this.data.showPassword
})
},
formSubmit(e) {
if (this.data.isLoading) return
const { phone, password } = e.detail.value
if (!phone || !password) {
wx.showToast({
title: '请填写完整信息',
icon: 'none'
})
return
}
this.setData({ isLoading: true })
// 模拟登录请求
setTimeout(() => {
this.setData({ isLoading: false })
wx.showToast({
title: '登录成功',
icon: 'success'
})
// 跳转到首页
wx.switchTab({
url: '/pages/index/index'
})
}, 1500)
},
navigateToForget() {
wx.navigateTo({
url: '/pages/forget-password/forget-password'
})
},
navigateToRegister() {
wx.navigateTo({
url: '/pages/register/register'
})
}
})
/* 推荐 */ .input {} “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。