使用JavaScript实现一个简单的待办事项列表todo-list
作者:椰汁33
这篇文章主要为大家详细介绍了如何使用JavaScript实现一个简单的待办事项列表todo-list,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下
页面效果
添加
删除
分析
html分析
- 定义一个id为app,class为container的div容器;
- 在该容器内再定义class为input-group的div容器,并在该容器内定义一个class为label的div容器,class为content的input输入框和class为btn的button;
- 在该容器内再定义class为list的div容器,用于存放列表。
css涉及的小知识点
- 弹性容器默认的主轴为x轴,子容器全部在主轴上对齐;
- 子容器默认继承弹性父容器100%的高;
- flex: 是否要放大 是否要缩小 设置的宽度;
- 居中:justify-content: center; align-items: center;
- .item:nth-child(1):class为item的第一个孩子容器。
js分析
要实现添加,删除和渲染清单的功能
思路
var todoData = []; var addTodo = document.querySelector('.btn');//按钮 var todoList = document.getElementById('todo-list');//获取ul var close = document.querySelector('.close');//关闭按钮
添加:先获取添加按钮的容器,然后给它绑定一个监听事件,当点击的时候触发回调函数,给定一个数组,用于存放todoList,获取输入框的内容,加入数组,通过渲染数组将todoList显示出来;
function addNewTodo(){ //获取input的内容 if (document.getElementById('newTodo').value.trim() != '') { todoData.push({ id:Math.floor(Date.now()),//时间戳 title:document.getElementById('newTodo').value, completed:true }); //渲染新的li render(); } };
删除:先获列表和关闭按钮容器,然后给列表容器绑定一个监听事件,当点击的时候触发回调函数,先判断是否点击删除按钮,如果点击了就获取关闭按钮的兄弟元素的内容,再查找该内容在数组中的下标,然后通过下标在数组中进行删除,再渲染数组进行更新;
function deleteTodo(event) { if (event.target.classList.contains('close')){ //首先获取关闭按钮元素 var close = event.target; //获取close兄弟元素的内容 var content = close.previousElementSibling.textContent; //查找要删除元素的下标 var index = todoData.findIndex(item => item.title === content); //删除该指定元素 todoData.splice(index, 1); //渲染li render(); } }
渲染:先定义一个空字符串,通过数组自带的遍历方法进行遍历,将该数组的元素通过列表显示,将其赋值给str,最后将str设为todoList容器的内容。
//将todoData中的数据渲染出来 function render(){ var str = ''; todoData.forEach(function(item){ str += ` <li class="item"> <div class="flex"> <input type="checkbox" class="item-check"> <p class="item-content">${item.title}</p> <span class="close">x</span><!-- uusx --> </div> </li> `; }); todoList.innerHTML = str; };
addTodo.addEventListener('click', addNewTodo); todoList.addEventListener('click',deleteTodo)
完整代码
html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>todoList</title> <link rel="stylesheet" href="./style.css" rel="external nofollow" > </head> <body> <div id="app" class="container"> <h2 class="title">Todo List</h2> <div class="input-group"> <div class="label">待办事项</div> <input type="text" class="content" id="newTodo"> <button class="btn">新增</button> </div> <div class="list"> <!-- ul>li*2{$}--> <ul id="todo-list"> </ul> </div> </div> <script src="./index.js"></script> </body> </html>
css
/* html{ height: 100%; } */ *{ padding: 0; margin: 0; } li{ list-style: none; } body{ display: flex; justify-content: center; align-items: center; /* height: 100%; */ height: 100vh; } .container{ width: 400px; height: 400px; background: linear-gradient(#da4453,#89216b); } .title{ text-align: center; margin: 10px; } .input-group{ display: flex; } .label{ /* 上右下左 */ padding: 5px 10px; } .btn{ padding: 5px 10px; margin-left: 10px; } .content{ flex: 1; } .item:nth-child(1){ margin-top: 20px; } .item{ border-bottom: 1px solid #eee; } .flex{ display: flex; width: 90%; /* m0-a */ margin: 0 auto; align-items: center; } .item-check{ margin-right: 20px; } .item-content{ flex: 13; } .close{ width: 30px; height: 30px; border: 1px solid #aaa; font-size: 20px; text-align: center; border-radius: 10px; cursor: pointer; }
js
var todoData = []; var addTodo = document.querySelector('.btn');//按钮 var todoList = document.getElementById('todo-list');//获取ul var close = document.querySelector('.close');//关闭按钮 //新增按钮 function addNewTodo(){ //获取input的内容 if (document.getElementById('newTodo').value.trim() != '') { todoData.push({ id:Math.floor(Date.now()),//时间戳 title:document.getElementById('newTodo').value, completed:true }); //渲染新的li render(); } }; //将todoData中的数据渲染出来 function render(){ var str = ''; todoData.forEach(function(item){ str += ` <li class="item"> <div class="flex"> <input type="checkbox" class="item-check"> <p class="item-content">${item.title}</p> <span class="close">x</span><!-- uusx --> </div> </li> `; }); todoList.innerHTML = str; }; function deleteTodo(event) { if (event.target.classList.contains('close')){ //首先获取关闭按钮元素 var close = event.target; //获取close兄弟元素的内容 var content = close.previousElementSibling.textContent; //查找要删除元素的下标 var index = todoData.findIndex(item => item.title === content); //删除该指定元素 todoData.splice(index, 1); //渲染li render(); } } addTodo.addEventListener('click', addNewTodo); todoList.addEventListener('click',deleteTodo)
到此这篇关于使用JavaScript实现一个简单的待办事项列表todo-list的文章就介绍到这了,更多相关JavaScript待办事项列表内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!