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 @@
-

+
@@ -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 @@