HTML5+CSS3 登录注册页面实战:从零构建 2 个响应式表单(附完整源码)
·
HTML5+CSS3 登录注册页面实战:从零构建 2 个响应式表单(附完整源码)
在当今数字化时代,登录和注册页面是用户与网站或应用交互的第一道门槛。一个设计精良的表单不仅能提升用户体验,还能增加用户留存率。本文将带你从零开始,使用原生HTML5和CSS3技术构建两个完整的响应式表单——登录页和注册页。
1. 项目准备与环境搭建
在开始编码之前,我们需要明确几个关键点:
- 响应式设计 :确保表单在不同设备上都能良好显示
- HTML5表单验证 :利用内置验证减少JavaScript依赖
- CSS3现代特性 :使用Flexbox、Grid和过渡动画增强视觉效果
- 无障碍访问 :确保表单对所有用户都友好
首先创建一个基础项目结构:
project/
├── index.html # 登录页面
├── register.html # 注册页面
├── styles/
│ ├── main.css # 主样式文件
│ └── forms.css # 表单专用样式
└── scripts/
└── main.js # 公共JavaScript
2. 登录页面完整实现
2.1 HTML结构设计
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>用户登录</title>
<link rel="stylesheet" href="styles/main.css">
<link rel="stylesheet" href="styles/forms.css">
</head>
<body>
<div class="auth-container">
<div class="auth-card">
<h1 class="auth-title">欢迎回来</h1>
<form class="auth-form" id="loginForm">
<div class="form-group">
<label for="email">电子邮箱</label>
<input type="email" id="email" name="email" required
placeholder="请输入注册邮箱" autocomplete="username">
<span class="input-icon">✉️</span>
</div>
<div class="form-group">
<label for="password">密码</label>
<input type="password" id="password" name="password" required
placeholder="请输入密码" minlength="8" autocomplete="current-password">
<span class="input-icon">🔒</span>
<button type="button" class="toggle-password">👁️</button>
</div>
<div class="form-options">
<label class="checkbox-container">
<input type="checkbox" name="remember">
<span class="checkmark"></span>
记住我
</label>
<a href="#" class="forgot-password">忘记密码?</a>
</div>
<button type="submit" class="auth-button">登录</button>
<div class="auth-divider">
<span>或</span>
</div>
<div class="social-login">
<button type="button" class="social-button google">
<img src="assets/google.svg" alt="Google"> Google登录
</button>
<button type="button" class="social-button github">
<img src="assets/github.svg" alt="GitHub"> GitHub登录
</button>
</div>
<p class="auth-switch">
还没有账号? <a href="register.html">立即注册</a>
</p>
</form>
</div>
</div>
<script src="scripts/main.js"></script>
</body>
</html>
2.2 CSS样式实现
/* main.css 基础样式 */
:root {
--primary-color: #4361ee;
--secondary-color: #3f37c9;
--accent-color: #4895ef;
--light-color: #f8f9fa;
--dark-color: #212529;
--success-color: #4cc9f0;
--warning-color: #f72585;
--border-radius: 8px;
--box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
--transition: all 0.3s ease;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
background-color: #f5f7fa;
color: var(--dark-color);
line-height: 1.6;
}
/* forms.css 表单专用样式 */
.auth-container {
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
padding: 2rem;
}
.auth-card {
background: white;
border-radius: var(--border-radius);
box-shadow: var(--box-shadow);
width: 100%;
max-width: 450px;
padding: 2.5rem;
transition: var(--transition);
}
.auth-title {
text-align: center;
margin-bottom: 2rem;
color: var(--primary-color);
font-size: 1.8rem;
}
.form-group {
position: relative;
margin-bottom: 1.5rem;
}
.form-group label {
display: block;
margin-bottom: 0.5rem;
font-weight: 500;
color: var(--dark-color);
}
.form-group input {
width: 100%;
padding: 0.75rem 1rem 0.75rem 2.5rem;
border: 1px solid #ddd;
border-radius: var(--border-radius);
font-size: 1rem;
transition: var(--transition);
}
.form-group input:focus {
outline: none;
border-color: var(--accent-color);
box-shadow: 0 0 0 3px rgba(72, 149, 239, 0.2);
}
.input-icon {
position: absolute;
left: 1rem;
top: 50%;
transform: translateY(-50%);
color: #6c757d;
}
.toggle-password {
position: absolute;
right: 1rem;
top: 50%;
transform: translateY(-50%);
background: none;
border: none;
cursor: pointer;
color: #6c757d;
}
/* 响应式调整 */
@media (max-width: 576px) {
.auth-card {
padding: 1.5rem;
}
}
3. 注册页面进阶实现
3.1 HTML结构设计
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>用户注册</title>
<link rel="stylesheet" href="styles/main.css">
<link rel="stylesheet" href="styles/forms.css">
</head>
<body>
<div class="auth-container">
<div class="auth-card">
<h1 class="auth-title">创建账户</h1>
<form class="auth-form" id="registerForm">
<div class="form-group">
<label for="username">用户名 <span class="required">*</span></label>
<input type="text" id="username" name="username" required
placeholder="请输入用户名" minlength="3" maxlength="20">
<span class="input-icon">👤</span>
</div>
<div class="form-group">
<label for="email">电子邮箱 <span class="required">*</span></label>
<input type="email" id="email" name="email" required
placeholder="请输入有效邮箱" autocomplete="username">
<span class="input-icon">✉️</span>
</div>
<div class="form-row">
<div class="form-group">
<label for="password">密码 <span class="required">*</span></label>
<input type="password" id="password" name="password" required
placeholder="至少8个字符" minlength="8" autocomplete="new-password">
<span class="input-icon">🔒</span>
</div>
<div class="form-group">
<label for="confirmPassword">确认密码 <span class="required">*</span></label>
<input type="password" id="confirmPassword" name="confirmPassword" required
placeholder="再次输入密码" autocomplete="new-password">
<span class="input-icon">🔒</span>
</div>
</div>
<div class="form-group">
<label for="phone">手机号码</label>
<input type="tel" id="phone" name="phone"
placeholder="可选(用于找回密码)" pattern="[0-9]{11}">
<span class="input-icon">📱</span>
</div>
<div class="form-group">
<label class="checkbox-container">
<input type="checkbox" name="terms" required>
<span class="checkmark"></span>
我已阅读并同意 <a href="#">用户协议</a> 和 <a href="#">隐私政策</a>
</label>
</div>
<button type="submit" class="auth-button">注册</button>
<p class="auth-switch">
已有账号? <a href="index.html">立即登录</a>
</p>
</form>
</div>
</div>
<script src="scripts/main.js"></script>
</body>
</html>
3.2 CSS增强样式
/* forms.css 新增样式 */
.form-row {
display: flex;
gap: 1rem;
}
.form-row .form-group {
flex: 1;
}
.required {
color: var(--warning-color);
}
.checkbox-container {
display: block;
position: relative;
padding-left: 2rem;
cursor: pointer;
user-select: none;
}
.checkbox-container input {
position: absolute;
opacity: 0;
cursor: pointer;
height: 0;
width: 0;
}
.checkmark {
position: absolute;
top: 0;
left: 0;
height: 1.25rem;
width: 1.25rem;
background-color: #eee;
border-radius: 4px;
transition: var(--transition);
}
.checkbox-container:hover input ~ .checkmark {
background-color: #ccc;
}
.checkbox-container input:checked ~ .checkmark {
background-color: var(--primary-color);
}
.checkmark:after {
content: "";
position: absolute;
display: none;
left: 0.45rem;
top: 0.25rem;
width: 0.3rem;
height: 0.6rem;
border: solid white;
border-width: 0 2px 2px 0;
transform: rotate(45deg);
}
.checkbox-container input:checked ~ .checkmark:after {
display: block;
}
/* 密码强度指示器 */
.password-strength {
margin-top: 0.5rem;
height: 4px;
background: #eee;
border-radius: 2px;
overflow: hidden;
}
.strength-meter {
height: 100%;
width: 0;
transition: width 0.3s ease;
}
/* 响应式调整 */
@media (max-width: 768px) {
.form-row {
flex-direction: column;
gap: 0;
}
}
4. 交互功能与表单验证
4.1 JavaScript实现
// main.js
document.addEventListener('DOMContentLoaded', function() {
// 密码可见性切换
const togglePasswordButtons = document.querySelectorAll('.toggle-password');
togglePasswordButtons.forEach(button => {
button.addEventListener('click', function() {
const input = this.parentElement.querySelector('input');
const type = input.getAttribute('type') === 'password' ? 'text' : 'password';
input.setAttribute('type', type);
this.textContent = type === 'password' ? '👁️' : '👁️🗨️';
});
});
// 密码匹配验证
const registerForm = document.getElementById('registerForm');
if (registerForm) {
registerForm.addEventListener('submit', function(e) {
const password = document.getElementById('password');
const confirmPassword = document.getElementById('confirmPassword');
if (password.value !== confirmPassword.value) {
e.preventDefault();
confirmPassword.setCustomValidity('两次输入的密码不匹配');
confirmPassword.reportValidity();
} else {
confirmPassword.setCustomValidity('');
}
});
}
// 实时密码强度检测
const passwordInput = document.getElementById('password');
if (passwordInput) {
passwordInput.addEventListener('input', function() {
const strengthMeter = document.querySelector('.strength-meter');
if (!strengthMeter) return;
const strength = calculatePasswordStrength(this.value);
strengthMeter.style.width = `${strength.percentage}%`;
strengthMeter.style.backgroundColor = strength.color;
});
}
});
function calculatePasswordStrength(password) {
let strength = 0;
const hasUpperCase = /[A-Z]/.test(password);
const hasLowerCase = /[a-z]/.test(password);
const hasNumbers = /\d/.test(password);
const hasSpecialChars = /[!@#$%^&*(),.?":{}|<>]/.test(password);
if (password.length > 7) strength += 1;
if (password.length > 11) strength += 1;
if (hasUpperCase && hasLowerCase) strength += 1;
if (hasNumbers) strength += 1;
if (hasSpecialChars) strength += 1;
const percentage = strength * 20;
let color = '#ff0000'; // 红色
if (strength >= 4) color = '#4CAF50'; // 绿色
else if (strength >= 2) color = '#FFC107'; // 黄色
return { percentage, color };
}
4.2 HTML5表单验证增强
<!-- 在注册表单中添加密码强度指示器 -->
<div class="form-group">
<label for="password">密码 <span class="required">*</span></label>
<input type="password" id="password" name="password" required
placeholder="至少8个字符" minlength="8" autocomplete="new-password"
pattern="(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,}"
title="必须包含大小写字母和数字">
<span class="input-icon">🔒</span>
<div class="password-strength">
<div class="strength-meter"></div>
</div>
</div>
5. 响应式设计与高级技巧
5.1 媒体查询优化
/* 针对不同屏幕尺寸的优化 */
@media (max-width: 768px) {
.auth-card {
padding: 1.5rem;
}
.auth-title {
font-size: 1.5rem;
}
.form-group input {
padding: 0.6rem 1rem 0.6rem 2.2rem;
}
.input-icon {
left: 0.8rem;
font-size: 0.9rem;
}
}
@media (max-width: 480px) {
.auth-container {
padding: 1rem;
}
.auth-card {
padding: 1.2rem;
}
.auth-title {
margin-bottom: 1.5rem;
}
}
5.2 CSS变量与主题切换
/* 添加深色模式支持 */
@media (prefers-color-scheme: dark) {
:root {
--light-color: #212529;
--dark-color: #f8f9fa;
}
body {
background-color: #121212;
color: var(--dark-color);
}
.auth-card {
background: #2d2d2d;
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3);
}
.form-group input {
background: #3d3d3d;
border-color: #4d4d4d;
color: white;
}
.form-group input:focus {
box-shadow: 0 0 0 3px rgba(72, 149, 239, 0.3);
}
}
5.3 微交互与动画效果
/* 添加微交互提升用户体验 */
.auth-button {
transition: var(--transition);
transform: translateY(0);
}
.auth-button:hover {
transform: translateY(-2px);
box-shadow: 0 6px 12px rgba(0, 0, 0, 0.1);
}
.auth-button:active {
transform: translateY(0);
}
/* 表单错误状态 */
input:invalid {
border-color: var(--warning-color);
}
input:invalid:focus {
box-shadow: 0 0 0 3px rgba(247, 37, 133, 0.2);
}
/* 加载动画 */
@keyframes spin {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
.loading {
display: inline-block;
width: 1rem;
height: 1rem;
border: 2px solid rgba(255, 255, 255, 0.3);
border-radius: 50%;
border-top-color: white;
animation: spin 1s ease-in-out infinite;
margin-right: 0.5rem;
}
更多推荐


所有评论(0)