使用Html做一个简单的登陆页面|从零开始:用 Vue.js 构建实用的登录注册页面(附完整源码) 新手友好:使用 Vue.js 实现带验证码的登录注册功能 超详细教程:用 Vue.js 打造响应式登

效果图(完整代码在后面):
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

目录

  • 步骤
  • 一、新建一个 HTML 项目
  • 二、创建基本结构
  • 三、使用 CSS 美化页面
  • 四、添加交互功能

在 Web 开发中,登录页面是最基础也是最常见的页面之一。对于想要成为前端开发工程师的朋友来说,掌握如何制作一个简洁美观的登录页面是必不可少的技能。本篇教程将手把手教你如何使用 HTML、CSS 和 JavaScript(以及 Vue.js)构建一个具有登录、注册、找回密码和验证码登录功能的页面。


一、新建一个 HTML 项目

首先,我们需要创建一个新的 HTML 文件。你可以使用任何你喜欢的代码编辑器,如 VSCode、Sublime Text 或 WebStorm。在你的项目文件夹中创建一个名为 index.html 的文件,并输入以下基本结构:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>登录页面</title>
</head>
<body>

</body>
</html>

这段代码是一个标准的 HTML 页面结构,包含了 DOCTYPE 声明、语言属性、字符编码和标题。


二、创建基本结构

接下来,我们将在 <body> 标签中添加页面的基本结构,包括登录、注册和找回密码的表单。

<body>
    <div id="app" class="container">
        <!-- 登录表单 -->
        <form v-if="currentForm === 'login'" @submit.prevent="login">
            <!-- 表单内容 -->
        </form>

        <!-- 注册表单 -->
        <form v-else-if="currentForm === 'register'" @submit.prevent="register">
            <!-- 表单内容 -->
        </form>

        <!-- 找回密码表单 -->
        <form v-else-if="currentForm === 'forgotPassword'" @submit.prevent="resetPassword">
            <!-- 表单内容 -->
        </form>

        <!-- 切换表单链接 -->
        <div class="switch-form">
            <!-- 链接内容 -->
        </div>
    </div>

    <!-- 引入 Vue.js -->
    <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
    <!-- 编写 Vue 实例 -->
    <script>
        new Vue({
            el: '#app',
            data: {
                currentForm: 'login', // 当前显示的表单
                // 其他数据
            },
            methods: {
                // 方法
            }
        });
    </script>
</body>

在这里,我们使用了 Vue.js 来管理页面的状态和交互。通过 v-if 指令,我们可以根据 currentForm 的值来显示不同的表单。


三、使用 CSS 美化页面

为了使页面更加美观,我们需要添加一些 CSS 样式。在 <head> 标签中添加 <style> 标签,编写我们的样式:

<head>
    <meta charset="UTF-8">
    <title>登录页面</title>
    <style>
        body, html {
            margin: 0;
            padding: 0;
            height: 100%;
            font-family: Arial, sans-serif;
            background: linear-gradient(135deg, #89f7fe 0%, #66a6ff 100%);
            display: flex;
            justify-content: center;
            align-items: center;
        }

        .container {
            background-color: #fff;
            padding: 40px;
            border-radius: 8px;
            box-shadow: 0 8px 20px rgba(0, 0, 0, 0.1);
            width: 100%;
            max-width: 750px;
        }

        h1 {
            text-align: center;
            margin-bottom: 30px;
        }

        .input-group {
            margin-bottom: 20px;
        }

        .input-group label {
            display: block;
            margin-bottom: 8px;
            font-size: 14px;
            color: #333;
        }

        .input-group input {
            width: 100%;
            padding: 10px;
            border: 1px solid #dfe3e8;
            border-radius: 4px;
            font-size: 14px;
        }

        input[type="submit"] {
            width: 100%;
            padding: 12px;
            background-color: #66a6ff;
            border: none;
            border-radius: 4px;
            color: #fff;
            font-size: 16px;
            cursor: pointer;
        }

        input[type="submit"]:hover {
            background-color: #559af0;
        }

        .switch-form, .forgot-password {
            text-align: center;
            margin-top: 15px;
        }

        .switch-form a, .forgot-password a {
            color: #66a6ff;
            text-decoration: none;
        }

        .switch-form a:hover, .forgot-password a:hover {
            text-decoration: underline;
        }

        .verification-code {
            position: relative;
        }

        .verification-code button {
            position: absolute;
            right: 10px;
            top: 32px;
            padding: 6px 10px;
            background-color: #66a6ff;
            color: #fff;
            border: none;
            border-radius: 3px;
            cursor: pointer;
            font-size: 12px;
        }

        .verification-code button:disabled {
            background-color: #ccc;
            cursor: not-allowed;
        }
    </style>
</head>

这些样式使得我们的表单看起来更加专业和友好。


四、添加交互功能

现在,我们来完善 Vue.js 的部分,添加交互功能和数据绑定。在 <script> 标签中,更新 Vue 实例:

<script>
    new Vue({
        el: '#app',
        data: {
            currentForm: 'login', // 当前显示的表单:login, register, forgotPassword
            loginMethod: 'password', // 登录方式:password, code
            loginData: {
                username: '',
                password: '',
                code: '',
                rememberMe: false
            },
            registerData: {
                username: '',
                email: '',
                password: ''
            },
            forgotData: {
                email: '',
                code: '',
                password: ''
            },
            countdown: 0, // 登录验证码倒计时
            forgotCountdown: 0 // 找回密码验证码倒计时
        },
        methods: {
            switchForm(form) {
                this.currentForm = form;
                this.clearData();
            },
            toggleLoginMethod() {
                this.loginMethod = this.loginMethod === 'password' ? 'code' : 'password';
                this.loginData.password = '';
                this.loginData.code = '';
            },
            login() {
                // 登录逻辑
                if (this.loginMethod === 'password') {
                    alert(`用户名:${this.loginData.username}\n密码:${this.loginData.password}`);
                } else {
                    alert(`用户名:${this.loginData.username}\n验证码:${this.loginData.code}`);
                }
            },
            register() {
                // 注册逻辑
                alert(`用户名:${this.registerData.username}\n邮箱:${this.registerData.email}\n密码:${this.registerData.password}`);
            },
            resetPassword() {
                // 重置密码逻辑
                alert(`邮箱:${this.forgotData.email}\n验证码:${this.forgotData.code}\n新密码:${this.forgotData.password}`);
            },
            sendLoginCode() {
                if (this.countdown === 0) {
                    alert('验证码已发送到您的手机!');
                    this.countdown = 60;
                    const interval = setInterval(() => {
                        if (this.countdown > 0) {
                            this.countdown--;
                        } else {
                            clearInterval(interval);
                        }
                    }, 1000);
                }
            },
            sendForgotCode() {
                if (this.forgotCountdown === 0) {
                    alert('验证码已发送到您的邮箱!');
                    this.forgotCountdown = 60;
                    const interval = setInterval(() => {
                        if (this.forgotCountdown > 0) {
                            this.forgotCountdown--;
                        } else {
                            clearInterval(interval);
                        }
                    }, 1000);
                }
            },
            clearData() {
                // 清空所有表单数据
                this.loginData = { username: '', password: '', code: '', rememberMe: false };
                this.registerData = { username: '', email: '', password: '' };
                this.forgotData = { email: '', code: '', password: '' };
                this.countdown = 0;
                this.forgotCountdown = 0;
            }
        }
    });
</script>

通过这些代码,我们实现了以下功能:

  • 表单切换:可以在登录、注册、找回密码之间切换。
  • 登录方式切换:在密码登录和验证码登录之间切换。
  • 倒计时功能:发送验证码后,按钮进入倒计时,防止重复发送。
  • 数据绑定:输入框的数据与 Vue 实例的数据同步。

完整代码

将以上部分组合在一起,得到完整的代码:

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <title>登录页面</title>
    <!-- 样式部分 -->
    <style>
        body, html {
            margin: 0;
            padding: 0;
            height: 100%;
            font-family: Arial, sans-serif;
            background: linear-gradient(135deg, #89f7fe 0%, #66a6ff 100%);
            display: flex;
            justify-content: center;
            align-items: center;
        }

        .container {
            background-color: #fff;
            padding: 40px;
            border-radius: 8px;
            box-shadow: 0 8px 20px rgba(0, 0, 0, 0.1);
            width: 100%;
            max-width: 750px;
        }

        h1 {
            text-align: center;
            margin-bottom: 30px;
        }

        .input-group {
            margin-bottom: 20px;
        }

        .input-group label {
            display: block;
            margin-bottom: 8px;
            font-size: 14px;
            color: #333;
        }

        .input-group input {
            width: 100%;
            padding: 10px;
            border: 1px solid #dfe3e8;
            border-radius: 4px;
            font-size: 14px;
        }

        input[type="submit"] {
            width: 100%;
            padding: 12px;
            background-color: #66a6ff;
            border: none;
            border-radius: 4px;
            color: #fff;
            font-size: 16px;
            cursor: pointer;
        }

        input[type="submit"]:hover {
            background-color: #559af0;
        }

        .switch-form, .forgot-password {
            text-align: center;
            margin-top: 15px;
        }

        .switch-form a, .forgot-password a {
            color: #66a6ff;
            text-decoration: none;
        }

        .switch-form a:hover, .forgot-password a:hover {
            text-decoration: underline;
        }

        .verification-code {
            position: relative;
        }

        .verification-code button {
            position: absolute;
            right: 10px;
            top: 32px;
            padding: 6px 10px;
            background-color: #66a6ff;
            color: #fff;
            border: none;
            border-radius: 3px;
            cursor: pointer;
            font-size: 12px;
        }

        .verification-code button:disabled {
            background-color: #ccc;
            cursor: not-allowed;
        }
    </style>
</head>
<body>
    <div id="app" class="container">
        <!-- 登录表单 -->
        <form v-if="currentForm === 'login'" @submit.prevent="login">
            <h1>登录</h1>
            <div class="input-group">
                <label for="login-username">用户名/邮箱:</label>
                <input type="text" id="login-username" v-model="loginData.username" placeholder="请输入用户名/邮箱">
            </div>

            <!-- 根据登录方式切换密码输入或验证码输入 -->
            <div class="input-group" v-if="loginMethod === 'password'">
                <label for="login-password">密码:</label>
                <input type="password" id="login-password" v-model="loginData.password" placeholder="请输入密码">
            </div>
            <div class="input-group verification-code" v-else>
                <label for="login-code">验证码:</label>
                <input type="text" id="login-code" v-model="loginData.code" placeholder="请输入验证码">
                <button type="button" @click="sendLoginCode" :disabled="countdown > 0">
                    {{ countdown > 0 ? countdown + '秒后重发' : '获取验证码' }}
                </button>
            </div>

            <div class="input-group">
                <label>
                    <input type="checkbox" v-model="loginData.rememberMe"> 记住我
                </label>
            </div>

            <input type="submit" value="登录">

            <div class="forgot-password">
                <a href="#" @click.prevent="switchForm('forgotPassword')">忘记密码?</a>
            </div>

            <div class="switch-form">
                没有账号?<a href="#" @click.prevent="switchForm('register')">立即注册</a>
            </div>

            <!-- 登录方式切换 -->
            <div class="switch-form">
                <a href="#" @click.prevent="toggleLoginMethod">
                    使用{{ loginMethod === 'password' ? '验证码' : '密码' }}登录
                </a>
            </div>
        </form>

        <!-- 注册表单 -->
        <form v-else-if="currentForm === 'register'" @submit.prevent="register">
            <h1>注册</h1>
            <div class="input-group">
                <label for="register-username">用户名:</label>
                <input type="text" id="register-username" v-model="registerData.username" placeholder="请输入用户名">
            </div>
            <div class="input-group">
                <label for="register-email">邮箱:</label>
                <input type="email" id="register-email" v-model="registerData.email" placeholder="请输入邮箱">
            </div>
            <div class="input-group">
                <label for="register-password">密码:</label>
                <input type="password" id="register-password" v-model="registerData.password" placeholder="请输入密码">
            </div>
            <input type="submit" value="注册">
            <div class="switch-form">
                已有账号?<a href="#" @click.prevent="switchForm('login')">立即登录</a>
            </div>
        </form>

        <!-- 找回密码表单 -->
        <form v-else-if="currentForm === 'forgotPassword'" @submit.prevent="resetPassword">
            <h1>找回密码</h1>
            <div class="input-group">
                <label for="forgot-email">邮箱:</label>
                <input type="email" id="forgot-email" v-model="forgotData.email" placeholder="请输入注册时使用的邮箱">
            </div>
            <div class="input-group verification-code">
                <label for="forgot-code">验证码:</label>
                <input type="text" id="forgot-code" v-model="forgotData.code" placeholder="请输入验证码">
                <button type="button" @click="sendForgotCode" :disabled="forgotCountdown > 0">
                    {{ forgotCountdown > 0 ? forgotCountdown + '秒后重发' : '获取验证码' }}
                </button>
            </div>
            <div class="input-group">
                <label for="forgot-password">新密码:</label>
                <input type="password" id="forgot-password" v-model="forgotData.password" placeholder="请输入新密码">
            </div>
            <input type="submit" value="重置密码">
            <div class="switch-form">
                记得密码?<a href="#" @click.prevent="switchForm('login')">立即登录</a>
            </div>
        </form>
    </div>

    <!-- 引入 Vue.js -->
    <script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
    <!-- 编写 Vue 实例 -->
    <script>
        new Vue({
            el: '#app',
            data: {
                currentForm: 'login', // 当前显示的表单:login, register, forgotPassword
                loginMethod: 'password', // 登录方式:password, code
                loginData: {
                    username: '',
                    password: '',
                    code: '',
                    rememberMe: false
                },
                registerData: {
                    username: '',
                    email: '',
                    password: ''
                },
                forgotData: {
                    email: '',
                    code: '',
                    password: ''
                },
                countdown: 0, // 登录验证码倒计时
                forgotCountdown: 0 // 找回密码验证码倒计时
            },
            methods: {
                switchForm(form) {
                    this.currentForm = form;
                    this.clearData();
                },
                toggleLoginMethod() {
                    this.loginMethod = this.loginMethod === 'password' ? 'code' : 'password';
                    this.loginData.password = '';
                    this.loginData.code = '';
                },
                login() {
                    // 登录逻辑
                    if (this.loginMethod === 'password') {
                        alert(`用户名:${this.loginData.username}\n密码:${this.loginData.password}`);
                    } else {
                        alert(`用户名:${this.loginData.username}\n验证码:${this.loginData.code}`);
                    }
                },
                register() {
                    // 注册逻辑
                    alert(`用户名:${this.registerData.username}\n邮箱:${this.registerData.email}\n密码:${this.registerData.password}`);
                },
                resetPassword() {
                    // 重置密码逻辑
                    alert(`邮箱:${this.forgotData.email}\n验证码:${this.forgotData.code}\n新密码:${this.forgotData.password}`);
                },
                sendLoginCode() {
                    if (this.countdown === 0) {
                        alert('验证码已发送到您的手机!');
                        this.countdown = 60;
                        const interval = setInterval(() => {
                            if (this.countdown > 0) {
                                this.countdown--;
                            } else {
                                clearInterval(interval);
                            }
                        }, 1000);
                    }
                },
                sendForgotCode() {
                    if (this.forgotCountdown === 0) {
                        alert('验证码已发送到您的邮箱!');
                        this.forgotCountdown = 60;
                        const interval = setInterval(() => {
                            if (this.forgotCountdown > 0) {
                                this.forgotCountdown--;
                            } else {
                                clearInterval(interval);
                            }
                        }, 1000);
                    }
                },
                clearData() {
                    // 清空所有表单数据
                    this.loginData = { username: '', password: '', code: '', rememberMe: false };
                    this.registerData = { username: '', email: '', password: '' };
                    this.forgotData = { email: '', code: '', password: '' };
                    this.countdown = 0;
                    this.forgotCountdown = 0;
                }
            }
        });
    </script>
</body>
</html>

将完整代码保存为 index.html,在浏览器中打开,即可看到效果。


结语

通过本篇教程,我们学习了如何使用 HTML、CSS 和 Vue.js 构建一个功能完善的登录页面。这个页面不仅具有美观的界面,还包含了登录、注册、找回密码和验证码登录等常用功能。希望通过本次实践,大家对前端开发有了更深入的了解。


版权声明:本文为原创内容,转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南北极之间

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值