todoList.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
<style>
*{ margin: 0; padding: 0; box-sizing: border-box;}
li {list-style: none;}
#wrap {
width: 100%;
max-width: 1000px;
margin: 0 auto;
}
#todoHeader {
color: #fff;
padding: 30px 0;
text-align: center;
/* linear-grdient(방향, 색상1, 색상2, 색상3,...) */
/* radial-gradient */
/* background-image: linear-gradient(to right, yellow, green); */
background-image: linear-gradient(120deg, #99421c, #360e58 90%);
}
#todoHeader input {
border: none;
width: 60%;
height: 40px;
border-radius: 20px;
background: #fff;
/* 글자입력시 필요 */
padding-left: 30px;
/* input 클릭시 아웃라인 제거 */
outline: none;
}
#todoHeader button {
border: none;
outline: none;
/* 배경 투명 */
background: transparent;
/* input과 아이콘 맞추기 */
vertical-align: middle;
}
/* 아이콘 "하트" */
#todoHeader button i {
font-size: 30px;
color: #fff;
}
#listUl li {
background: #eee;
line-height: 40px;
padding-left: 20%;
padding-right: 20%;
position: relative;
}
#listUl li span {
float: right;
}
/* 체크 */
#listUl li.check {
text-decoration: line-through;
/* 체크된거 배경 조금 더 진하게 */
background: #ddd;
}
#listUl li.check::before {
content: "";
display: block;
width: 30px;
height: 15px;
/* ㄴ 모양의 그림자 */
border-bottom: 1px solid #333;
border-left: 1px solid #333;
/* 기울이기 */
transform: rotate(320deg);
position: absolute;
left: 16%;
top: 5px;
}
</style>
<script defer src="./todoScript.js"></script>
</head>
<body>
<div id="wrap">
<div id="todoHeader">
<h1>to do list</h1>
<div>
<input type="text" id="todoInput">
<button id="insertBtn"><i class="material-icons">favorite</i></button>
</div>
</div>
<div id="todoList">
<ul id="listUl"></ul>
</div>
</div>
</body>
</html>
todoScript.js
// ⭐변수 선언 btn input ul
let btn = document.querySelector('#insertBtn');
let input = document.querySelector('#todoInput')
let ul = document.querySelector('#listUl');
// ⭐btn 클릭
btn.addEventListener('click', addList);
// 💜 05.18)
input.addEventListener('keydown', function(e) {
console.log(e.key);
// 한글은 key: process
if(e.key === 'Enter') addList();
});
// ⭐btn 클릭시 실행되는 함수
// input에 value가 있는지 확인, 없으면 return,
// 있으면 그 값을 li에 넣어주고 li를 ul에 추가
function addList() {
if (!input.value) return; // 아니라면
let li = document.createElement('li'); // li 하나 만들겠다
li.innerHTML = `${input.value}<span>X</span>`;
ul.append(li); // li를 추가하겠다
input.value = ""; // 입력후 input에 값 없애주기
removeEvent(); // 함수호출, 추가될 때마다 함수 하나씩 더 생기니
}
// ⭐X를 클릭했을 때 실행되는 함수
// 클릭한 X의 부모요소를 삭제하기
function removeEvent() {
let spans = document.querySelectorAll('#listUl span'); // 모든 span선택, All로 선택하면 forEach사용가능
spans.forEach(span => span.addEventListener('click', function() {
this.parentElement.remove(); // 나의 부모요소를 찾아서
}))
}
// ⭐ul을 클릭하면 클릭한 대상이 li면 check클래스를 지정,
// check클래스가 있으면 제거
ul.addEventListener('click', function(e) { // 이벤트 객체 e
console.log(e);
if (e.target.nodeName === 'LI') e.target.classList.toggle('check');
// 찾을 수 있음, ↑ 클릭 대상이 li 인지 확인 / 뗏다 붙였다 ★
})
'JavaScript' 카테고리의 다른 글
[JavaScript] 과제6 / leftMenu (0) | 2023.03.10 |
---|---|
[JavaScript] 과제5 / 타자 (0) | 2023.03.10 |
[JavaScript] 과제3 / modal (0) | 2023.03.10 |
[JavaScript] 과제1 / 윤년, primeNumber, burger (0) | 2023.03.10 |
[JavaScript] 객체3 (0) | 2023.03.10 |