用html,css和js实现简易版网易云邮箱登录页

3,294 阅读3分钟

今天我要和大家分享的是一个动手小demo,制作一个简易版的网易云邮箱登录页面,一起来从零实现页面布局,并进行数据接口请求。话不多说,我们先来看看代码效果,小伙伴们可以先运行玩一玩喔😘~

还有一个好玩的实现B站视频弹幕demo,小伙伴们也可以试试喔😘~
实现各视频平台好玩的🔥弹幕🔥发送效果 - 掘金 (juejin.cn)

前言

由于小米露我没有服务器去部署项目接口,所以上面为了让大家看到效果,暂且写的是静态的数据。如果是平时自己写小demo的话,我们可以把自己的电脑当作一台服务器来运行接口。所以下面向大家演示的话,我也是通过向服务器发起接口请求,获取到数据,从而来完成页面的展示。

服务器接口代码

下面先和大家分享接口文件代码,以及如何将它在我们自己的电脑上运行起来,需要完成以下步骤:

1、创建一个文件夹,在里面创建一个app.js文件,文件里面为下面代码。
2、在文件夹目录下,打开终端,执行项目初始化命令npm init -y
3、再执行npm i命令
4、执行命令npm i express@4.17.1,安装特定版本的express
5、执行命令npm i cors@2.8.5,安装特定版本的cors,解决跨域问题
6、最后执行node app.js,启动服务器项目接口

// 导入express
const express = require('express');
const app = express();
const router = express.Router();

//解决跨域问题
const cors = require('cors');
app.use(cors())

//登录接口
const userRouter = router.get('/login', (req, res) => {
    const { username, password } = req.query
    //定义邮箱校验规则
    const rules = /^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$/
    if (rules.test(username)) {
      res.send ({
        status: 200,
        message: '登录成功'
      })
    } else {
      res.send({ 
        status: 0,
        message: '邮箱或密码错误'
      })
    }
})

app.use(userRouter)

//在端口号520运行接口
app.listen(520,()=>{
    console.log('服务器在http://127.0.0.1:520启动成功!');
})

当看到以下结果时,我们的服务器接口就启动成功啦~让它在后台运行,我们新建一个项目继续coding叭~

image.png

html代码

页面较为简单,所以整体的html代码还是比较简短的,头部左边有一个返回的键,中间logo和文字;页面中间还有两个输入框,下面一个登录按钮和文字,以及头部位置的弹框和文字信息。

<body>
    <div class="header">
        <img src="./返回.png" class="iconfont1">
        <div class="logo">
            <img src="./图标.png" class="iconfont2">
            <span class="tittle">网易云音乐</span>
        </div>
    </div>
    <div class="content">
        <input type="text" class="inp" placeholder="登录邮箱" id="email">
        <input type="password" class="inp"  placeholder="密码" id="password"> 
    </div>
    <div class="end">
        <button class="btn" disabled>登录</button>
        <p>重设密码</p>
    </div>
    <div class="dialog"> //弹框
        <span class="message"></span> //登录提示词
    </div>
</body>

CSS代码

为了尽可能还原网易云邮箱登录页,还是写了不少css代码。通过引入css代码,完成静态页面的布局美化。同时为后续的JS代码操作做铺垫作用。

*{
    margin: 0;
    padding: 0;
}

.header{
    height: 80px;
    position: relative;
}

.logo{
    position: absolute;
    top:0;
    left:50%;
    transform: translate(-50%);
}

.iconfont1{
    height: 30px;
    width: 30px;
    margin: 25px 10px;
}

.iconfont2{
    border-radius: 50%;
    height: 20px;
    width: 20px;
    /* 让头部logo和文字居中对齐 */
    vertical-align:middle;
}
.tittle{
    font-family: 'Times New Roman', Times, serif;
    font-size: 10px;
    line-height: 80px;
}
.content{
    margin-top: 50px;
    text-align: center;
}
.content .inp{
    width: 210px;
    height: 50px;
    margin: 10px 0;
    border-radius: 8px;
    border: none;
    background-color: rgb(241, 241, 241);
    padding-left: 25px;
}

/* 改变input框中placeholder属性的文字颜色 */
.content input::placeholder {
    color: rgb(172, 172, 172);
}

/* input框聚焦的样式 */
.content input:focus {
    border: 0;
    outline: 1px solid rgb(236, 236, 236);
    box-shadow: 1px 1px 10px 1px rgb(225, 225, 225);

}

.end{
    margin-top: 5px;
    text-align: center;
}

.end .btn{
    border-radius: 30px;
    margin: 15px 0;
    width: 230px;
    height: 50px;
    border: none;
    background-color: #ffcdcd;
    color: rgb(228, 228, 228);
    transition: all .3s;
}

.end p{
    color: rgb(56, 125, 254);
    font-size: 13px;
    font-family: 'Times New Roman', Times, serif;
}

/* 用来控制登录按钮变红的样式 */
.end .active{
    background-color: #f60000;
}

.dialog{
    /* 固定定位 */
    position: fixed;
    height: 40px;
    background-color: rgb(255, 255, 255);
    top: 20px;
    /* 平移居中 */
    left: 50%;
    transform: translate(-50%);
    border-radius: 20px;
    display: flex;
    align-items: center;
    outline: 1px solid rgb(236, 236, 236);
    box-shadow: 1px 1px 10px 1px rgb(225, 225, 225);
    opacity: 0;
    transition: all 0.7s;
    /* 开始将弹窗隐藏 */
    visibility: hidden;
}

/* 弹窗信息样式 */
.message{
    background-size: contain;
    background-repeat: no-repeat;
    background-position: 18px 0;
    padding: 0 18px 0 38px;
    font-size: 13px;
    font-family: 'Times New Roman', Times, serif;
}

/* 登录失败的样式 */
.error{
    background-image: url(./错误.png);
    color: #ff0303;
}
/* 
登录成功的样式 */
.right{
    background-image: url(./正确.png);
    color: rgb(0, 162, 0);
}

主要的核心操作代码还是在js代码里面,我们继续看。

JS代码

通过JS,要实现动态监听两个input输入框的值,只有当两个输入框都不为空的时候,更改登录按钮样式,将其变红,并且从开始的不可点击状态变为可点击状态。在成功点击登录按钮后,向服务器接口发送GET数据请求获取返回数据,根据返回数据,前端页面作出相应的提示,若登入失败,给弹窗添加error类样式,登录成功则添加right类样式,并将服务器返回的文本信息写在页面弹窗文本里展现出来。同时,点击登录按钮后,应立马禁用登录按钮,实现节流效果,避免用户多次点击向服务器多次请求,在弹窗显示2s后,将其消失隐藏,并且将登录按钮更改回可点击状态。

const email = document.getElementById("email");
const password = document.getElementById("password");
const btn = document.querySelector('.btn')
const dialog = document.querySelector('.dialog')
const message = document.querySelector('.message')
let Isemail = false;
let Ispassword = false;
let addclass = null;

//实现动态监听两个input输入框的值
//当邮箱有值时,Isemail为true,同时调用show方法
//当密码有值时,Ispassword为true,同时调用show方法
email.addEventListener('input', (e) => {
    Isemail = e.target.value ? true : false
    show()
})
password.addEventListener('input', (e) => {
    Ispassword = e.target.value ? true : false
    show()
})

//登录按钮点击事件
btn.addEventListener('click', () => {
    const $username = email.value
    const $password = password.value
//通过fetch方法向我们刚刚后台运行的服务器接口地址发送请求
//并将登录的数据通过url地址传给服务器
fetch(`http://127.0.0.1:520/login?username=${$username}&&password=${$password}`).then(data => 
            data.json()).then(res => {
                //服务器通过我们发送过去的请求数据作出数据回应
                //res就是服务器返回的数据
                //用户点击登录后,立马禁用点击,防止多次点击多次请求
                btn.disabled = "true"
                //通过透明度过渡,实现缓缓出现的效果
                dialog.style.opacity = 1
                //显示弹窗
                dialog.style.visibility = 'visible'
                //根据服务器返回的数据,将其message信息写入弹窗文本
                message.innerHTML = res.message
// 移除弹窗文本上次的类名属性     
if(message.classList.contains(addclass)) 
//根据返回的状态码,给弹窗文本添加不同的类名
message.classList.remove(addclass) 
                addclass = res.status === 200 ? 'right' : 'error'
                //登录成功添加right类,否则添加error类
                message.classList.add (addclass) 
                //2s后,控制弹窗消失
                setTimeout(()=>{
                    //实现弹窗缓缓消失的效果
                    dialog.style.opacity = 0
                    //2s后将按钮改回可点击状态
                    btn.disabled = ""
                    //将弹窗隐藏
                    dialog.style.visibility = 'hidden'
                },2000)
            })
})


function show(){
    //邮箱和密码都不为空,给登录按钮添加active类
    //按钮变红,并且变为可点击状态
    if(Isemail && Ispassword) {
        btn.classList.add('active')
        btn.disabled = ""
    }
    else{
    //否则移除变红状态,禁用登录按钮
        if(btn.classList.contains('active'))
        btn.classList.remove('active');
        btn.disabled = "true"
    }
}

总结

到这里,所有代码就全部都写完啦~通过使用html,css和js代码便实现了一个简易版的网易云邮箱登录页面。如果小伙伴们有什么问题或者更好的方法,欢迎评论喔😊😘~

如果觉得文章对您有所帮助的话,麻烦给小米露点点关注,点点赞咯😘,有问题欢迎各位小伙伴评论喔😊~
这是本人的gitee仓库地址:gitee.com/xiaomi-dew/… 。写的各项目代码源码,学习代码和各种资源都在里面啦~如果觉得还不错的话,可以给我的小仓库也点点Star喔😍😍😍 ~