模仿ToDoList
1.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>ToDoList-最简单的待办事项列表</title> <link rel="stylesheet" href="css/index.css"> <script src="js/jquery.min.js"></script> <script src="js/tudolist.js"></script> </head> <body> <header> <section> <label for="title">ToDoList</label> <input type="text" id="title" name="title" placeholder="添加ToDo" required="required" autocomplete="off" /> </section> </header> <section> <h2>正在进行 <span id="todocount"></span></h2> <ol id="todolist" class="demo-box"> </ol> <h2>已经完成 <span id="donecount"></span></h2> <ul id="donelist"> </ul> </section> <footer> Copyright © 2021 todolist.cn </footer> </body> </html>
2.css
body { margin: 0; padding: 0; font-size: 16px; background: #CDCDCD; } header { height: 50px; background: #333; background: rgba(47, 47, 47, 0.98); } section { margin: 0 auto; } label { float: left; width: 100px; line-height: 50px; color: #DDD; font-size: 24px; cursor: pointer; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; } header input { float: right; width: 60%; height: 24px; margin-top: 12px; text-indent: 10px; border-radius: 5px; box-shadow: 0 1px 0 rgba(255, 255, 255, 0.24), 0 1px 6px rgba(0, 0, 0, 0.45) inset; border: none } input:focus { outline-width: 0 } h2 { position: relative; } span { position: absolute; top: 2px; right: 5px; display: inline-block; padding: 0 5px; height: 20px; border-radius: 20px; background: #E6E6FA; line-height: 22px; text-align: center; color: #666; font-size: 14px; } ol, ul { padding: 0; list-style: none; } li input { position: absolute; top: 2px; left: 10px; width: 22px; height: 22px; cursor: pointer; } p { margin: 0; } li p input { top: 3px; left: 40px; width: 70%; height: 20px; line-height: 14px; text-indent: 5px; font-size: 14px; } li { height: 32px; line-height: 32px; background: #fff; position: relative; margin-bottom: 10px; padding: 0 45px; border-radius: 3px; border-left: 5px solid #629A9C; box-shadow: 0 1px 2px rgba(0, 0, 0, 0.07); } ol li { cursor: move; } ul li { border-left: 5px solid #999; opacity: 0.5; } li a { position: absolute; top: 2px; right: 5px; display: inline-block; width: 14px; height: 12px; border-radius: 14px; border: 6px double #FFF; background: #CCC; line-height: 14px; text-align: center; color: #FFF; font-weight: bold; font-size: 14px; cursor: pointer; } footer { color: #666; font-size: 14px; text-align: center; } footer a { color: #666; text-decoration: none; color: #999; } @media screen and (max-device-width: 620px) { section { width: 96%; padding: 0 2%; } } @media screen and (min-width: 620px) { section { width: 600px; padding: 0 10px; } }
网站布局较为简单,附上html与css作为参考,事件列表通过js动态添加
ToDoList使用本地存储localStorage,可以使数据在浏览器关闭后再次打开不会丢失
$(function () { //1.按下回车 把数据存储到本地存储里面 //存储的数据格式 var todolist = [{title:"xxx",done:false}] load() $("#title").on("keydown", function (e) { if (e.keyCode === 13) { if ($(this).val() === "") { alert("不能为空") } else { //先读取本地存储的来源数据 var local = getData(); // console.log(local); //把local数组进行更新数据把最新的数据追加给local数组 local.push({ title: $(this).val(), done: false }); //把这个数组local 存储给本地存储 saveData(local); //2.toDoList 本地存储数据渲染加载到页面 load(); $(this).val("") } } }); //3.toDoList删除操作 $("ol,ul").on("click", "a", function () { //先获取本地存储 var data = getData(); //修改数据 var index = $(this).attr("id") data.splice(index, 1); //保存到本地存储 saveData(data) //重新渲染页面 load() }) //4.toDoList待完成和已完成选项操作 $("ul,ol").on("click", "input", function () { // 先获取本地数据 var data = getData(); // 修改数据 var index = $(this).siblings("a").attr("id"); data[index].done = $(this).prop("checked"); // 保存到本地存储 saveData(data) // 重新渲染页面 load() }) //读区本地存储的数据 function getData() { var data = localStorage.getItem("todolist") if (data != null) { //本地存储里面数据是字符串格式的,但是我们需要的是对象格式的 return JSON.parse(data) } else { return [] } } //保存本地存储数据 function saveData(data) { localStorage.setItem("todolist", JSON.stringify(data)) } //渲染加载数据 function load() { var data = getData(); var todoCount = 0;//正在进行个数 var doneCount = 0;//已经完成个数 console.log(data); //遍历之前先要清空ol里面的元素内容 $("ol,ul").empty(); //遍历 $.each(data, function (i, n) { // console.log(n); if (n.done) { $("ul").prepend("<li><input type='checkbox' checked='checked'><p>" + n.title + "</p><a href='javascript:;' id=" + i + "></a></li>") doneCount++ } else { $("ol").prepend("<li><input type='checkbox'><p>" + n.title + "</p><a href='javascript:;' id=" + i + "></a></li>") todoCount++ } }); $("#todocount").text(todoCount) $("#donecount").text(doneCount) } })