当前位置: 首页 > news >正文

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; }
http://www.jsqmd.com/news/1131989/

相关文章:

  • 终极游戏模组管理器:XXMI-Launcher让你的游戏体验焕然一新
  • 从Viola-Jones到YOLO:目标检测20年演进中的3个关键范式转变
  • PostgreSQL 16.3 Windows 安装:3种端口冲突解决方案与 pgAdmin 4 连接测试
  • HarmonyKit | 鸿蒙新特性实战:从零构建开发者工具箱
  • SolidWorks_装配体设计11_间隙验证与测量
  • PyTorch BCEWithLogitsLoss pos_weight 参数详解:5:1 样本比下的 3 种加权策略对比
  • Proxmox VE 6.2 同机换盘迁移:3步恢复配置与4个常见启动错误排查
  • NumPy 与 PyTorch 矩阵运算对比:5个核心操作在 CPU/GPU 上的性能基准测试
  • UEFI Handle/Protocol 核心链表解析:6条链表交互与源码级图解
  • PyTorch 1.13 光伏功率预测实战:4种神经网络模型对比与72小时预测误差分析
  • C++ TensorRT Edge-LLM 边缘推理框架:从原理到实战
  • WinCC V7.5 VBS脚本操作SQL Server 2016:4种CRUD操作完整代码与3个关键连接参数
  • Linux LVM 根目录 100% 磁盘打满:3步定位 MySQL 日志并安全清理
  • MySQL 元数据查询对比:INFORMATION_SCHEMA vs SHOW 命令 vs DESC
  • MySQL 单元 6 数据视图学习笔记
  • Momentum 与 Adam 优化器对比:从 2D 损失曲面到 ResNet-18 训练效率分析
  • 提示词工程实战:从基础指令到RAG与Agent的AI应用开发指南
  • LitePal 3.2.3 数据库升级实战:3步完成表结构变更与数据迁移
  • Ubuntu 22.04 dpkg lock-frontend 锁冲突:3步精准定位并安全终止占用进程
  • 如何快速掌握Spek频谱分析器:面向初学者的完整音频分析指南
  • 领取Ai大模型token了
  • MySQL 8.2 命令行效率提升:3个高级技巧与5个常见错误规避
  • 5分钟搭建RobotFramework+SeleniumLibrary自动化测试环境
  • ANI-RSS元数据刮削:3步打造专业级动漫媒体库
  • 在团队中如何推行一项新的实践
  • PostgreSQL 17.0 与 pgAdmin 4 v9.16 协同部署:Windows 11 环境 5 步配置详解
  • SolidWorks_装配体设计14_装配体配置管理
  • 社会大洗牌的馈赠的具象化的庖丁解牛
  • MySQL 5.7/8.0 常用操作命令速查:数据库、表、数据增删改查的15个核心指令
  • SQL Server 2012 安装后密钥查询:3种方法找回已安装版本的序列号