JSFiddle - React, Tailwind, and code Playground

by kushmuffin

HTML

<div class="container">
  <h3>註冊</h3>
  <form class="form">
    <div class="group box">
      <label for="usrname">用戶暱稱</label>
      <input type="text" id="name" name="name" required>
      <span class="span">不能為空白、必須在40字以內!</span>
    </div>
    
    <div class="group box">
      <label for="usrname">信箱</label>
      <input type="text" id="mail" name="mail" required>
      <span class="span">不能為空白、必須包含 @ 符號!</span>
    </div>
    
    <div class="group box">
      <label for="usrname">密碼</label>
      <input type="text" id="pwd" name="pwd" required minlength="8" maxlength="100">
      <span class="span">不能為空白、必須在8字以上、必須在100字以內!</span>
    </div>
    
    <button type="submit" id="submit" class="submit">註冊</button>
  </form>
</div>

CSS

* {
  box-sizing: border-box;
}

body{
  background: #fff;
  padding: 0 100px;
}

.container{
  padding: 20px 0;
  margin: 30px;
  
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  background-color: wheat;
  
  border: 1px solid black;
  border-radius: 5px;
}

.container .form{
  
}

.group input{
  border: 1px solid black;
  border-radius: 3px;
  padding: 4px 6px;
}

div.group{
  width: 280px;
  margin: 10px 0;
  display: flex;
  flex-direction: column;
}
.group span{
  display: none;
  color: red;
  font-size: 10px;
  transition: all 1s;
}

.submit{
  padding: 10px 15px;
  border: none;
  border-radius: 8px;
  background-color: powderblue;
}

JavaScript

let name = document.querySelector('#name');
let mail = document.querySelector('#mail');
let pwd = document.querySelector('#pwd');

let submitBtn = document.querySelector('#submit');
submitBtn.onclick = formRequired;
let spans = document.querySelectorAll('.span');
for (var span of spans) {
    span.style.opacity = '0';
}

function formRequired() {
	if(name.value == '' || name.length >= 40){
		name.closest('.group').querySelector('.span').style.display = 'unset';
		name.closest('.group').querySelector('.span').style.opacity = '1';
    name.style.borderColor = 'red';
    }
    
  if(mail.value == '' || mail.includes('@')){
		mail.closest('.group').querySelector('.span').style.display = 'unset';
  	mail.closest('.group').querySelector('.span').style.opacity = '1';
    mail.style.borderColor = 'red';
  }
  
  if(pwd.value == '' || pwd.length <=8 || pwd.length >=100){
  	pwd.closest('.group').querySelector('.span').style.display = 'unset';
    pwd.closest('.group').querySelector('.span').style.opacity = '1';
		pwd.style.borderColor = 'red';
  }
}
console.log(name.value)
console.log(mail.value)
console.log(pwd.value)

var inputs = document.querySelectorAll('input');
for (var input of inputs) {
    input.onclick = styleChange;
}
function styleChange(e) {
    e.target.closest('.group').querySelector('span').style.display = 'none';
    e.target.closest('.group').querySelector('span').style.opacity = '0';
    e.target.style.border = '1px solid black';
}