-
Notifications
You must be signed in to change notification settings - Fork 10
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
[1주차] 김동혁 미션 제출합니다. #2
base: master
Are you sure you want to change the base?
Changes from 4 commits
3744f29
1c1d7ff
316c6a7
b54ecd5
95ffb1a
f5d4b19
0266528
daf9717
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -1,5 +1,5 @@ | ||||||||||||||
<!DOCTYPE html> | ||||||||||||||
<html lang="en"> | ||||||||||||||
<html lang="ko"> | ||||||||||||||
<head> | ||||||||||||||
<meta charset="UTF-8" /> | ||||||||||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" /> | ||||||||||||||
|
@@ -8,7 +8,25 @@ | |||||||||||||
</head> | ||||||||||||||
|
||||||||||||||
<body> | ||||||||||||||
<div class="container"></div> | ||||||||||||||
<div class="wrapper"> | ||||||||||||||
<div class="header">✓ To Do</div> | ||||||||||||||
Comment on lines
+11
to
+12
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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 commentThe reason will be displayed to describe this comment to others. Learn more. 시멘틱 태그 활용, 그리고 h1태그 이용 습관화 해야겠어요. 감사합니다. |
||||||||||||||
<div class="todoContainer"> | ||||||||||||||
<h1 class="title">오늘 할 일</h1> | ||||||||||||||
<p id="todayDate"></p> | ||||||||||||||
Comment on lines
+13
to
+15
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. div 태그를 많이 쓰셨더라구요! KEY QUESTIONS로 알아본 웹 접근성을 위해서 참고할 수 있는 시맨틱 태그 공식문서 달아둘게요 > < |
||||||||||||||
|
||||||||||||||
<!-- input container --> | ||||||||||||||
<div class="WriteForm"> | ||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 저는 html 태그의 id, class 속성으로 주로 케밥케이스를 사용하는데요!
참고만 하면 될 것 같아요 ㅎㅎ 그치만 시작이름으로 영문 대문자, 숫자, 특수문자는 쓰지 않는다고 해요 ! |
||||||||||||||
<form id="todoForm" class="writeTodoForm"> | ||||||||||||||
Comment on lines
+18
to
+19
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 네이밍이 너무 좋아요 😆 의미를 가지는 이름으로 네이밍해줌으로써 가독성과 추후에는 유지보수성까지 좋아지겠네요 > < |
||||||||||||||
<img src="./icon/check.svg" class="check_icon" /> | ||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. svg를 사용해 훨씬 깔끔한 거 같아요! There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 맞아요 😆 여기서 alt 태그로 이미지 속성값을 넣어주면 더 좋아요 ! 우리는 웹 접근성을 위해서 코드를 짤때 시각장애인을 위해 화면을 읽어주는 기능인 '스크린리더'를 고려해주어야 하는데요, 스크린 리더는
|
||||||||||||||
<input type="text" class="TodoInput" placeholder="할 일 추가" /> | ||||||||||||||
<button class="submitBtn">추가</button> | ||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. button 태그를 사용할 때는 button의 기본 타입은 그래서 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 엔터를 누를 시 폼 제출이 되려고 form 태그, 그리고 submit타입을 이용한 것 이였는데, 이런 문제가 있을 수 있군요. 감사합니다! |
||||||||||||||
</form> | ||||||||||||||
</div> | ||||||||||||||
|
||||||||||||||
<!-- todo list --> | ||||||||||||||
<ul class="todoList"></ul> | ||||||||||||||
</div> | ||||||||||||||
</div> | ||||||||||||||
</body> | ||||||||||||||
<script src="script.js"></script> | ||||||||||||||
</html> |
Original file line number | Diff line number | Diff line change | ||||||||
---|---|---|---|---|---|---|---|---|---|---|
@@ -1 +1,109 @@ | ||||||||||
//CEOS 19기 프론트엔드 파이팅🔥 ദ്ദി˶ˊᵕˋ˵) | ||||||||||
// 오늘 날짜 | ||||||||||
const today = new Date(); | ||||||||||
const options = { | ||||||||||
month: "long", | ||||||||||
day: "numeric", | ||||||||||
weekday: "long", | ||||||||||
}; | ||||||||||
const dateString = today.toLocaleDateString("ko-KR", options); | ||||||||||
Comment on lines
+2
to
+8
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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 commentThe reason will be displayed to describe this comment to others. Learn more. 이 방법은 저도 배워갑니다...!! |
||||||||||
|
||||||||||
document.getElementById("todayDate").innerText = dateString; | ||||||||||
|
||||||||||
document.addEventListener("DOMContentLoaded", function () { | ||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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 commentThe 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 commentThe reason will be displayed to describe this comment to others. Learn more. 저도 이번에 과제를 하면서 새롭게 안 기능이라 한번 활용해보았어요! DOMContentLoaded 이벤트 리스너를 통해 HTML 문서가 완전히 로드되고 파싱된 후에 코드를 실행해요. 이는 할 일 목록 관련 스크립트가 문서의 나머지 부분이 로드되기를 기다리지 않고 실행될 수 있도록 하려고 한번 활용해보았어요. |
||||||||||
const todoForm = document.getElementById("todoForm"); | ||||||||||
const inputField = document.querySelector(".TodoInput"); | ||||||||||
const todoList = document.querySelector(".todoList"); | ||||||||||
|
||||||||||
// 할 일 목록 불러오기 및 표시 | ||||||||||
function loadToDos() { | ||||||||||
// 목록을 비우기 | ||||||||||
while (todoList.firstChild) { | ||||||||||
todoList.removeChild(todoList.firstChild); | ||||||||||
} | ||||||||||
|
||||||||||
// 로컬 스토리지에서 할 일 목록을 불러와서 페이지에 추가 | ||||||||||
const toDos = JSON.parse(localStorage.getItem("toDos")) || []; | ||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 로컬 스토리지까지 정말 짱입니다~! |
||||||||||
toDos.forEach((todo) => { | ||||||||||
addTodoItem(todo, false); // 이미 저장된 항목을 불러오므로, 여기서는 save 파라미터를 false로 설정 | ||||||||||
}); | ||||||||||
} | ||||||||||
|
||||||||||
// 할 일 추가 | ||||||||||
function addTodoItem(todoText, save = true) { | ||||||||||
const todoItem = document.createElement("li"); | ||||||||||
todoItem.classList.add("animate-slide-down"); | ||||||||||
|
||||||||||
const todoTextContent = document.createElement("span"); | ||||||||||
todoTextContent.textContent = todoText; | ||||||||||
|
||||||||||
// 삭제 버튼 | ||||||||||
const deleteButton = document.createElement("button"); | ||||||||||
deleteButton.textContent = "삭제"; | ||||||||||
deleteButton.onclick = function () { | ||||||||||
// 애니메이션 클래스 추가 | ||||||||||
todoItem.classList.add("animate-fade-out"); | ||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 애니메이션 넣어주니까 사용할 때 훨씬 보기 좋아요~! 좋습니다!! |
||||||||||
|
||||||||||
todoItem.addEventListener("animationend", () => { | ||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||||||||||
todoList.removeChild(todoItem); | ||||||||||
removeTodoFromStorage(todoText); | ||||||||||
}); | ||||||||||
}; | ||||||||||
|
||||||||||
// 완료 체크 이미지 생성 | ||||||||||
const completeCheck = document.createElement("img"); | ||||||||||
completeCheck.src = "./icon/NotCheck.svg"; | ||||||||||
completeCheck.style.cursor = "pointer"; | ||||||||||
completeCheck.setAttribute("data-checked", "false"); | ||||||||||
|
||||||||||
completeCheck.onclick = function () { | ||||||||||
const isChecked = this.getAttribute("data-checked") === "true"; | ||||||||||
if (isChecked) { | ||||||||||
this.src = "./icon/NotCheck.svg"; | ||||||||||
this.setAttribute("data-checked", "false"); | ||||||||||
todoTextContent.style.textDecoration = "none"; | ||||||||||
todoItem.style.color = "white"; | ||||||||||
} else { | ||||||||||
this.src = "./icon/checkComplete.svg"; | ||||||||||
this.setAttribute("data-checked", "true"); | ||||||||||
todoTextContent.style.textDecoration = "line-through"; | ||||||||||
todoItem.style.color = "#808080"; | ||||||||||
} | ||||||||||
}; | ||||||||||
|
||||||||||
todoList.insertBefore(todoItem, todoList.firstChild); | ||||||||||
todoItem.appendChild(completeCheck); | ||||||||||
todoItem.appendChild(todoTextContent); | ||||||||||
todoItem.appendChild(deleteButton); | ||||||||||
Comment on lines
+84
to
+86
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 이렇게도 표현이 가능하답니다 😆
Suggested change
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 한줄로 넣는 방법 감사합니다. |
||||||||||
|
||||||||||
if (save) { | ||||||||||
saveTodoToStorage(todoText); | ||||||||||
} | ||||||||||
} | ||||||||||
|
||||||||||
// 로컬 스토리지에 할 일 저장 | ||||||||||
function saveTodoToStorage(todoText) { | ||||||||||
const toDos = JSON.parse(localStorage.getItem("toDos")) || []; | ||||||||||
toDos.push(todoText); | ||||||||||
localStorage.setItem("toDos", JSON.stringify(toDos)); | ||||||||||
} | ||||||||||
|
||||||||||
// 로컬 스토리지에서 할 일 삭제 | ||||||||||
function removeTodoFromStorage(todoText) { | ||||||||||
const toDos = JSON.parse(localStorage.getItem("toDos")) || []; | ||||||||||
const updatedToDos = toDos.filter((todo) => todo !== todoText); | ||||||||||
localStorage.setItem("toDos", JSON.stringify(updatedToDos)); | ||||||||||
} | ||||||||||
|
||||||||||
// 폼 제출 이벤트 처리 | ||||||||||
todoForm.addEventListener("submit", function (e) { | ||||||||||
e.preventDefault(); | ||||||||||
const todoText = inputField.value.trim(); | ||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. trim()을 사용해 아무것도 입력되지 않을 때 리스트가 추가되지 않도록 꼼꼼하게 신경써주신 것 좋습니다~! There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. alert()를 함께 띄워줘도 좋을 것 같아요ㅎㅎ |
||||||||||
if (todoText !== "") { | ||||||||||
addTodoItem(todoText); | ||||||||||
inputField.value = ""; | ||||||||||
} | ||||||||||
}); | ||||||||||
|
||||||||||
// 페이지 로드 시 할 일 목록 불러오기 | ||||||||||
loadToDos(); | ||||||||||
}); |
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
@@ -1 +1,190 @@ | ||||||
/* 본인의 디자인 감각을 최대한 발휘해주세요! */ | ||||||
* { | ||||||
margin: 0; | ||||||
padding: 0; | ||||||
box-sizing: border-box; | ||||||
} | ||||||
Comment on lines
+1
to
+5
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 전체 선택자를 사용하셨네요 ! 좋은 것 같아요 ㅎㅎ 그런데 그래서 저의 경우 프로젝트를 시작할 때 reset.css를 적용해두고 시작하는데요 😃
한마디로, 브라우저의 기본요소의 디자인을 모두 없애는 것으로 주로 아래처럼 모두 0으로 만드는 방법을 통해 브라우저의 서식을 하나로 통일을 시키는 것이에요!
참고하기 좋은 블로그 하나 첨부할게요 😃 There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 항상 전체 선택자로 이용했는데 reset.css을 이용할 수도 있네요. 감사합니다. |
||||||
|
||||||
body { | ||||||
background-color: #252423; | ||||||
} | ||||||
h1 { | ||||||
font-size: 18px; | ||||||
color: #e9ecef; | ||||||
font-weight: 500; | ||||||
margin: 0; | ||||||
} | ||||||
|
||||||
/* 할일 추가 애니메이션 */ | ||||||
@keyframes slideDownFadeIn { | ||||||
from { | ||||||
opacity: 0; | ||||||
transform: translateY(-20px); | ||||||
} | ||||||
to { | ||||||
opacity: 1; | ||||||
transform: translateY(0); | ||||||
} | ||||||
} | ||||||
.animate-slide-down { | ||||||
animation: slideDownFadeIn 0.2s ease-out forwards; | ||||||
} | ||||||
/* */ | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 필요없는 주석은 삭제하는 것이 좋아요 > < |
||||||
|
||||||
/* 할일 삭제 애니메이션 */ | ||||||
@keyframes fadeOutScaleDown { | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 애니메이션보고 감탄했는데 keyframes로 하신거네요..! 멋져요 👍 |
||||||
from { | ||||||
opacity: 1; | ||||||
transform: scale(1); | ||||||
} | ||||||
to { | ||||||
opacity: 0; | ||||||
transform: scale(0.9); | ||||||
} | ||||||
} | ||||||
.animate-fade-out { | ||||||
animation: fadeOutScaleDown 0.3s ease-out forwards; | ||||||
} | ||||||
/* */ | ||||||
|
||||||
.wrapper { | ||||||
width: 100%; | ||||||
min-height: 100vh; | ||||||
display: flex; | ||||||
flex-direction: column; | ||||||
|
||||||
align-items: center; | ||||||
} | ||||||
Comment on lines
+49
to
+56
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. css 속성 정말 많죠...😂 그래서 저도 처음에는 이 속성을 썼었나 안썼었나 많이 헷갈렸어요! 지금보다 훨씬 속성이 많아진다면 정말 복잡해지겠죠? 분명히 속성을 써 내려가는 순서는 정해진 우선순위가 없고, 올바른 작성법이라고 권고하는 규칙도 없어요! 그래서 순전히 스타일시트를 작성하는 사람 편한대로 쓰는거는 저도 맞다고 생각하는데요, 이렇게 하면 아래와 같은 이점이 있더라고요
그런데 매번 순서를 고려해서 짜는게 어려으니 stylelint를 적용하시는걸 추천드려요😆 단축키 한번이면 뒤죽박죽 작성한 속성들을 순서대로 알아서 정렬해주는 이점이 있답니다! 그외에도 정렬 extenstion은 많으니 참고할 수 있는 블로그를 달아드릴게요 >.< There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. stylelint 처음들어보는 개념이라 생각못했네요. 순서들을 알아서 정렬해주는 거 필요했는데 리팩토링 시 이용해봐야겠어요. 감사합니다. |
||||||
.header { | ||||||
width: 100%; | ||||||
height: 6vh; | ||||||
background-color: #1b1a19; | ||||||
|
||||||
color: #e9ecef; | ||||||
text-align: left; | ||||||
padding-left: 45px; | ||||||
line-height: 6vh; | ||||||
font-size: 1.1rem; | ||||||
border-bottom: 1px solid #484644; | ||||||
Comment on lines
+62
to
+67
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 단위는 px, rem 통일해주는 것이 좋을 것 같아요 😆 |
||||||
} | ||||||
|
||||||
.todoContainer { | ||||||
width: 50%; | ||||||
min-height: 95vh; | ||||||
background-color: #1b1a19; | ||||||
padding: 30px; | ||||||
border-radius: 5px; | ||||||
box-shadow: 0 2px 2px rgba(0, 0, 0, 0.3); | ||||||
} | ||||||
|
||||||
#todayDate { | ||||||
font-size: 10px; | ||||||
color: gray; | ||||||
margin: 6px 0 0 1px; | ||||||
} | ||||||
.WriteForm { | ||||||
width: 100%; | ||||||
border-radius: 10px; | ||||||
margin-top: 20px; | ||||||
display: flex; | ||||||
flex-direction: column; | ||||||
background-color: #252423; | ||||||
} | ||||||
|
||||||
.writeTodoForm { | ||||||
width: 100%; | ||||||
height: 52px; | ||||||
display: flex; | ||||||
flex-direction: row; | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||||||
align-items: center; | ||||||
padding: 0 15px 0 15px; | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
Suggested change
|
||||||
/* border-bottom: 1px solid #8e8986; */ | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 여기도 주석 삭제..! > < |
||||||
} | ||||||
.InputFront { | ||||||
width: 15%; | ||||||
height: 50px; | ||||||
} | ||||||
.TodoInput { | ||||||
width: 100%; | ||||||
height: 50px; | ||||||
background-color: #252423; | ||||||
outline: none; | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||||||
border: none; | ||||||
color: #e9ecef; | ||||||
padding: 10px; | ||||||
} | ||||||
.TodoInput::placeholder { | ||||||
color: #788bff; /* Placeholder 텍스트 색상 변경 */ | ||||||
} | ||||||
.check_icon { | ||||||
width: 20px; | ||||||
height: 20px; | ||||||
margin: 0 15px 0 0px; | ||||||
fill: #788bff; | ||||||
} | ||||||
|
||||||
.SubmitTodo { | ||||||
width: 100%; | ||||||
height: 43px; | ||||||
display: flex; | ||||||
align-items: center; | ||||||
justify-content: right; | ||||||
padding-right: 5px; | ||||||
} | ||||||
.submitBtn { | ||||||
cursor: pointer; | ||||||
background-color: #252423; | ||||||
border: 1px solid #788bff; | ||||||
width: 42px; | ||||||
height: 22px; | ||||||
border-radius: 10px; | ||||||
font-size: 12px; | ||||||
color: #788bff; | ||||||
} | ||||||
.submitBtn:hover { | ||||||
background-color: #3c3a39; | ||||||
} | ||||||
|
||||||
.todoList { | ||||||
width: 100%; | ||||||
list-style: none; | ||||||
} | ||||||
|
||||||
.todoList li { | ||||||
width: 100%; | ||||||
height: 52px; | ||||||
border-radius: 10px; | ||||||
font-size: 13px; | ||||||
|
||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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 commentThe reason will be displayed to describe this comment to others. Learn more. 오.. 이런 오류가 있었군요. 리팩토링하면서 수정해볼게요. 감사합니다~! |
||||||
display: flex; | ||||||
justify-content: space-between; | ||||||
|
||||||
align-items: center; | ||||||
background-color: #252423; | ||||||
padding-right: 5px; | ||||||
margin: 5px 0px; | ||||||
padding: 0 15px 0 15px; | ||||||
color: #cdcdcd; | ||||||
} | ||||||
.todoList li span { | ||||||
width: 100%; | ||||||
padding: 0px 26.1px; | ||||||
} | ||||||
|
||||||
.todoList li input { | ||||||
width: 20px; | ||||||
height: 20px; | ||||||
} | ||||||
|
||||||
.todoList li button { | ||||||
cursor: pointer; | ||||||
background-color: #252423; | ||||||
border: 1px solid #788bff; | ||||||
width: 36px; | ||||||
height: 22px; | ||||||
border-radius: 10px; | ||||||
font-size: 12px; | ||||||
color: #788bff; | ||||||
} | ||||||
.todoList li button:hover { | ||||||
background-color: #3c3a39; | ||||||
} |
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.
semantic 태그가 사용되었으면 더 좋았을 것 같아요!
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.
semantic 태그를 사용해서 리팩토링 해볼게요 감사합니다.!!