• 现代化设计:使用卡片式布局,带有柔和的阴影和圆角。
  • 响应式布局:在电脑和手机上都能完美显示。
  • 表单验证:确保用户输入了用户名和密码。
  • 加载动画:点击登录按钮后,会显示一个加载状态,提升用户体验。
  • 友好的错误提示:如果登录失败,会显示一个非侵入式的错误消息。
  • 纯HTML/CSS/JS实现:不依赖任何外部框架(如Bootstrap),方便您学习和修改。

最终效果预览

电脑端:

手机端:


第一步:HTML 结构 (骨架)

这是登录界面的基本结构,包含了标题、输入框、登录按钮和错误提示区域。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">登录页面</title>
    <link rel="stylesheet" href="style.css">
</head>
<body>
    <div class="login-container">
        <form class="login-form" id="loginForm">
            <h2>欢迎登录</h2>
            <!-- 错误提示区域 -->
            <div id="errorMessage" class="error-message" style="display: none;"></div>
            <div class="form-group">
                <label for="username">用户名</label>
                <input type="text" id="username" name="username" placeholder="请输入您的用户名" required>
            </div>
            <div class="form-group">
                <label for="password">密码</label>
                <input type="password" id="password" name="password" placeholder="请输入您的密码" required>
            </div>
            <div class="form-options">
                <label class="remember-me">
                    <input type="checkbox" name="remember">
                    <span>记住我</span>
                </label>
                <a href="#" class="forgot-password">忘记密码?</a>
            </div>
            <button type="submit" class="login-btn" id="loginBtn">
                <span id="btnText">登录</span>
                <span id="btnLoader" class="loader" style="display: none;"></span>
            </button>
        </form>
    </div>
    <script src="script.js"></script>
</body>
</html>

第二步:CSS 样式 (美化)

这部分代码负责界面的所有样式,使其看起来现代、专业。

/* style.css */
/* 全局样式和变量 */
:root {
    --primary-color: #4a90e2;
    --primary-hover-color: #357abd;
    --error-color: #e74c3c;
    --text-color: #333;
    --light-gray: #f4f7f6;
    --border-color: #ddd;
    --shadow-color: rgba(0, 0, 0, 0.1);
}
body {
    font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
    background-color: var(--light-gray);
    color: var(--text-color);
    display: flex;
    justify-content: center;
    align-items: center;
    height: 100vh;
    margin: 0;
}
/* 登录容器 */
.login-container {
    background-color: white;
    padding: 40px;
    border-radius: 10px;
    box-shadow: 0 4px 15px var(--shadow-color);
    width: 100%;
    max-width: 400px;
}
/* 表单样式 */
.login-form h2 {
    text-align: center;
    margin-bottom: 30px;
    color: var(--primary-color);
}
.form-group {
    margin-bottom: 20px;
}
.form-group label {
    display: block;
    margin-bottom: 8px;
    font-weight: 500;
}
.form-group input {
    width: 100%;
    padding: 12px;
    border: 1px solid var(--border-color);
    border-radius: 5px;
    box-sizing: border-box; /* 确保 padding 不会影响宽度 */
    font-size: 16px;
    transition: border-color 0.3s;
}
.form-group input:focus {
    outline: none;
    border-color: var(--primary-color);
}
/* 表单选项 */
.form-options {
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: 25px;
    font-size: 14px;
}
.remember-me {
    display: flex;
    align-items: center;
    cursor: pointer;
}
.remember-me input {
    margin-right: 5px;
}
.forgot-password {
    color: var(--primary-color);
    text-decoration: none;
    transition: color 0.3s;
}
.forgot-password:hover {
    color: var(--primary-hover-color);
    text-decoration: underline;
}
/* 登录按钮 */
.login-btn {
    width: 100%;
    padding: 12px;
    background-color: var(--primary-color);
    color: white;
    border: none;
    border-radius: 5px;
    font-size: 16px;
    font-weight: bold;
    cursor: pointer;
    position: relative; /* 用于定位加载动画 */
    transition: background-color 0.3s;
}
.login-btn:hover {
    background-color: var(--primary-hover-color);
}
/* 加载动画 */
.loader {
    border: 3px solid #f3f3f3;
    border-top: 3px solid white;
    border-radius: 50%;
    width: 20px;
    height: 20px;
    animation: spin 1s linear infinite;
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
}
@keyframes spin {
    0% { transform: translate(-50%, -50%) rotate(0deg); }
    100% { transform: translate(-50%, -50%) rotate(360deg); }
}
/* 错误消息 */
.error-message {
    background-color: #fde8e8;
    color: var(--error-color);
    padding: 10px;
    border-radius: 5px;
    margin-bottom: 20px;
    text-align: center;
    font-size: 14px;
    border-left: 4px solid var(--error-color);
}
/* 响应式设计 */
@media (max-width: 480px) {
    .login-container {
        padding: 25px;
        margin: 20px;
    }
}

第三步:JavaScript 功能 (交互)

这部分代码处理表单提交、验证、加载状态和错误提示。

// script.js
document.addEventListener('DOMContentLoaded', () => {
    const loginForm = document.getElementById('loginForm');
    const loginBtn = document.getElementById('loginBtn');
    const btnText = document.getElementById('btnText');
    const btnLoader = document.getElementById('btnLoader');
    const errorMessage = document.getElementById('errorMessage');
    // 模拟的用户名和密码
    // 在实际应用中,这应该通过后端API进行验证
    const validCredentials = {
        username: 'admin',
        password: '123456'
    };
    loginForm.addEventListener('submit', async (event) => {
        // 1. 阻止表单默认的提交行为(页面刷新)
        event.preventDefault();
        // 2. 获取表单数据
        const username = document.getElementById('username').value;
        const password = document.getElementById('password').value;
        // 3. 简单的前端验证
        if (!username || !password) {
            showError('请输入用户名和密码!');
            return;
        }
        // 4. 显示加载状态
        setLoadingState(true);
        // 5. 模拟网络请求延迟
        await new Promise(resolve => setTimeout(resolve, 1500));
        // 6. 验证用户凭据
        if (username === validCredentials.username && password === validCredentials.password) {
            // 登录成功
            alert('登录成功!欢迎回来!');
            // 在实际应用中,这里会重定向到主页
            // window.location.href = '/dashboard';
        } else {
            // 登录失败
            showError('用户名或密码错误!');
        }
        // 7. 恢复按钮状态
        setLoadingState(false);
    });
    function setLoadingState(isLoading) {
        if (isLoading) {
            btnText.style.display = 'none';
            btnLoader.style.display = 'block';
            loginBtn.disabled = true; // 禁用按钮,防止重复提交
        } else {
            btnText.style.display = 'inline';
            btnLoader.style.display = 'none';
            loginBtn.disabled = false;
        }
    }
    function showError(message) {
        errorMessage.textContent = message;
        errorMessage.style.display = 'block';
        // 5秒后自动隐藏错误消息
        setTimeout(() => {
            errorMessage.style.display = 'none';
        }, 5000);
    }
});

如何使用

  1. 创建文件:创建三个文件,分别命名为 index.htmlstyle.cssscript.js
  2. 复制代码:将上面对应的代码分别粘贴到这三个文件中。
  3. 放置文件:将这三个文件放在同一个文件夹下。
  4. 打开浏览器:用浏览器打开 index.html 文件,即可看到登录界面。

自定义和扩展

  • 修改样式:您可以直接在 style.css 文件中修改颜色、字体、间距等,来匹配您的品牌风格。
  • 修改验证逻辑:在 script.js 文件中,您可以替换 validCredentials 对象,改为连接真实的后端API进行用户验证。
  • 添加更多功能:您可以轻松地在HTML中添加“注册”链接,或在CSS中添加“社交账号登录”按钮的样式。

这个登录界面为您提供了一个坚实的基础,您可以根据自己的项目需求进行进一步的定制和开发。