diff --git a/FE-Sprint-Mission2/FE-Sprint-Mission1-week1/login.html b/FE-Sprint-Mission2/FE-Sprint-Mission1-week1/login.html index 68b6debe..c1f92414 100644 --- a/FE-Sprint-Mission2/FE-Sprint-Mission1-week1/login.html +++ b/FE-Sprint-Mission2/FE-Sprint-Mission1-week1/login.html @@ -26,14 +26,18 @@
+
이메일을 입력해주세요.
+
잘못된 이메일 형식입니다.
숨김 아이콘 +
비밀번호를 입력해주세요.
+
비밀번호를 8자 이상 입력해주세요.
- @@ -56,5 +60,6 @@ + diff --git a/FE-Sprint-Mission2/FE-Sprint-Mission1-week1/login.js b/FE-Sprint-Mission2/FE-Sprint-Mission1-week1/login.js new file mode 100644 index 00000000..8a38cf85 --- /dev/null +++ b/FE-Sprint-Mission2/FE-Sprint-Mission1-week1/login.js @@ -0,0 +1,83 @@ +const inputEmail = document.querySelector("#form__email"); +const emailErrorMessage = document.querySelector("#form__email--message"); +const emailInvalidMessage = document.querySelector( + "#form__email--invalid-message" +); + +const inputPassword = document.querySelector("#form__password"); +const passwordErrorMessage = document.querySelector("#form__password--message"); +const passwordInvalidMessage = document.querySelector( + "#form__password--invalid-message" +); + +const loginButton = document.querySelector("#login-button"); + +const toggleIcon = document.querySelector( + ".form__password--wrapper .input-icon" +); + +function checkLoginFormValidity() { + const emailValue = inputEmail.value.trim(); + const passwordValue = inputPassword.value.trim(); + + const emailIsValid = + /^[A-Za-z0-9_\.\-]+@[A-Za-z0-9\-]+\.[A-Za-z0-9\-]+$/.test(emailValue); + const passwordValid = passwordValue.length >= 8; + + if (emailIsValid && passwordValid) { + loginButton.disabled = false; + loginButton.classList.remove("button--disabled"); + } else { + loginButton.disabled = true; + loginButton.classList.add("button--disabled"); + } +} + +inputEmail.addEventListener("blur", function (e) { + const emailValue = e.target.value.trim(); + + if (emailValue === "") { + inputEmail.style.border = "1px solid red"; + emailErrorMessage.style.display = "block"; + emailInvalidMessage.style.display = "none"; + } else if ( + !/^[A-Za-z0-9_\.\-]+@[A-Za-z0-9\-]+\.[A-Za-z0-9\-]+$/.test(emailValue) + ) { + inputEmail.style.border = "1px solid red"; + emailErrorMessage.style.display = "none"; + emailInvalidMessage.style.display = "block"; + } else { + inputEmail.style.border = "1px solid var(--gray-100)"; + emailErrorMessage.style.display = "none"; + emailInvalidMessage.style.display = "none"; + } + + checkLoginFormValidity(); +}); + +inputPassword.addEventListener("blur", function (e) { + const passwordValue = e.target.value.trim(); + + if (passwordValue === "") { + inputPassword.style.border = "1px solid red"; + passwordErrorMessage.style.display = "block"; + passwordInvalidMessage.style.display = "none"; + } else if (passwordValue.length < 8) { + inputPassword.style.border = "1px solid red"; + passwordErrorMessage.style.display = "none"; + passwordInvalidMessage.style.display = "block"; + } else { + inputPassword.style.border = "1px solid var(--gray-100)"; + passwordErrorMessage.style.display = "none"; + passwordInvalidMessage.style.display = "none"; + } + checkLoginFormValidity(); +}); + +toggleIcon.addEventListener("click", function (e) { + inputPassword.type = inputPassword.type === "password" ? "text" : "password"; + toggleIcon.src = + inputPassword.type === "password" + ? "images/btn_visibility_on_24px.png" + : "images/btn_visibility_on_24px 2.png"; +}); diff --git a/FE-Sprint-Mission2/FE-Sprint-Mission1-week1/signup.html b/FE-Sprint-Mission2/FE-Sprint-Mission1-week1/signup.html index d7088834..106cccfa 100644 --- a/FE-Sprint-Mission2/FE-Sprint-Mission1-week1/signup.html +++ b/FE-Sprint-Mission2/FE-Sprint-Mission1-week1/signup.html @@ -27,24 +27,31 @@
+
이메일을 입력해주세요.
+
잘못된 이메일 형식입니다.
+ + + +
닉네임을 입력해주세요.
- -
숨김 아이콘 +
비밀번호를 입력해주세요.
+
비밀번호를 8자 이상 입력해주세요.
- 숨김 아이콘 - + 숨김 아이콘 + +
비밀번호가 일치하지 않습니다.
- - @@ -67,6 +74,6 @@ - + diff --git a/FE-Sprint-Mission2/FE-Sprint-Mission1-week1/signup.js b/FE-Sprint-Mission2/FE-Sprint-Mission1-week1/signup.js new file mode 100644 index 00000000..77af34a5 --- /dev/null +++ b/FE-Sprint-Mission2/FE-Sprint-Mission1-week1/signup.js @@ -0,0 +1,127 @@ +const inputEmail = document.querySelector("#form__email"); +const emailErrorMessage = document.querySelector("#form__email--message"); +const emailInvalidMessage = document.querySelector( + "#form__email--invalid-message" +); + +const inputPassword = document.querySelector("#form__password"); +const passwordErrorMessage = document.querySelector("#form__password--message"); +const passwordInvalidMessage = document.querySelector( + "#form__password--invalid-message" +); + +const signupButton = document.querySelector("#signup-button"); + +const toggleIcon = document.querySelectorAll( + ".form__password--wrapper .input-icon" +); + +const inputpasswordCheck = document.querySelector("#passwordCheck"); +const passwordCheckMessage = document.querySelector("#passwordCheck--message"); + +const inputNickName = document.querySelector("#form__nickName"); +const nickNameInvalidMessage = document.querySelector( + "#form__nickName--invalid-message" +); + +function checkSignupFormValidity() { + const emailValue = inputEmail.value.trim(); + const passwordValue = inputPassword.value.trim(); + const passwordCheckValue = inputpasswordCheck.value.trim(); + const nickNameValue = inputNickName.value.trim(); + + const emailIsValid = + /^[A-Za-z0-9_\.\-]+@[A-Za-z0-9\-]+\.[A-Za-z0-9\-]+$/.test(emailValue); + const passwordValid = passwordValue.length >= 8; + + if ( + emailIsValid && + passwordValid && + passwordValue === passwordCheckValue && + nickNameValue !== "" + ) { + signupButton.disabled = false; + signupButton.classList.remove("button--disabled"); + } else { + signupButton.disabled = true; + signupButton.classList.add("button--disabled"); + } +} + +inputEmail.addEventListener("blur", function (e) { + const emailValue = e.target.value.trim(); + + if (emailValue === "") { + inputEmail.style.border = "1px solid red"; + emailErrorMessage.style.display = "block"; + emailInvalidMessage.style.display = "none"; + } else if ( + !/^[A-Za-z0-9_\.\-]+@[A-Za-z0-9\-]+\.[A-Za-z0-9\-]+$/.test(emailValue) + ) { + inputEmail.style.border = "1px solid red"; + emailErrorMessage.style.display = "none"; + emailInvalidMessage.style.display = "block"; + } else { + inputEmail.style.border = "1px solid var(--gray-100)"; + emailErrorMessage.style.display = "none"; + emailInvalidMessage.style.display = "none"; + } + + checkSignupFormValidity(); +}); + +inputPassword.addEventListener("blur", function (e) { + const passwordValue = e.target.value.trim(); + + if (passwordValue === "") { + inputPassword.style.border = "1px solid red"; + passwordErrorMessage.style.display = "block"; + passwordInvalidMessage.style.display = "none"; + } else if (passwordValue.length < 8) { + inputPassword.style.border = "1px solid red"; + passwordErrorMessage.style.display = "none"; + passwordInvalidMessage.style.display = "block"; + } else { + inputPassword.style.border = "1px solid var(--gray-100)"; + passwordErrorMessage.style.display = "none"; + passwordInvalidMessage.style.display = "none"; + } + checkSignupFormValidity(); +}); + +inputpasswordCheck.addEventListener("blur", function (e) { + const passwordValue = inputPassword.value.trim(); + const passwordCheckValue = e.target.value.trim(); + + if (passwordValue !== passwordCheckValue) { + inputpasswordCheck.style.border = "1px solid red"; + passwordCheckMessage.style.display = "block"; + } else { + inputpasswordCheck.style.border = "1px solid var(--gray-100)"; + passwordCheckMessage.style.display = "none"; + } + checkSignupFormValidity(); +}); + +inputNickName.addEventListener("blur", function (e) { + const nickNameValue = e.target.value.trim(); + + if (nickNameValue === "") { + inputNickName.style.border = "1px solid red"; + nickNameInvalidMessage.style.display = "block"; + } + checkSignupFormValidity(); +}); + +toggleIcon.forEach(function (icon) { + icon.addEventListener("click", function () { + const wrapper = icon.closest(".form__password--wrapper"); + const input = wrapper.querySelector("input"); + + const isPassword = input.type === "password"; + input.type = isPassword ? "text" : "password"; + icon.src = isPassword + ? "images/btn_visibility_on_24px 2.png" + : "images/btn_visibility_on_24px.png"; + }); +}); diff --git a/FE-Sprint-Mission2/FE-Sprint-Mission1-week1/styles/login.css b/FE-Sprint-Mission2/FE-Sprint-Mission1-week1/styles/login.css index da5b6897..ab872664 100644 --- a/FE-Sprint-Mission2/FE-Sprint-Mission1-week1/styles/login.css +++ b/FE-Sprint-Mission2/FE-Sprint-Mission1-week1/styles/login.css @@ -62,6 +62,20 @@ input { line-height: 32px; } +.button--disabled { + background-color: var(--gray-400); + width: 640px; + height: 56px; + margin: 0 auto; + padding: 16px; + border: 1px solid var(--gray-400); + border-radius: 40px; + color: var(--gray-100); + font-size: 20px; + font-weight: 600; + line-height: 32px; +} + .form__social-login { display: flex; justify-content: space-between; @@ -90,6 +104,14 @@ input { color: var(--gray-800); } +.error__message { + font-size: 14px; + font-weight: 600; + color: var(--error); + display: none; + margin: 0 16px 18px; +} + a { color: var(--blue); text-decoration: underline; diff --git a/FE-Sprint-Mission2/FE-Sprint-Mission1-week1/styles/reset.css b/FE-Sprint-Mission2/FE-Sprint-Mission1-week1/styles/reset.css index e1c8cee3..5377523e 100644 --- a/FE-Sprint-Mission2/FE-Sprint-Mission1-week1/styles/reset.css +++ b/FE-Sprint-Mission2/FE-Sprint-Mission1-week1/styles/reset.css @@ -140,6 +140,7 @@ table { --gray-50: #f9fafb; --blue: #3692ff; --skyBlue: #e6f2ff; + --error: #f74747; } * {