實現一個簡單的登錄頁面
設計了一個登錄頁面,感覺還挺不錯的
實現效果
設計的還是挺好看的吧
分析需要的功能
- 一個登錄頁面一個注冊頁面
- 翻轉效果
- 輸入后的正則判斷,給用戶提示信息
- 翻轉要清空頁面的全部信息
- 點擊注冊后給用戶反饋是否注冊成功
- 點擊登錄后驗證是否成功
實現過程
翻轉效果
實現點擊新用戶注冊,轉到注冊頁面,點擊已有賬號,轉到登錄頁面
將登錄頁面和注冊頁面通過定位疊在一起,再將注冊頁面旋轉180度,再用一個外層盒子包裹着這2個頁面,這樣只需轉動外層盒子就能實現2個頁面的交替出現效果
這部分需要與css配合使旋轉的效果更加有立體感
register.onclick = function () {
loginBox.style.transform = 'translateX(-50%) rotateY(180deg) ';//旋轉180deg,前面的移動值,是之前css部分就有的,所以要保留下來
login.style.display = 'none';//登錄頁面消失
container.style.display = 'block';//出現注冊頁面
clear();//這個函數很簡單,就是將頁面的輸入框還有那些提示信息遍歷一遍,將里面的值清掉
}
before.onclick = function () {
loginBox.style.transform = 'translateX(-50%) rotate(360deg) ';
container.style.display = 'none';
login.style.display = 'block';
clear();
}
正則判斷
在注冊頁面中一共有5個輸入框,密碼和電話號碼需要進行正則判斷,分開寫代碼會過於冗余,所以,還是通過數組索引來實現,把正則表達放到數組中,因為前2個輸入框是不需要進行正則判斷的,所以當i>2
時,再進行正則判斷,這樣就能通過一個for循環就解決了,頁面中還有一個需要判斷的內容是,二次輸入密碼,需要判斷是否和前面輸入的一致,也就是i==3
的時候
其實這個正則判斷並不算難,但是要注意的點很多,大家在做的時候需要注意一下,不要把文本框和正則判斷對應關系弄錯了
這里我有一個疑問希望大佬能解決一下,我想用一個正則表達式表示
什么都可以
也就是單純的想占個數組位,不讓它報錯,要怎么實現?
let register_input = container.querySelectorAll('input'); //所有的注冊信息 這個獲取的是注冊頁面所有的文本框
/* 正則表達式 */
let telReg = /^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$/;//電話號碼的正則表達
let psdReg = /\w{6,18}$/;//設置密碼為6,18位,只能包含字母、數字和下划線
let reg = [psdReg, psdReg, telReg];//把正則表達式放到數組中,這樣可以通過遍歷實現
for (let i = 0; i < register_input.length; i++) {
register_input[i].onblur = function () {
if (i >= 2) {
if (!reg[i - 2].test(register_input[i].value)) {// 如果不符合正則表達,彈出提示信息
this.nextElementSibling.style.display = 'block';
} else {
this.nextElementSibling.style.display = 'none';
}
}
if (i == 3) {
if (this.value == register_input[2].value) {// 如果兩次輸入的密碼不一致,彈出提示信息
this.nextElementSibling.style.display = 'none';
} else {
this.nextElementSibling.style.display = 'block';
}
}
}
}
ajax 實現注冊
這里用的是jquery
來實現的,用自己封裝的ajax
函數,也是可以的,比較懶,還是用ajax
吧,這個接口是后台的師兄給的,我也不知道接口方面的東西,所以接口地址就不放出來了
在點擊注冊按鈕后,我們需要最后判斷一遍,輸入框中的信息是否符合我們的正則表達,以及2次密碼是否相同,如果都滿足我們才調用ajax
向服務器發送注冊請求,否則后台的數據可能會異常,這里我是引入了一個布爾值來做標志,當全部輸入內容正確時才能發送請求,注冊成功后,給用戶一個注冊成功的提示,並清空頁面
register_btn.onclick = () => {
let judge = true;
for (let i = 2; i < register_input.length; i++) {
if (!reg[i - 2].test(register_input[i].value)) {
judge = false;
}
}
if (register_input[2].value != register_input[3].value) {
judge = false;
register_input[3].nextElementSibling.style.display = 'block';
} else {
register_input[3].nextElementSibling.style.display = 'none';
}//判斷輸入信息
if (judge) {
$.ajax({
type: 'POST',
url: 'http://www.XXXXXXXX',
data: {
username: register_input[0].value,
password: register_input[2].value,
name: register_input[1].value,
phone: register_input[4].value
},
success: res => {
if (res.code == 200) {
console.log(res);
register_true.style.display = 'block';//提示框
setTimeout(() => {
register_true.style.display = 'none';//2s后提示消失
}, 2000)
clear();//清空輸入框
} else {
alert('賬號已存在,請更改賬號后重試');
}
}
})
} else {
alert('請按提示修改個人信息');
}
}
登錄操作
登錄操作真的是非常簡單了,點擊登錄,判斷服務器端返回的狀態碼,如果是200就是成功,就進行頁面跳轉,進入網站,失敗則彈出錯誤信息
login_btn.onclick = function () {
$.ajax({
type: 'POST',
url: ' http://www.XXXXXX',
data: {
username: login_input[0].value,
password: login_input[1].value
},
success: function (res) {
console.log(res);
if (res.code == 200) {
loginBox.style.display = 'none';//如果登錄成功了,登錄頁面就消失
go(res);//這個函數是登錄成功后的跳轉函數
} else {
err.style.display = 'block';
setTimeout(() => {
err.style.display = 'none';
}, 2000)
}
},
error: function (er) {
console.log('error');
}
})
}
以上就是實現登錄操作的分析了
HTML 代碼
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="stylesheet" href="css/login.css">
<link rel="stylesheet" href="css/button.css">
<script src="js/jquery.js"></script>
<script src="js/index.js"></script>
</head>
<body>
<div class="loginBox">
<div class="container">
<div class="title">小A超級VIP注冊頁面</div>
<div class="information">
<input type="text" placeholder="賬號" id="myname">
<label></label>
</div>
<div class="information">
<input type="name" placeholder="姓名">
<label>請輸入正確的姓名</label>
</div>
<div class="information">
<input type="password" placeholder="密碼" id="psd_input">
<label class="label_psd">長度在6~18之間,只能包含字母、數字和下划線</label>
</div>
<div class="information">
<input type="password" placeholder="再次輸入密碼">
<label>密碼不一致</label>
</div>
<div class="information">
<input type="tel" placeholder="手機號">
<label>請輸入正確的手機號</label>
</div>
<button class="btn" id="newBtn">注冊</button>
<br>
<button class="loginBtn" id="before">已有賬號,返回登錄界面</button>
<span class="true err">注冊成功,請登錄</span>
</div>
<div class="login">
<div class="title">小A超級VIP登錄頁面</div>
<div class="information">
<input type="text" placeholder="賬號" id="login_name">
</div>
<div class="information">
<input type="password" placeholder="密碼" id="login_psd">
</div>
<button class="btn" id="login_btn">登錄</button>
<br>
<button class="loginBtn" id="register">新會員注冊</button>
<span class="err">用戶名不存在或密碼錯誤</span>
</div>
</div>
<h1 id="results">
</h1>
</body>
</html>
CSS代碼
* {
margin: 0;
padding: 0;
}
body {
font-family: sans-serif;
background: url(../imgs/5.jpg) no-repeat;
background-size: cover;
perspective: 1000px;
}
.loginBox {
display: flow-root;
position: relative;
left: 50%;
width: 400px;
height: 370px;
margin-top: 35px;
transform: translateX(-50%);
transition: all .4s;
transform-style: preserve-3d;
}
.container, .login {
position: absolute;
top: 0;
width: 400px;
background-color: rgba(0, 0, 0, .8);
text-align: center;
border-radius: 20px;
}
.container {
display: none;
transform: rotateY(180deg);
}
.title {
color: white;
font-size: 24px;
margin: 30px 0px;
user-select: none;
}
button {
text-align: center;
}
input {
width: 200px;
height: 26px;
margin: 5px;
outline: none;
border: none;
color: white;
border-bottom: 1px solid #fff;
background-color: transparent;
text-indent: 1em;
}
input::placeholder {
user-select: none;
color: white;
opacity: .5;
}
.btn {
margin: 10px 0px;
}
.loginBox .container div {
position: relative;
}
label {
display: none;
position: absolute;
top: 50%;
right: 5px;
width: 33%;
color: white;
font-size: 12px;
background-color: rgba(0, 0, 0, .8);
padding: 0px 5px;
border-radius: 5px;
transform-origin: right;
transform: translateY(-50%) scale(.7);
}
.login .err, .container .err {
display: none;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%) scale(.7);
font-size: 12px;
color: white;
padding: 4px;
background-color: rgba(0, 0, 0, .8);
border-radius: 10px;
z-index: 1;
}
#results {
text-align: center;
color: white;
margin-top: 100px;
user-select: none;
}
按鈕的樣式在另一篇博客里有寫過,這篇:炫彩按鈕
js代碼就不貼出來了,如需完整代碼可以私信或者留言