- 现代扁平化设计: 简洁、清爽,没有多余的装饰。
- 响应式布局: 在桌面和手机上都能完美显示。
- 平滑动画效果: 输入框聚焦、按钮悬停等都有细腻的过渡效果。
- 表单验证: 包含基础的客户端验证逻辑。
- 可定制性: 使用 CSS 变量,您可以轻松修改主题色。
模板预览
这是一个桌面和移动端预览效果的示意图,您可以复制下面的代码到 HTML 文件中在浏览器中查看实际效果。

(图片来源网络,侵删)
完整 HTML 代码
您可以直接将以下所有代码复制到一个 .html 文件中,然后用浏览器打开即可。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">酷站登陆 - Cool Login</title>
<style>
/* --- 全局样式 & CSS 变量 --- */
:root {
--primary-color: #007bff;
--primary-hover-color: #0056b3;
--background-color: #f4f7f6;
--card-background: #ffffff;
--text-color: #333333;
--text-secondary: #6c757d;
--input-border-color: #ced4da;
--input-focus-border-color: var(--primary-color);
--error-color: #dc3545;
}
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
background-color: var(--background-color);
color: var(--text-color);
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
line-height: 1.6;
}
/* --- 登录容器 --- */
.login-container {
background-color: var(--card-background);
border-radius: 10px;
box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
width: 100%;
max-width: 400px;
padding: 40px 30px;
transition: transform 0.3s ease;
}
.login-container:hover {
transform: translateY(-5px);
box-shadow: 0 8px 30px rgba(0, 0, 0, 0.12);
}
.login-header {
text-align: center;
margin-bottom: 30px;
}
.login-header h1 {
font-size: 28px;
font-weight: 600;
margin-bottom: 10px;
background: linear-gradient(135deg, var(--primary-color), #00c6ff);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
background-clip: text;
}
.login-header p {
font-size: 14px;
color: var(--text-secondary);
}
/* --- 表单元素 --- */
.form-group {
margin-bottom: 20px;
position: relative;
}
.form-group label {
display: block;
margin-bottom: 8px;
font-size: 14px;
font-weight: 500;
color: var(--text-color);
}
.form-control {
width: 100%;
padding: 12px 15px;
font-size: 16px;
border: 1px solid var(--input-border-color);
border-radius: 8px;
background-color: #f8f9fa;
transition: all 0.3s ease;
outline: none;
}
.form-control:focus {
border-color: var(--input-focus-border-color);
background-color: #fff;
box-shadow: 0 0 0 3px rgba(0, 123, 255, 0.1);
}
.form-control.error {
border-color: var(--error-color);
}
.error-message {
color: var(--error-color);
font-size: 12px;
margin-top: 5px;
display: none;
}
.error-message.show {
display: block;
}
/* --- 登录按钮 --- */
.btn-login {
width: 100%;
padding: 12px;
font-size: 16px;
font-weight: 600;
color: #fff;
background-color: var(--primary-color);
border: none;
border-radius: 8px;
cursor: pointer;
transition: background-color 0.3s ease, transform 0.2s ease;
}
.btn-login:hover {
background-color: var(--primary-hover-color);
transform: translateY(-2px);
}
.btn-login:active {
transform: translateY(0);
}
/* --- 额外链接 --- */
.form-footer {
display: flex;
justify-content: space-between;
align-items: center;
margin-top: 25px;
font-size: 14px;
}
.form-footer a {
color: var(--primary-color);
text-decoration: none;
transition: color 0.3s ease;
}
.form-footer a:hover {
color: var(--primary-hover-color);
text-decoration: underline;
}
.checkbox-group {
display: flex;
align-items: center;
}
.checkbox-group input[type="checkbox"] {
margin-right: 8px;
cursor: pointer;
}
/* --- 响应式设计 --- */
@media (max-width: 480px) {
.login-container {
padding: 30px 20px;
margin: 20px;
}
.login-header h1 {
font-size: 24px;
}
}
</style>
</head>
<body>
<div class="login-container">
<div class="login-header">
<h1>欢迎回来</h1>
<p>请登录您的账户以继续</p>
</div>
<form id="loginForm" novalidate>
<div class="form-group">
<label for="username">用户名 / 邮箱</label>
<input type="text" class="form-control" id="username" placeholder="请输入用户名或邮箱" required>
<div class="error-message" id="username-error">请输入有效的用户名或邮箱</div>
</div>
<div class="form-group">
<label for="password">密码</label>
<input type="password" class="form-control" id="password" placeholder="请输入密码" required>
<div class="error-message" id="password-error">密码不能为空</div>
</div>
<div class="form-footer">
<div class="checkbox-group">
<input type="checkbox" id="remember-me">
<label for="remember-me">记住我</label>
</div>
<a href="#">忘记密码?</a>
</div>
<button type="submit" class="btn-login">立即登录</button>
</form>
</div>
<script>
document.addEventListener('DOMContentLoaded', function() {
const loginForm = document.getElementById('loginForm');
const usernameInput = document.getElementById('username');
const passwordInput = document.getElementById('password');
const usernameError = document.getElementById('username-error');
const passwordError = document.getElementById('password-error');
// 表单提交验证
loginForm.addEventListener('submit', function(event) {
event.preventDefault(); // 阻止表单默认提交行为
let isValid = true;
// 重置错误状态
usernameInput.classList.remove('error');
passwordInput.classList.remove('error');
usernameError.classList.remove('show');
passwordError.classList.remove('show');
// 验证用户名
if (usernameInput.value.trim() === '') {
usernameInput.classList.add('error');
usernameError.classList.add('show');
isValid = false;
}
// 验证密码
if (passwordInput.value.trim() === '') {
passwordInput.classList.add('error');
passwordError.classList.add('show');
isValid = false;
}
// 如果验证通过,这里可以执行登录逻辑(AJAX 请求)
if (isValid) {
alert('登录成功!\n(此处为演示,实际项目中会发送数据到服务器)');
// 在实际项目中,你可以在这里添加代码来发送数据到服务器
// fetch('/api/login', { method: 'POST', body: ... })
}
});
// 输入时移除错误状态
usernameInput.addEventListener('input', function() {
if (this.classList.contains('error')) {
this.classList.remove('error');
usernameError.classList.remove('show');
}
});
passwordInput.addEventListener('input', function() {
if (this.classList.contains('error')) {
this.classList.remove('error');
passwordError.classList.remove('show');
}
});
});
</script>
</body>
</html>
代码解析
HTML 结构 (<body>)
<body>: 使用 Flexbox 布局,将登录容器垂直水平居中。.login-container: 整个登录卡片的核心容器,设置了最大宽度、圆角、阴影和内边距,使其在页面上脱颖而出。.login-header: 包含标题和副标题,标题使用了渐变色,增加视觉吸引力。<form>: 表单元素,id="loginForm"用于 JavaScript 绑定,novalidate属性用于禁用浏览器默认的提示信息,以便我们自己控制错误提示的样式。.form-group: 每个输入框的包裹容器,方便统一管理布局和间距。<label>: 为输入框提供清晰的文本标签。.form-control: 输入框的通用样式类。.error-message: 用于显示验证错误信息的元素,默认隐藏。.btn-login: 登录按钮,样式醒目,有悬停和点击效果。.form-footer: 底部的“记住我”和“忘记密码”链接区域。
CSS 样式 (<style>)
root: 定义了 CSS 变量,这是实现酷站可定制性的关键!您只需修改这里的颜色值,整个页面的配色方案就会随之改变。- 扁平化设计:
- 没有使用
border-image或复杂的背景图。 - 使用
box-shadow为卡片和按钮增加层次感,但阴影非常柔和。 - 颜色对比度高,文字清晰易读。
- 没有使用
- 动画与过渡 (
transition):- 输入框在
focus时,边框颜色、背景色和阴影会平滑过渡,提供了良好的交互反馈。 - 按钮在
hover和active时有颜色和位移变化,让用户感觉按钮是“可点击的”。 - 整个
.login-container在鼠标悬停时会有轻微上浮和阴影加深的效果,增加了页面的生动性。
- 输入框在
- 响应式设计 (
@media):- 当屏幕宽度小于
480px(典型手机屏幕) 时,自动减小登录卡片的内边距和外边距,确保在小屏幕设备上也有良好的体验。
- 当屏幕宽度小于
JavaScript 交互 (<script>)
- DOM 加载完成: 使用
DOMContentLoaded事件确保所有 HTML 元素都已加载完毕后再执行脚本。 - 表单提交验证:
- 监听
submit事件,并使用event.preventDefault()阻止表单默认的刷新页面行为。 - 在提交时,检查用户名和密码是否为空。
- 如果验证失败,给对应的输入框添加
.error类,并显示错误信息。.error类会改变输入框的边框颜色为红色。
- 监听
- 实时清除错误:
- 为每个输入框添加
input事件监听器,当用户开始输入时,如果该输入框之前处于错误状态,则自动移除错误样式,这提供了即时的用户反馈。
- 为每个输入框添加
- 模拟登录成功:
- 如果所有验证都通过,使用
alert()弹出提示,在实际项目中,这里应该是发送 AJAX 请求到后端服务器进行身份验证。
- 如果所有验证都通过,使用
如何使用和定制
- 保存文件: 将以上代码复制并保存为
login.html文件。 - 直接打开: 用 Chrome、Firefox 等现代浏览器打开该文件即可看到效果。
- 修改主题色: 打开文件,找到
<style>标签内的root部分,修改--primary-color的值即可改变整个页面的主色调。:root { --primary-color: #ff6b6b; /* 改成红色 */ /* ... 其他变量 ... */ } - 集成到项目: 您可以将此 HTML 结构、CSS 和 JS 代码整合到您现有的项目中,并根据您的后端 API 调整 JavaScript 中的登录逻辑。

(图片来源网络,侵删)
