chapter2 千里之行始于跬步
没有什么事情是一蹴而就的,学习是需要一个学习曲线的,因此 掌握我们的学习规律、制定合适的学习计划 是非常必要的,那么这一篇文章就是 开发一个TodoApp 来帮助我们记录分析我们的学习曲线。
✅TODO
一个好的 TODO LIST 可以让我们更好的掌握自己的每日进度⌚️,记录我们的完成度📝,跟踪和统计我们的进度🛰️。
1.📚专业技术准备
首先我们需要了解一下,作为一个前端开发我们真的需要需要掌握哪些东西,那肯定是 HTML
, CSS
, JavaScript
。当然没有这些基础也可以跟着这篇文章制做TodoApp。
你可以通过下面这个网站检验一下的能力水平,或者作为了解学习一下相关知识。
🎯如果您真的毫无任何经验,那么仅需了解一下上方的基础教程即可,你可以将这篇文章当作对您是否真的对前端感兴趣的考验。
2.💡构思我们的TodoWeb应用
在做一个自己的应用之前,我们应该思考好我们具体要做一个什么东西,它有什么功能,他应该有怎么样子的图形页面。
2.1 MVC设计模式
我们可以采用一种简单的设计模式 MVC模式。如 图1 所示,其中
- Model(模型) - 模型代表一个存取数据的对象。它也可以带有逻辑,在数据变化时更新控制器。
- View(视图) - 视图代表模型包含的数据的可视化。
- Controller(控制器) - 控制器作用于模型和视图上。它控制数据流向模型对象,并在数据变化时更新视图。它使视图与模型分离开。
通过这种设计模式我们可以按步就班的开始我们的程序构思。
- 我们可以使用
JavaScript
脚本 和Nodejs
构建我们的控制器。 - 使用
DOM
、HTML
和CSS
构建视图。 - 运用
Javascript Object
构建模型。
2.2 简单梳理应用内容
TodoApp 是一个很简单的web程序,我们先简单考虑一下它有哪些功能,并且像我一样先将这些功能和设计简单列出来。(任何想法都可以,就是先记下来)
- 添加 新事项📝
- 编辑/删除/完成 事项⚙️
- 设定周期任务⏰
- 存储事项进度🗃
- 追踪任务进度📅
简要罗列了一下,我们可以进行一下啊简要的分析,可见这个应用主要围绕 事项 这一实例(对象)进行操作,对 事项 进行诸如 增/删/改 的操作。
根据 2.1 MVC 模式,我们可以将 事项 作为一个 Model模型 , 而 围绕他的功能实现 作为 Controller ,然后我们需要将 这些数据渲染成UI 也就是 View视图。这就是一个简单的 MVC模式的 近似应用。
2.3 从设计稿开始
构建项目最简单最清晰就是从设计稿开始了,简单的就是从 UI设计 开始,让我们一起打开 MasterGo (如果你有一定HTML、CSS基础那可以跳过这一部分)
1.我们使用MasterGo简单的绘制一个 UI界面
方便我们对 尺寸 和 布局 的掌控,从而快速地编写 静态页面 。
我已经做好并分享了了,点击直接查看→项目地址
2.分割各个内容模型
我们主要分为两个部分,输入框(图内序1)和 事务列表(图内序3)这两部分。
- 输入框:input标签 用于输入事项。
- 事务项:根据 事务项数组 渲染 事务项视图 。
3.使用 HTML 标签编写页面。
首先 在我们的 VScode 里面创建一个 index.js
文件。
在里面输入下方代码(🍧如果不是很了解html可以好好看看注释)
<!DOCTYPE html>
<html>
<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 的内容是你网页标签上的标题 -->
<title>Todo</title>
<!-- 样式表 -->
<style>
/* 如果实在看不懂所有内容 请浏览该网址 https://developer.mozilla.org/zh-CN/docs/Learn/CSS/First_steps */
body {
background-color: #808080;
}
/* css 自定义属性 */
/* 这里我们用来设置 主题 */
:root {
--main-bg-color: #FFFFFF;
--theme-primary: #5AEBEB;
--theme-secondary: #FFFFFF;
--theme-list-primary: #928A8A;
--theme-list-success: #55a068;
--theme-danger: #9b3333;
--theme-list-button: #D8D8D8;
}
.container {
/* 下面第一条可以设置居中显示 */
margin: auto;
width: 400px;
height: 600px;
border-radius: 30px;
background-color: var(--main-bg-color);
}
/* 顶部的样式 */
.topbanner {
position: relative;
border-radius: 30px 30px 0px 0px;
background-color: var(--theme-primary);
height: 120px;
}
.topbanner_inputbox {
position: absolute;
left: 33px;
top: 38px;
width: 340px;
height: 40px;
border-radius: 20px;
background: var(--theme-secondary);
}
.topbanner_inputbox .listInput {
float: left;
margin-left: 20px;
box-sizing: border-box;
border: none;
height: 100%;
}
.topbanner_inputbox .round_button {
border: none;
background-color: var(--theme-list-primary);
float: right;
box-sizing: border-box;
border-radius: 100%;
width: 40px;
height: 40px;
}
.topbanner_inputbox .round_button:hover {
background-color: var(--theme-list-success);
}
/* 列表内容的样式 */
.listitem {
border-radius: 0px 0px 30px 30px;
background-color: inherit;
height: 100%;
}
.itemcon {
box-sizing: border-box;
width: 400px;
height: 480px;
border-radius: 0px 0px 30px 30px;
background-color: var(--theme-secondary);
overflow-y: scroll;
}
.itemcon::-webkit-scrollbar {
display: none;
}
.itemlists {
margin: 0 auto;
width: 340px;
height: 480px;
}
.itemlists .item {
position: relative;
margin-top: 20px;
width: 340px;
height: 48px;
border-radius: 4px;
background: var(--theme-list-primary);
line-height: 48px;
box-shadow: 0 0 12px 2px rgb(167, 167, 167);
}
.itemlists .item.finish {
background-color: var