JSFiddle - React, Tailwind, and code Playground
by birdie2019
HTML
<div class="container">
<h2>註冊帳戶</h2>
<form>
<div class="user box">
<input type="text" name="username" id="name" required>
<label for="user-name">名稱</label>
<span>不能為空白、必須在40字以內!</span>
</div>
<div class="email box">
<input type="text" name="email" id="mail" required>
<label for="user-mail">信箱</label>
<span>不能為空白、必須包含 @ 符號!</span>
</div>
<div class="password box">
<input type="password" name="password" id="password" required>
<label for="user-password">密碼</label>
<span>不能為空白、必須在8字以上、必須在100字以內!</span>
</div>
</form>
<button type="submit" id="submit">註冊</button>
</div>
SCSS
* {
box-sizing: border-box;
margin: 0;
padding: 0;
font-size: 10px;
letter-spacing: 1px;
color: #fff;
}
body {
background-color: #44474e;
}
.container {
display: flex;
flex-direction: column;
align-items: center;
width: 400px;
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
margin: 0 auto;
padding: 50px;
border-radius: 5px;
background-color: rgb(20, 29, 49);
box-shadow: 0 0 15px rgba(0, 0, 0, 0.6);
h2 {
margin-bottom: 50px;
font-size: 2.5rem;
letter-spacing: 3px;
}
button {
width: 50%;
padding: 10px;
background-color: transparent;
border: 1px solid #fff;
border-radius: 50px;
cursor: pointer;
font-size: 1.6rem;
color: #fff;
transition: all .5s;
&:hover {
border: 1px solid aqua;
color: aqua;
transform: scale(1.05);
}
}
.box {
position: relative;
margin-bottom: 28px;
label {
position: absolute;
top: 8px;
left: 0px;
font-size: 1.6rem;
transition: all 0.5s;
}
input {
width: 300px;
padding: 10px 0px;
margin-bottom: 3px;
background-color: transparent;
border: 0;
border-bottom: 1px solid rgba(255, 255, 255, .5);
outline: none;
font-size: 1.6rem;
&:focus ~ label {
top: -20px;
font-size: 1.4rem;
color: aqua;
background-color: transparent;
}
&:valid ~ label {
top: -20px;
font-size: 1.4rem;
color: aqua;
background-color: transparent;
}
}
span {
color: rgb(255, 117, 117);
transition: all 0.3s;
...
JavaScript
var subName = document.querySelector('#name');
var subMail = document.querySelector('#mail');
var subPassword = document.querySelector('#password');
var submitBtn = document.querySelector('#submit');
submitBtn.onclick = fromRequired;
var spans = document.querySelectorAll('span');
for (var span of spans) {
span.style.opacity = '0';
}
var inputs = document.querySelectorAll('input');
for (var input of inputs) {
input.onclick = styleChange;
}
function fromRequired() {
var subNameValue = subName.value.trim();
var subMailValue = subMail.value.trim();
var subPasswordValue = subPassword.value.trim();
if (subNameValue == '' || subNameValue.length >= 40) {
subName.closest('.box').querySelector('span').style.opacity = '1';
subName.style.borderBottom = '1px solid rgba(255, 117, 117, .5)';
}
if (subMailValue == '' || subMailValue.includes('@') == false) {
subMail.closest('.box').querySelector('span').style.opacity = '1';
subMail.style.borderBottom = '1px solid rgba(255, 117, 117, .5)';
}
if (subPasswordValue == '' || subPasswordValue.length < 8 || subPasswordValue.length > 100) {
subPassword.closest('.box').querySelector('span').style.opacity = '1';
subPassword.style.borderBottom = '1px solid rgba(255, 117, 117, .5)';
} else {
console.log('資料符合規定')
}
}
function styleChange(e) {
e.target.closest('.box').querySelector('span').style.opacity = '0';
e.target.style.borderBottom = '1px solid rgba(255, 255, 255, .5)';
}