-
Notifications
You must be signed in to change notification settings - Fork 15
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[스프린트 미션3] 이현서 #25
The head ref may contain hidden characters: "basic-\uC774\uD604\uC11C-\uC2A4\uD504\uB9B0\uD2B83"
[스프린트 미션3] 이현서 #25
Conversation
height: 80px; | ||
background-color: rgba(54, 146, 255, 1); | ||
color:#FFFFFF; | ||
font-family:"Pretendard Variable", Pretendard, -apple-system, BlinkMacSystemFont, system-ui, Roboto, "Helvetica Neue", "Segoe UI", "Apple SD Gothic Neo", "Noto Sans KR", "Malgun Gothic", "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", sans-serif; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
font-family
는 body에 한 번만 정의해줘도 됩니다.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
아!! 계속 작업하다 보니까 중복해서 작성한 것 같습니다! 죄송합니다!
const emailError = document.getElementById('email-error'); | ||
const passwordError = document.getElementById('password-error'); | ||
|
||
emailInput.addEventListener('focusout', validateEmail); | ||
passwordInput.addEventListener('focusout', validatePassword); | ||
emailInput.addEventListener('input', validateForm); | ||
passwordInput.addEventListener('input', validateForm); | ||
|
||
function validateEmail() { | ||
const email = emailInput.value; | ||
if (!email) { | ||
emailError.innerText = '이메일을 입력해주세요.'; | ||
emailInput.classList.add('error'); | ||
} else if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email)) { | ||
emailError.innerText = '잘못된 이메일 형식입니다.'; | ||
emailInput.classList.add('error'); | ||
} else { | ||
emailError.innerText = ''; | ||
emailInput.classList.remove('error'); | ||
} | ||
} | ||
|
||
function validatePassword() { | ||
const password = passwordInput.value; | ||
if (!password) { | ||
passwordError.innerText = '비밀번호를 입력해주세요.'; | ||
passwordInput.classList.add('error'); | ||
} else if (password.length < 8) { | ||
passwordError.innerText = '비밀번호를 8자 이상 입력해주세요.'; | ||
passwordInput.classList.add('error'); | ||
} else { | ||
passwordError.innerText = ''; | ||
passwordInput.classList.remove('error'); | ||
} | ||
} | ||
|
||
function validateForm() { | ||
validateEmail(); | ||
validatePassword(); | ||
checkFormValidity(); | ||
} | ||
|
||
function checkFormValidity() { | ||
if (emailInput.value && passwordInput.value && | ||
!emailInput.classList.contains('error') && | ||
!passwordInput.classList.contains('error')) { | ||
loginButton.disabled = false; | ||
} else { | ||
loginButton.disabled = true; | ||
} | ||
} | ||
|
||
function togglePasswordVisibility() { | ||
const type = passwordInput.getAttribute("type") === "password" ? "text" : "password"; | ||
passwordInput.setAttribute("type", type); | ||
} | ||
|
||
document.getElementById('login-form').addEventListener('submit', function(event) { | ||
event.preventDefault(); | ||
const email = emailInput.value; | ||
const password = passwordInput.value; | ||
|
||
if (!email) { | ||
emailError.innerText = '이메일을 입력해주세요.'; | ||
emailInput.classList.add('error'); | ||
} | ||
if (!password) { | ||
passwordError.innerText = '비밀번호를 입력해주세요.'; | ||
passwordInput.classList.add('error'); | ||
} | ||
|
||
loginButton.addEventListener('click', () => { | ||
loginButton.classList.add('clicked'); | ||
setTimeout(() => { | ||
loginButton.classList.remove('clicked'); | ||
}, 100); | ||
}); | ||
|
||
document.getElementById('login-form').addEventListener('submit', function(event) { | ||
event.preventDefault(); | ||
const email = emailInput.value; | ||
const password = passwordInput.value; | ||
|
||
if (!email || !password) { | ||
return; | ||
} | ||
|
||
const user = USER_DATA.find(user => user.email === email); | ||
|
||
if (!user) { | ||
emailError.innerText = '이메일이 일치하지 않습니다.'; | ||
emailInput.classList.add('error'); | ||
} else if (user.password !== password) { | ||
passwordError.innerText = '비밀번호가 일치하지 않습니다.'; | ||
passwordInput.classList.add('error'); | ||
} else { | ||
window.location.href = "/items"; | ||
} | ||
})}); | ||
</script> |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
signup.js
처럼 별도의 파일로 분리하면 어떨까요?
emailInput.addEventListener('focusout', validateEmail); | ||
passwordInput.addEventListener('focusout', validatePassword); | ||
emailInput.addEventListener('input', validateForm); | ||
passwordInput.addEventListener('input', validateForm); |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
각각의 항목을 검증하는 함수를 분리한 점 좋습니다! 그런데 input마다 폼 전체를 검증하고 있어서 입력마다 불필요한 동작이 많이 일어나고 있어요. 어떻게 하면 사용자가 더 매끄럽게 사용할 수 있을지 고민해 보면 좋겠습니다.
transform: scale(0.95); | ||
transition: transform 0.1s ease; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
클릭할 때 느낌 좋아요 ㅎㅎ
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
transition
을 :active
에 정의하면 active
상태에서 기존 상태로 돌아갈 땐 transition
속성이 없기 때문에 애니메이션되지 않습니다. 의도하신 게 아니라면 transition
속성을 .btn
에 정의하는 게 더 좋을 것 같아요
passwordConfirmInput.style.borderColor = 'red'; | ||
return false; | ||
} else if (!passwordConfirmInput.value.trim()) { | ||
passwordConfirmInput.style.borderColor = '' | ||
} else { | ||
passwordConfirmInput.style.borderColor = 'blue'; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
인라인 스타일을 사용하면 스타일 코드의 응집도가 떨어지고 추적과 변경 대응에 불리해요.
상태별로 클래스를 지정하고 스타일을 정의한 다음 클래스를 토글링하는 방식을 제안해 볼게요!
요구사항
기본
공통
로그인, 회원가입 페이지 공통
심화
주요 변경사항
스크린샷
Netlify 링크
https://famous-belekoy-4bf136.netlify.app/
멘토에게