diff --git a/css/style.css b/css/style.css index 05e9774a..cebdc7c7 100644 --- a/css/style.css +++ b/css/style.css @@ -2,6 +2,7 @@ @import url(fonts.css); body { + width: calc(100vw - calc(100vw - 100%)); font-size: var(--common); font-weight: 500; font-family: "Pretendard-Regular"; @@ -34,7 +35,7 @@ body { background-color: var(--blue300); } -.button:visited { +.button:visited:not(.full-button) { background-color: var(--gray400); } @@ -47,6 +48,11 @@ body { height: 4.8rem; } +.disabled-button { + background-color: var(--gray400) !important; + cursor: default; +} + /* 767px */ @media all and (max-width: 47.9375rem) { .large-button { @@ -56,7 +62,7 @@ body { .logo { img { - content: url("../image/logo.svg"); + content: url("../images/logo.svg"); } } @@ -64,6 +70,7 @@ body { margin: 0 auto; padding: 0 4.5rem; width: 100%; + width: calc(100vw - calc(100vw - 100%)); max-width: 120rem; } @@ -247,7 +254,6 @@ body { /* 768~1199px */ @media all and (max-width: 74.9375rem) { - .inner, .header .inner { padding: 0 2.4rem; @@ -351,7 +357,7 @@ body { @media all and (max-width: 47.9375rem) { .logo { img { - content: url("../image/m-logo.svg"); + content: url("../images/m-logo.svg"); } } @@ -437,12 +443,13 @@ body { display: flex; justify-content: center; align-items: center; - width: 100%; + max-width: calc(100vw - calc(100vw - 100%)); height: 100vh; - min-height: 58rem; + min-height: fit-content; } .form-wrap { + padding: 8rem 0; width: 64rem; } @@ -472,6 +479,7 @@ body { .input-box { display: flex; align-items: center; + position: relative; width: 100%; height: 5.6rem; background-color: var(--gray100); @@ -492,16 +500,38 @@ body { outline: 0 none; } +.input-box input:not([type="checkbox"]).err { + border: 1px solid var(--red) !important; +} + +.input-box input:not([type="checkbox"]):focus { + border: 1px solid var(--blue200); +} + .check-label { - position: relative; + position: absolute; + right: 1rem; + top: 50%; + width: 4rem; + height: 4rem; cursor: pointer; + transform: translateY(-50%); + -webkit-transform: translateY(-50%); + -moz-transform: translateY(-50%); + -ms-transform: translateY(-50%); + -o-transform: translateY(-50%); } .check-label::before { position: absolute; - top: -1rem; - right: 2.4rem; - content: url("../image/hidden.svg"); + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + -webkit-transform: translate(-50%, -50%); + -moz-transform: translate(-50%, -50%); + -ms-transform: translate(-50%, -50%); + -o-transform: translate(-50%, -50%); + content: url("../images/hidden.svg"); } .show-toggle-btn .checkbox { @@ -513,7 +543,16 @@ body { font-size: 1px; } -.show-toggle-btn .checkbox+.check-label::after { +.show-toggle-btn .checkbox:focus + .check-label { + border: 2px solid var(--gray900); + border-radius: 0.5rem; + -webkit-border-radius: 0.5rem; + -moz-border-radius: 0.5rem; + -ms-border-radius: 0.5rem; + -o-border-radius: 0.5rem; +} + +.show-toggle-btn .checkbox + .check-label::after { overflow: hidden; position: absolute; width: 0; @@ -521,12 +560,12 @@ body { font-size: 1px; } -.show-toggle-btn .checkbox+.check-label::after { +.show-toggle-btn .checkbox + .check-label::after { content: "입력 보기"; } -.show-toggle-btn .checkbox:checked+.check-label::before { - content: url("../image/show.svg"); +.show-toggle-btn .checkbox:checked + .check-label::before { + content: url("../images/show.svg"); } .full-button { @@ -582,6 +621,12 @@ body { -moz-text-decoration-color: var(--blue100); } +.alert-box { + margin-top: 0.8rem; + font-size: var(--small); + color: var(--red); +} + /* 767px */ @media all and (max-width: 47.9375rem) { .logo-title { @@ -602,4 +647,4 @@ body { margin-bottom: 0.8rem; font-size: calc(var(--large) - 0.2rem); } -} \ No newline at end of file +} diff --git a/css/variable.css b/css/variable.css index fa2fc9d6..227a23b9 100644 --- a/css/variable.css +++ b/css/variable.css @@ -27,6 +27,8 @@ --gray200: #E5E7EB; --gray100: #F3F4F6; --gray50: #F9FAFB; + + --red:#ff0000; } diff --git a/faq.html b/faq.html index 82897d70..7fba9a65 100644 --- a/faq.html +++ b/faq.html @@ -35,7 +35,7 @@ - + @@ -45,7 +45,7 @@ - + diff --git a/image/Img_home_01.png b/images/Img_home_01.png similarity index 100% rename from image/Img_home_01.png rename to images/Img_home_01.png diff --git a/image/Img_home_02.png b/images/Img_home_02.png similarity index 100% rename from image/Img_home_02.png rename to images/Img_home_02.png diff --git a/image/Img_home_03.png b/images/Img_home_03.png similarity index 100% rename from image/Img_home_03.png rename to images/Img_home_03.png diff --git a/image/Img_home_bottom.png b/images/Img_home_bottom.png similarity index 100% rename from image/Img_home_bottom.png rename to images/Img_home_bottom.png diff --git a/image/Img_home_top.png b/images/Img_home_top.png similarity index 100% rename from image/Img_home_top.png rename to images/Img_home_top.png diff --git a/image/facebook.svg b/images/facebook.svg similarity index 100% rename from image/facebook.svg rename to images/facebook.svg diff --git a/image/google.svg b/images/google.svg similarity index 100% rename from image/google.svg rename to images/google.svg diff --git a/image/hidden.svg b/images/hidden.svg similarity index 100% rename from image/hidden.svg rename to images/hidden.svg diff --git a/image/instagram.svg b/images/instagram.svg similarity index 100% rename from image/instagram.svg rename to images/instagram.svg diff --git a/image/kakao.svg b/images/kakao.svg similarity index 100% rename from image/kakao.svg rename to images/kakao.svg diff --git a/image/login_page_logo.png b/images/login_page_logo.png similarity index 100% rename from image/login_page_logo.png rename to images/login_page_logo.png diff --git a/image/logo.svg b/images/logo.svg similarity index 100% rename from image/logo.svg rename to images/logo.svg diff --git a/image/m-logo.svg b/images/m-logo.svg similarity index 100% rename from image/m-logo.svg rename to images/m-logo.svg diff --git a/image/show.svg b/images/show.svg similarity index 100% rename from image/show.svg rename to images/show.svg diff --git a/image/thumb.png b/images/thumb.png similarity index 100% rename from image/thumb.png rename to images/thumb.png diff --git a/image/x.svg b/images/x.svg similarity index 100% rename from image/x.svg rename to images/x.svg diff --git a/image/youtube.svg b/images/youtube.svg similarity index 100% rename from image/youtube.svg rename to images/youtube.svg diff --git a/index.html b/index.html index fbb2b708..4794cd53 100644 --- a/index.html +++ b/index.html @@ -35,7 +35,7 @@ - + @@ -45,7 +45,7 @@ - + @@ -61,7 +61,7 @@
@@ -82,7 +82,7 @@

구경하러 가기

- +
@@ -92,7 +92,7 @@

- +
Hot item @@ -108,7 +108,7 @@

- +
Search @@ -124,7 +124,7 @@

- +
Register @@ -150,7 +150,7 @@

>

- +
@@ -170,22 +170,22 @@

diff --git a/items.html b/items.html index 6c8aa2f9..2b3918a8 100644 --- a/items.html +++ b/items.html @@ -35,7 +35,7 @@ - + @@ -45,7 +45,7 @@ - + diff --git a/js/login.js b/js/login.js new file mode 100644 index 00000000..c70e37f7 --- /dev/null +++ b/js/login.js @@ -0,0 +1,4 @@ +import {passwordShow, formCheck} from "./modules.js"; + +passwordShow(); +formCheck(); diff --git a/js/modules.js b/js/modules.js new file mode 100644 index 00000000..aaa1ccd4 --- /dev/null +++ b/js/modules.js @@ -0,0 +1,221 @@ +const SUBMIT = document.querySelector(".full-button"); // 전송 버튼 +const USER_INPUT = Array.from(document.getElementsByTagName("input")).filter( + (input) => { + return input.getAttribute("name") !== "showCheck"; + } +); // 비밀번호 입력 보기 체크 박스 제외 + +const delay = 500; // 0.5초 후 감지 +let timer; +let targetInput; +let inputParent; + +//submit 버튼 링크 막기 +function submitOff(e) { + e.preventDefault(); +} + +//비밀번호 입력 보기 +export function passwordShow() { + document.querySelector("form").addEventListener("click", (e) => { + if (e.target.getAttribute("name") === "showCheck") { + let password = e.target.closest(".input-box").querySelector("input"); // 패스워드 인풋 + + // 체크 상태에 따라 타입 변환 + password.setAttribute("type", e.target.checked ? "text" : "password"); + } + }); +} + +//입력중 이벤트 +export function writeCheck() { + //비밀번호 입력 모드 시 비밀번호확인 인풋도 에러메세지 삭제 + document.querySelector("#password").addEventListener("input", () => { + document.querySelector("#passwordCheck").classList.remove("err"); + document + .querySelector("#passwordCheck") + .closest(".input-group") + .querySelector(".alert-box") + .remove(); + }); +} + +//유효 체크 +export function formCheck() { + for (let i = 0; i < USER_INPUT.length; i++) { + //포커스를 잃었을때 + USER_INPUT[i].addEventListener("focusout", (e) => { + targetInput = e.target; + inputParent = targetInput.closest(".input-group"); + + let moveTarget = e.relatedTarget; + let targetTag = moveTarget.tagName == "INPUT"; //이동한 요소 확인 + + //input으로 이동 했을 때만 에러 메세지 출력 + if (targetTag) { + callBackCheck(); + } else { + targetInput = ""; + inputParent = ""; + } + }); + + // 입력이 끝났을 때 + USER_INPUT[i].addEventListener("keyup", (e) => { + targetInput = e.target; + inputParent = targetInput.closest(".input-group"); + + clearTimeout(timer); + timer = setTimeout(() => { + targetInput.value !== "" ? callBackCheck() : false; + }, delay); + }); + } +} + +//입력 오류 체크 콜백 +function callBackCheck() { + errorCheck(targetInput, inputParent, function (errorCallback) { + targetInput.classList.toggle("err", errorCallback); + + if (!errorCallback) { + inputParent.querySelector(".alert-box")?.remove(); + } + allCheck(); + }); +} + +//입력 오류 체크 +function errorCheck(input, wrap, callback) { + let error = true; + if (input.value === "") { + error = spaceCheck(wrap); + } else { + switch (input.getAttribute("name")) { + case "userEmail": + error = checkEmail(input, wrap); + break; + case "nickName": + error = nickNameCheck(input, wrap); + break; + case "password": + error = checkPassword(input, wrap); + break; + case "passwordCheck": + error = reconfirm(input, wrap); + break; + } + } + + callback(error); +} + +//이메일 체크 +function checkEmail(input, wrap) { + const emailPattern = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; + if (!emailPattern.test(input.value)) { + createAlert(wrap, "유효하지 않은 이메일입니다."); + return true; + } + return false; +} + +//닉네임 체크 +function nickNameCheck(input, wrap) { + if (input.value.length < 2) { + createAlert(wrap, "닉네임을 2자 이상 입력해주세요."); + return true; + } + return false; +} + +// 비밀 번호 입력 체크 +function checkPassword(input, wrap) { + const kor = /[가-힣]/; + if (kor.test(input.value)) { + createAlert(wrap, "한글을 사용할 수 없습니다."); + return true; + } else { + if (input.value.length < 8) { + createAlert(wrap, "비밀번호를 8자 이상 입력해주세요."); + return true; + } + } + return false; +} + +// 비밀번호 확인 체크 +function reconfirm(input, wrap) { + let firstPassword = document.querySelector("#password"); + if (firstPassword.value.length < 8) { + createAlert(wrap, "비밀번호를 8자 이상 입력해주세요."); + return true; + } else { + if (firstPassword.value !== input.value) { + createAlert(wrap, "비밀번호가 일치하지 않습니다."); + return true; + } + } + return false; +} + +//전체 유효성 확인 +function allCheck() { + let errorFound = false; // 오류가 발견되면 true로 변경 + + for (let i = 0; i < USER_INPUT.length; i++) { + errorFound = USER_INPUT.some((item) => item.value === ""); + if (errorFound) break; // 오류 발견 시 반복 종료 + errorCheck( + USER_INPUT[i], + USER_INPUT[i].closest(".input-group"), + function (error) { + //오류 리턴 일때 + if (error) { + USER_INPUT[i].classList.add("err"); + errorFound = true; + } + } + ); + } + + if (errorFound) { + SUBMIT.addEventListener("click", submitOff); + SUBMIT.classList.add("disabled-button"); + } else { + SUBMIT.removeEventListener("click", submitOff); + SUBMIT.classList.remove("disabled-button"); + } +} + +//공백체크 +function spaceCheck(wrap) { + // 공백일때 + let text = wrap.querySelector(".input-label").innerText; + let suffix = text === "비밀번호" ? "를 " : "을"; + + createAlert(wrap, `${text}${suffix} 입력해 주세요.`); + return true; +} + +//ALERT_BOX 생성 +function createAlert(wrap, text) { + if (!wrap.querySelector(".alert-box")) { + //alert-box가 없을때만 새로 만듦 + const ALERT_BOX = document.createElement("div"); + ALERT_BOX.classList.add("alert-box"); + ALERT_BOX.innerText = text; + wrap.appendChild(ALERT_BOX); + } else { + wrap.querySelector(".alert-box").innerText = text; + } +} + +// SUBMIT 버튼 +SUBMIT.addEventListener("click", submitOff); +SUBMIT.addEventListener("click", () => { + allCheck(); +}); +SUBMIT.addEventListener("focusin", () => { + allCheck(); +}); diff --git a/js/signup.js b/js/signup.js new file mode 100644 index 00000000..3a8c1aa2 --- /dev/null +++ b/js/signup.js @@ -0,0 +1,6 @@ + +import {passwordShow ,writeCheck,formCheck} from "./modules.js"; + +passwordShow(); +writeCheck(); +formCheck(); diff --git a/login.html b/login.html index 90268875..a2cb382f 100644 --- a/login.html +++ b/login.html @@ -35,7 +35,7 @@ - + @@ -45,7 +45,7 @@ - + @@ -53,6 +53,9 @@ + + + @@ -60,27 +63,27 @@

- 판다마켓 + 판다마켓

- +
-
- 로그인 + 로그인 diff --git a/privacy.html b/privacy.html index 3d2e5fd3..3b004483 100644 --- a/privacy.html +++ b/privacy.html @@ -35,7 +35,7 @@ - + @@ -45,7 +45,7 @@ - + diff --git a/signup.html b/signup.html index 305d99d4..0758d53b 100644 --- a/signup.html +++ b/signup.html @@ -1,134 +1,115 @@ - - - - - 판다마켓 + + + - - - - - - + + 판다마켓 - - - + + + + + + - - - - - - - - + + + - - - - - - - + + + + + + + + - - - - + + + + + + + + + + - -
-
-

- 판다마켓 -

- -
-
- -
- -
+ + + + + + +
+
+

+ 판다마켓 +

+ +
+
+ +
+
-
- -
- -
+
+
+ +
+
-
- -
- - -
+
+
+ +
+ +
-
- -
- - -
+
+
+ +
+ +
- 회원가입 - -
-
-
이미 회이신가요?
+
+ 회원가입 + - -
+
+
+
이미 회이신가요?
+
+ 로그인 +
+
+
- - +
+ + + \ No newline at end of file