• 现代扁平化设计: 简洁、清爽,没有多余的装饰。
  • 响应式布局: 在桌面和手机上都能完美显示。
  • 平滑动画效果: 输入框聚焦、按钮悬停等都有细腻的过渡效果。
  • 表单验证: 包含基础的客户端验证逻辑。
  • 可定制性: 使用 CSS 变量,您可以轻松修改主题色。

模板预览

这是一个桌面和移动端预览效果的示意图,您可以复制下面的代码到 HTML 文件中在浏览器中查看实际效果。

flat 登录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>)

  1. <body>: 使用 Flexbox 布局,将登录容器垂直水平居中。
  2. .login-container: 整个登录卡片的核心容器,设置了最大宽度、圆角、阴影和内边距,使其在页面上脱颖而出。
  3. .login-header: 包含标题和副标题,标题使用了渐变色,增加视觉吸引力。
  4. <form>: 表单元素,id="loginForm" 用于 JavaScript 绑定,novalidate 属性用于禁用浏览器默认的提示信息,以便我们自己控制错误提示的样式。
  5. .form-group: 每个输入框的包裹容器,方便统一管理布局和间距。
  6. <label>: 为输入框提供清晰的文本标签。
  7. .form-control: 输入框的通用样式类。
  8. .error-message: 用于显示验证错误信息的元素,默认隐藏。
  9. .btn-login: 登录按钮,样式醒目,有悬停和点击效果。
  10. .form-footer: 底部的“记住我”和“忘记密码”链接区域。

CSS 样式 (<style>)

  1. root: 定义了 CSS 变量,这是实现酷站可定制性的关键!您只需修改这里的颜色值,整个页面的配色方案就会随之改变。
  2. 扁平化设计:
    • 没有使用 border-image 或复杂的背景图。
    • 使用 box-shadow 为卡片和按钮增加层次感,但阴影非常柔和。
    • 颜色对比度高,文字清晰易读。
  3. 动画与过渡 (transition):
    • 输入框在 focus 时,边框颜色、背景色和阴影会平滑过渡,提供了良好的交互反馈。
    • 按钮在 hoveractive 时有颜色和位移变化,让用户感觉按钮是“可点击的”。
    • 整个 .login-container 在鼠标悬停时会有轻微上浮和阴影加深的效果,增加了页面的生动性。
  4. 响应式设计 (@media):
    • 当屏幕宽度小于 480px (典型手机屏幕) 时,自动减小登录卡片的内边距和外边距,确保在小屏幕设备上也有良好的体验。

JavaScript 交互 (<script>)

  1. DOM 加载完成: 使用 DOMContentLoaded 事件确保所有 HTML 元素都已加载完毕后再执行脚本。
  2. 表单提交验证:
    • 监听 submit 事件,并使用 event.preventDefault() 阻止表单默认的刷新页面行为。
    • 在提交时,检查用户名和密码是否为空。
    • 如果验证失败,给对应的输入框添加 .error 类,并显示错误信息。.error 类会改变输入框的边框颜色为红色。
  3. 实时清除错误:
    • 为每个输入框添加 input 事件监听器,当用户开始输入时,如果该输入框之前处于错误状态,则自动移除错误样式,这提供了即时的用户反馈。
  4. 模拟登录成功:
    • 如果所有验证都通过,使用 alert() 弹出提示,在实际项目中,这里应该是发送 AJAX 请求到后端服务器进行身份验证。

如何使用和定制

  1. 保存文件: 将以上代码复制并保存为 login.html 文件。
  2. 直接打开: 用 Chrome、Firefox 等现代浏览器打开该文件即可看到效果。
  3. 修改主题色: 打开文件,找到 <style> 标签内的 root 部分,修改 --primary-color 的值即可改变整个页面的主色调。
    :root {
        --primary-color: #ff6b6b; /* 改成红色 */
        /* ... 其他变量 ... */
    }
  4. 集成到项目: 您可以将此 HTML 结构、CSS 和 JS 代码整合到您现有的项目中,并根据您的后端 API 调整 JavaScript 中的登录逻辑。
flat 登录html 模板 酷站登陆
(图片来源网络,侵删)