利用前端三大件(html+css+js)开发一个简单的“todolist”项目

一、介绍

  todolist,即待办事项。在windows android ios上参考微软家出的那个To-Do应用,大概就是那样的。我这个更简单,功能只有“待办” “已完成”两项,并且是在浏览器打开的。

二、界面和文件结构这些...

  实际在浏览器中的网页如下: 

  在subline中的文件结构有index.html、index.css、index.js各一个,如下图:

三、程序

  参考注释即可看懂。

(1)index.html文件

 1 <!DOCTYPE html>
 2 <html>
 3     <head>
 4         <!-- http-equiv指定文档的内容类型和编码类型 -->
 5         <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 6         <!-- name属性 视图和描述 name+content -->
 7         <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
 8         <title>ToDoList—最简单的待办事项列表</title>
 9         <meta name="description" content="ToDoList无须注册即可使用,数据存储在用户浏览器的html5本地数据库里,是最简单最安全的待办事项列表应用!" />
10         <!-- 外接式css -->
11         <link rel="stylesheet" href="./index.css">
12     </head>
13     <body>
14         <!-- 头部:在这添加任务 -->
15         <div class="header">
16             <div class="box">
17                 <form action="javascript:postaction()" id="form">
18                     <!-- for将label标签绑定到input -->
19                     <label for="title">ToDoList</label>
20                     <!-- required规定提交表单之前有必填字段  autocomplete:自动补齐-->
21                     <input type="text" id="title" name="title" placeholder="添加ToDo" required="required" autocomplete="off" />
22                 </form>
23             </div>
24         </div>
25         <!-- 主体:在这进行任务和已完成 -->
26         <div class="content">
27             <h2 onclick="save()">正在进行 <span id="todocount"></span></h2>
28             <ol id="todolist" class="demo-box">
29             </ol>
30             <h2>已经完成 <span id="donecount"></span></h2>
31             <ul id="donelist">
32             </ul>
33         </div>
34         <!-- 脚部:印记和全清除按钮 -->
35         <div class="footer">
36             Copyright &copy; 2018 todolist.cn <a href="javascript:clear();">clear</a>
37         </div>
38         <!-- 外接式js -->
39         <script type="text/javascript" src="./index.js"></script>
40     </body>
41 </html>

index.html

(2)index.css文件

  1 /*清除默认样式  并设置简单样式*/
  2 body {
  3     margin: 0;
  4     padding: 0;
  5     font-size: 16px;
  6     background: #CDCDCD;
  7 }
  8
  9 .header {
 10     height: 50px;
 11     background: #333;
 12     /*background: rgba(47,47,47,0.98);*/
 13 }
 14
 15 .header .box,.content{
 16     width: 700px;
 17     padding: 0 10px;
 18     margin: 0 auto;
 19 }
 20 /*.content{
 21     margin: 0 auto;
 22 }*/
 23
 24 label {
 25     float: left;
 26     width: 100px;
 27     line-height: 50px;
 28     color: #DDD;
 29     font-size: 24px;
 30     /*鼠标悬停样式 一只手*/
 31     cursor: pointer;
 32     font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
 33 }
 34
 35 .header input {
 36     float: right;
 37     width: 60%;
 38     height: 24px;
 39     margin-top: 12px;
 40     /*首行缩进10px*/
 41     text-indent: 10px;
 42     /*圆角边框  好看不止一点点*/
 43     border-radius: 5px;
 44     /*盒子阴影 inset内阴影*/
 45     box-shadow: 0 1px 0 rgba(255,255,255,0.24), 0 1px 6px rgba(0,0,0,0.45) inset;
 46     border: none
 47 }
 48 /*选中输入框  轮廓的宽度为0*/
 49 input:focus {
 50     outline-width: 0;
 51 }
 52 /*父相子绝*/
 53 h2 {
 54     position: relative;
 55 }
 56
 57 span {
 58     position: absolute;
 59     top: 2px;
 60     right: 5px;
 61     /*设置行内块 有宽高*/
 62     display: inline-block;
 63     padding: 0 5px;
 64     height: 20px;
 65     border-radius: 20px;
 66     background: #E6E6FA;
 67     line-height: 22px;
 68     text-align: center;
 69     color: #666;
 70     font-size: 14px;
 71 }
 72 /*清除ol和ul标签的默认样式*/
 73 ol,ul {
 74     padding: 0;
 75     list-style: none;
 76 }
 77
 78 li {
 79     height: 32px;
 80     line-height: 32px;
 81     background: #fff;
 82     position: relative;
 83     margin-bottom: 10px;
 84     padding: 0 45px;
 85     border-radius: 3px;
 86     border-left: 5px solid #629A9C;
 87     box-shadow: 0 1px 2px rgba(0,0,0,0.07);
 88 }
 89 /*任务单选框*/
 90 li input {
 91     position: absolute;
 92     top: 2px;
 93     left: 10px;
 94     width: 22px;
 95     height: 22px;
 96     cursor: pointer;
 97 }
 98 /*任务内容*/
 99 p {
100     margin: 0;
101 }
102 /*任务内容的文本输入框,用来修改里面的内容*/
103 li p input {
104     top: 3px;
105     left: 40px;
106     width: 70%;
107     height: 20px;
108     line-height: 14px;
109     text-indent: 5px;
110     font-size: 14px;
111 }
112
113 ul li {
114     border-left: 5px solid #999;
115     /*不透明度 0完全透明~1完全不透明*/
116     opacity: 0.5;
117 }
118 /*勾选按钮*/
119 li a {
120     position: absolute;
121     top: 2px;
122     right: 5px;
123     display: inline-block;
124     width: 14px;
125     height: 12px;
126     border-radius: 14px;
127     border: 6px double #FFF;
128     background: #CCC;
129     line-height: 14px;
130     text-align: center;
131     color: #FFF;
132     font-weight: bold;
133     font-size: 14px;
134     cursor: pointer;
135 }
136
137 .footer {
138     color: #666;
139     font-size: 14px;
140     text-align: center;
141 }
142
143 .footer a {
144     /*color: #666;*/
145     text-decoration: none;
146     color: #999;
147 }

index.css

(3)index.js文件

  1 function clear() {
  2     localStorage.clear();
  3     load();
  4 }
  5
  6 function postaction() {
  7     // 获取title节点
  8     var title = document.getElementById("title");
  9     if (title.value.trim() == "") {
 10         alert("内容不能为空");
 11     } else {
 12         var data = loadData();
 13         var todo = { "title": title.value, "done": false };
 14         data.push(todo);
 15         saveData(data);
 16         var form = document.getElementById("form");
 17         form.reset();
 18         load();
 19     }
 20 }
 21
 22 function loadData() {
 23     var collection = localStorage.getItem("todo");
 24     if (collection != null) {
 25         return JSON.parse(collection);
 26     } else return [];
 27 }
 28
 29 function saveSort() {
 30     var todolist = document.getElementById("todolist");
 31     var donelist = document.getElementById("donelist");
 32     var ts = todolist.getElementsByTagName("p");
 33     var ds = donelist.getElementsByTagName("p");
 34     var data = [];
 35     for (i = 0; i < ts.length; i++) {
 36         var todo = { "title": ts[i].innerHTML, "done": false };
 37         data.unshift(todo);
 38     }
 39     for (i = 0; i < ds.length; i++) {
 40         var todo = { "title": ds[i].innerHTML, "done": true };
 41         data.unshift(todo);
 42     }
 43     saveData(data);
 44 }
 45
 46 function saveData(data) {
 47     localStorage.setItem("todo", JSON.stringify(data));
 48 }
 49
 50 function remove(i) {
 51     var data = loadData();
 52     var todo = data.splice(i, 1)[0];
 53     saveData(data);
 54     load();
 55 }
 56
 57 function update(i, field, value) {
 58     var data = loadData();
 59     var todo = data.splice(i, 1)[0];
 60     todo[field] = value;
 61     data.splice(i, 0, todo);
 62     saveData(data);
 63     load();
 64 }
 65
 66 function edit(i) {
 67     load();
 68     var p = document.getElementById("p-" + i);
 69     title = p.innerHTML;
 70     p.innerHTML = "<input id=‘input-" + i + "‘ value=‘" + title + "‘ />";
 71     var input = document.getElementById("input-" + i);
 72     input.setSelectionRange(0, input.value.length);
 73     input.focus();
 74     input.onblur = function() {
 75         if (input.value.length == 0) {
 76             p.innerHTML = title;
 77             alert("内容不能为空");
 78         } else {
 79             update(i, "title", input.value);
 80         }
 81     };
 82 }
 83
 84 function load() {
 85     var todolist = document.getElementById("todolist");
 86     var donelist = document.getElementById("donelist");
 87     var collection = localStorage.getItem("todo");
 88     if (collection != null) {
 89         var data = JSON.parse(collection);
 90         var todoCount = 0;
 91         var doneCount = 0;
 92         var todoString = "";
 93         var doneString = "";
 94         for (var i = data.length - 1; i >= 0; i--) {
 95             if (data[i].done) {
 96                 doneString += "<li draggable=‘true‘><input type=‘checkbox‘ onchange=‘update(" + i + ",\"done\",false)‘ checked=‘checked‘ />" +
 97                     "<p id=‘p-" + i + "‘ onclick=‘edit(" + i + ")‘>" + data[i].title + "</p>" +
 98                     "<a href=‘javascript:remove(" + i + ")‘>-</a></li>";
 99                 doneCount++;
100             } else {
101                 todoString += "<li draggable=‘true‘><input type=‘checkbox‘ onchange=‘update(" + i + ",\"done\",true)‘ />" +
102                     "<p id=‘p-" + i + "‘ onclick=‘edit(" + i + ")‘>" + data[i].title + "</p>" +
103                     "<a href=‘javascript:remove(" + i + ")‘>-</a></li>";
104                 todoCount++;
105             }
106         };
107         todocount.innerHTML = todoCount;
108         todolist.innerHTML = todoString;
109         donecount.innerHTML = doneCount;
110         donelist.innerHTML = doneString;
111     } else {
112         todocount.innerHTML = 0;
113         todolist.innerHTML = "";
114         donecount.innerHTML = 0;
115         donelist.innerHTML = "";
116     }
117 }
118
119 window.onload = load;
120
121 // window.addEventListener("storage", load, false);

index.js

  

原文地址:https://www.cnblogs.com/NuoMiGao/p/10103271.html

时间: 2024-10-10 10:17:54

利用前端三大件(html+css+js)开发一个简单的“todolist”项目的相关文章

分享:计算机图形学期末作业!!利用WebGL的第三方库three.js写一个简单的网页版“我的世界小游戏”

这几天一直在忙着期末考试,所以一直没有更新我的博客,今天刚把我的期末作业完成了,心情澎湃,所以晚上不管怎么样,我也要写一篇博客纪念一下我上课都没有听,还是通过强大的度娘完成了我的作业的经历.(当然作业不是百度来的,我只是百度了一些示例代码的意思,怎么用!算了,越解释万一越黑呢!哈哈O(∩_∩)O哈哈~) ----------------------------------------------------------------分界线------------------------------

Python开发一个简单的BBS论坛

项目:开发一个简单的BBS论坛 需求: 整体参考“抽屉新热榜” + “虎嗅网” 实现不同论坛版块 帖子列表展示 帖子评论数.点赞数展示 在线用户展示 允许登录用户发贴.评论.点赞 允许上传文件 帖子可被置顶 可进行多级评论 就先这些吧... 知识必备: Django HTML\CSS\JS BootStrap Jquery 设计表结构 1 # -*- coding:utf-8 -*- 2 from django.db import models 3 from django.contrib.aut

用JS做一个简单的电商产品放大镜功能

使用js制作一个简单的产品放大图 购物网站的产品页经常会放有一个产品展示图区.该图区有一个功能就是产品图的放大功能,移动左侧的焦点区域,可以放大细节部分观看,详情如下图.实现该功能的方法也非常简单. 实验:制作产品焦点放大图. 所需技能:1.基本的获取页面元素的方法: 2.几个简单的事件: 3.会使用dom设置元素的属性: 案例原理:1.焦点框的跟随鼠标事件: 2.焦点框的移动区域规定: 3.大盒子内容的显示: 适合对象:js初学者 -------------------------------

JS实现一个简单的计算器

使用JS完成一个简单的计算器功能.实现2个输入框中输入整数后,点击第三个输入框能给出2个整数的加减乘除.效果如上: 第一步: 创建构建运算函数count(). 第二步: 获取两个输入框中的值和获取选择框的值. 提示:document.getElementById( id名 ).value 获取或设置 id名的值. 第三步: 获取通过下拉框来选择的值来改变加减乘除的运算法则. 提示:使用switch判断运算法则. 第四步:  通过 = 按钮来调用创建的函数,得到结果. 注意: 使用parseInt

【Nginx】开发一个简单的HTTP模块

首先来分析一下HTTP模块是如何介入Nginx的. 当master进程fork出若干个workr子进程后,每个worker子进程都会在自己的for死循环中不断调用事件模块: for ( ;; ) { .... ngx_process_events_and_timers(cycle); /* 调用事件模块 */ .... } 事件模块检测是否有TCP连接请求,当收到一个SYN包后,由事件模块建立一条TCP连接.连接建立成功后,交由HTTP框架处理,HTTP框架负责接收HTTP头部,并根据头部信息将

使用JS完成一个简单的计算器功能

使用JS完成一个简单的计算器功能.实现2个输入框中输入整数后,点击第三个输入框能给出2个整数的加减乘除. 提示:获取元素的值设置和获取方法为:例:赋值:document.getElementById("id").value = 1: 取值:var = document.getElementById("id").value: 任务 第一步: 创建构建运算函数count(). 第二步: 获取两个输入框中的值和获取选择框的值. 提示:document.getElement

作业1开发一个简单的python计算器

开发一个简单的python计算器 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式(不能调用eval等类似功能偷懒实现),运算后得出结果,结果必须与真实的计算器所得出的结果一致 hint: re.search(r'\([^()]+\)',s).group() '(-

[3] 用D3.js做一个简单的图表吧!

本人的个人博客为: www.ourd3js.com csdn博客为: blog.csdn.net/lzhlzz 转载请注明出处,谢谢. 前面说了几节,都是对文字进行处理,这一节中将用 D3.js 做一个简单的柱形图. 做柱形图有很多种方法,比如用 HTML 的 div 标签,或用 svg . 推荐用 SVG 来做各种图形.SVG 意为可缩放矢量图形(Scalable Vector Graphics),SVG 使用 XML 格式定义图像,不清楚什么是SVG的朋友请先在 w3cschools 学习下

开发一个简单实用的android紧急求助软件

之前女朋友一个人住,不怎么放心,想找一个紧急求助的软件,万一有什么突发情况,可以立即知道.用金山手机卫士的手机定位功能可以知道对方的位置状态,但不能主动发送求助信息,在网上了很多的APK,都是鸡肋功能,都需要解锁.并打开软件,真正的紧急情况可能没有时间来完成这一系列操作. 于是我自己做了一个这样的软件,在紧急情况下,连续按电源键5次即可发送求救短信和位置信息给事先指定的用户,这个操作在裤兜里就能完成.原理很简单,就是设置监听器捕获屏幕的开关,在较短的时间内屏幕开关达到一定次数后,触发手机定位,定