JSFiddle - React, Tailwind, and code Playground

by shnny

HTML

<div class="sign-up-wrap">
    <div class="sign-up">
        <button class="btn-close">X</button>
        <h3 class="sign-up-title">Create an Account</h3>
    </div>
    <form id="signUpForm">
        <ul class="sign-up-list">
            <li class="sign-up-item">
                <label for="username">用戶暱稱</label>
                <input type="name" class="input-username" name="username" placeholder="your name">
                <span class="username-error">*不能為空白、必須在40字以內</span>
            </li>
            <li class="sign-up-item">
                <label for="email">Email*</label>
                <input type="email" class="input-email" name="email" placeholder="[email protected]">
                <span class="email-error">*不能為空白、必須包含 @ 符號</span>
            </li>
            <li class="sign-up-item">
                <label for="psd">密碼*</label>
                <input type="password" class="input-password" name="psd" placeholder="Your password">
                <span class="psd-error">*不能為空白、必須在8字以上、必須在100字以內</span>
            </li>
        </ul>
        <div class="sign-up-btn">
            <button type="submit" class="btn btn-create">Create Account</button>
            <button class="btn btn-sign-in">Sign In</button>
        </div>
    </form>
   </div>

CSS

body{
    background-color: #A5D2EB;
}
ul{
    list-style: none;
}
label{
    display: block;
    font-size: 14px;
    font-weight: 600;
    line-height: 1.5;
}
input{
    display: block;
    box-sizing: border-box;
    width: 220px;
    padding: 1rem;
    border: 1px solid #333;
    border-radius: 15px;
    outline: none;
}
button{
    cursor: pointer;
}
.sign-up-wrap{
    position: fixed;
    top: 0;
    right: 0;
    width: 300px;
    padding: 20px 10px;
    border-radius: 50px 0 0 50px;
    background-color: #fff;
}
.sign-up{
    display: flex;
    justify-content: space-between;
    width: 250px;
    margin: auto;
}
.sign-up-title{
    font-size: 16px;
}
.btn-close{   
    border: none;
    font-size: 14px;
    font-weight: 600;
    background-color: transparent;
}
.sign-up-list{
    width: 250px;
}
.sign-up-item{
    width: 220px;
    margin: .5rem 0;
}
.sign-up-item span{
    display: none;
    font-size: 12px;
    color: #f00;
}
.sign-up-btn{
    width: 220px;
    margin: auto;
}
.btn{
    display: block;
    box-sizing: border-box;
    width: 220px;
    margin: .5rem 0;
    padding: 1rem 0;
    border: none;
    border-radius: 15px;
    font-size: 14px;
    font-weight: 700;
}
.btn-create{
    background-color: #000;
    color: #fff;
}
.btn-sign-in{
    background-color: transparent;
}
.btn-sign-in:hover{
    background-color: #000;
    color: #fff;
}

JavaScript

const form = document.querySelector('#signUpForm');
const usernameInput = form.querySelector('input[name="username"]');
const emailInput = form.querySelector('input[name="email"]');
const psdInput = form.querySelector('input[name="psd"]');
const usernameError = form.querySelector('.username-error');
const emailError = form.querySelector('.email-error');
const psdError = form.querySelector('.psd-error');
const inputs = document.querySelectorAll('input');

form.addEventListener('submit', function(event) {
    event.preventDefault(); // 阻止表單提交

    let isValid = true;

    // 驗證用戶暱稱
    if (usernameInput.value.trim() === '') {
        usernameError.style.display = 'block';
        isValid = false;
    } else {
        usernameError.style.display = 'none';
    }

    // 驗證email
    if (emailInput.value.trim() === '' || !emailInput.value.includes('@')) {
        emailError.style.display = 'block';
        isValid = false;
    } else {
        emailError.style.display = 'none';
    }

    // 驗證密碼
    if (psdInput.value.trim() === '' || psdInput.value.length < 8 || psdInput.value.length > 100) {
        psdError.style.display = 'block';
        isValid = false;
    } else {
        psdError.style.display = 'none';
    }

    //在輸入框中輸入文字時,相應的錯誤訊息消失
    for (let i = 0; i < inputs.length; i++) {
        inputs[i].addEventListener('input', () => {
            const errorMessage = inputs[i].parentNode.querySelector('span');
            errorMessage.style.display = 'none';
    		});
    }

    if (isValid) {
        console.log('表單驗證通過,可以提交表單了!');
    }
});