Skip to content

Commit 51167f3

Browse files
author
hans
committed
write note
1 parent 80d87fd commit 51167f3

File tree

12 files changed

+342
-25
lines changed

12 files changed

+342
-25
lines changed
52 KB
Loading
103 KB
Loading
63.1 KB
Loading
63.1 KB
Loading
87.9 KB
Loading
52.2 KB
Loading

canvas/clock/js/scene.js

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@ class Scene {
1515
this.drawPoint()
1616
if (this.time > 40) this.drawRect()
1717
let { min, sec, hour } = this.getAngle()
18-
if (this.time > 75) this.drawScale(cx, cy, 4, 120, sec, '#de6655')
19-
if (this.time > 80) this.drawScale(cx, cy, 4, 100, min, '#666665')
20-
if (this.time > 90) this.drawScale(cx, cy, 4, 80, hour, '#666665')
18+
if (this.time > 75) this.drawNeedle(cx, cy, 4, 120, sec, '#de6655')
19+
if (this.time > 80) this.drawNeedle(cx, cy, 4, 100, min, '#666665')
20+
if (this.time > 90) this.drawNeedle(cx, cy, 4, 80, hour, '#666665')
2121
if (this.time > 100) this.drawPane2()
2222
}
2323
update() {
@@ -32,7 +32,7 @@ class Scene {
3232
let angle = (i * 360/12 + 90) * Math.PI / 180
3333
ctx.save()
3434
ctx.translate(cx + x, cy + y)
35-
if (this.time > 52 + i) this.drawScale(0, 0, w, h, angle, '#b70d0d')
35+
if (this.time > 52 + i) this.drawNeedle(0, 0, w, h, angle, '#b70d0d')
3636
ctx.rotate(angle)
3737
ctx.font="24px Verdana";
3838
ctx.fillStyle = '#272727'
@@ -81,7 +81,7 @@ class Scene {
8181
* @param {number} angle 偏移角度
8282
* @param {string} color 颜色值
8383
*/
84-
drawScale(x, y, w, h, angle, color='#000') {
84+
drawNeedle(x, y, w, h, angle, color='#000') {
8585
ctx.save()
8686
ctx.translate(x, y)
8787
ctx.rotate(angle)
@@ -103,9 +103,4 @@ class Scene {
103103
ctx.arc(x, y, r, 0, 6.28)
104104
ctx.fill()
105105
}
106-
delayDraw(fn, ms=1000) {
107-
return new Promise((resolve, reject) => {
108-
setTimeout(resolve(ms), ms)
109-
})
110-
}
111106
}

canvas/clock/readme.md

Lines changed: 136 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,143 @@
11
# canvas绘制钟表
22

3-
效果如图所示
3+
## 效果如图所示
44

55
![Honeycam 2019-07-09 11-54-04](./assets/01.gif)
66

7-
详细设计过程如下图所示
7+
## 详细设计过程
8+
9+
### 1. 分析
10+
11+
这个图形较为简单,使用的canvas api
12+
13+
- arc() 画圆
14+
15+
+ fillRect() 画矩形
16+
+ fillText() 画字
17+
18+
### 2. 拆分 & 图层
19+
20+
图形虽简单,但由于涉及的图形较多,这里面有一些覆盖关系,所以要分析图层关系,这也是我们后面要依次实现的函数,如下图所示
21+
22+
![1563162284953](assets/1563162284953.png)
23+
24+
### 3. 绘制
25+
26+
1. 外圆盘绘制 drawPane
27+
28+
绘制圆盘的过程其实很简单
29+
30+
```
31+
// 绘制圆api
32+
arc(x, y, r, 0, 2*PI)
33+
34+
// 由于绘制的圆较多,可以封装这样一个函数
35+
function drawArc(x, y, r, color) {...}
36+
37+
// 依次绘制3个圆
38+
drawArc(200, 200, 200, '#ff1515')
39+
drawArc(200, 200, 190, '#b70d0d')
40+
drawArc(200, 200, 180, '#ffffff')
41+
```
42+
43+
2. 绘制分钟刻度 drawPoint
44+
45+
分钟刻度共60个,圆环共360度,每刻度360/60,然后这里面使用三角函数求解即可
46+
47+
```
48+
// 伪代码
49+
for(let i=0; i<60; i++) {
50+
let α = i * 360/60
51+
let x = R * cosα
52+
let y = R * sinα
53+
arc(x, y, R, 0, 2*PI)
54+
}
55+
```
56+
57+
![1563161557373](assets/1563161557373.png)
58+
59+
3. 绘制矩形 drawRect
60+
61+
小时刻度共12个,圆环共360度,每刻度360/12,小时刻度看似和分钟刻度差不多,其实难度还是比较大的,
62+
63+
因为默认的旋转中心在(0,0),每次绘制需要手动的修改旋转中心
64+
65+
```
66+
// 伪代码
67+
for(let i=0; i<12; i++) {
68+
let α = i * 360/12
69+
let x = R * cosα
70+
let y = R * sinα
71+
translate(x, y)
72+
rotate(α + 90) // 思考为啥要 + 90度呢?
73+
fillRect(0, 0, w, h)
74+
}
75+
```
76+
77+
![1563161743001](assets/1563161743001.png)
78+
![1563162034809](assets/1563162034809.png)
79+
80+
4. drawNeedle
81+
82+
有了前面的基础,绘制指针就会简单很多,由于绘制指针和小时刻度相似,这里把它抽出来,做成单独的函数
83+
84+
```
85+
drawScale(x, y, w, h, angle, color) {...}
86+
```
87+
88+
计算指针的角度,这个看似难,其实非常简单
89+
90+
举个例子
91+
92+
- 秒针、分针共60刻度,均分360度 -> 360/60
93+
94+
- 时针共12刻度,均分360度 -> 360/12
95+
96+
这样做还是不够的,还有考虑秒对分的影响、秒分对时的影响,所以可以这样换算
97+
98+
```
99+
// 偏移角度 = 折算的当前时刻数 * 单位角度
100+
101+
sec * 360/60
102+
(min + sec/60) * 360/60
103+
(hour + min/60 + sec/60/60) * 360/12
104+
```
105+
106+
5. drawPane2
107+
108+
与drawPane相同就不赘述了
109+
110+
## 代码
111+
112+
113+
114+
115+
116+
117+
118+
119+
120+
121+
122+
123+
124+
125+
126+
127+
128+
129+
130+
131+
132+
133+
134+
135+
136+
137+
138+
139+
140+
141+
8142
9-
![1562655110920](./assets/1562655110920.png)
10143

desktop.ini

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
[ViewState]
2+
Mode=
3+
Vid=
4+
FolderType=Generic

知识点/note.md

Lines changed: 132 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,84 @@
1818

1919
- 比如login和regisger组件里的校验
2020

21+
```
22+
const register = (data) => {
23+
let { username, password, repassword, code } = data
24+
25+
if (!validate(username.rule, username.value)) {
26+
username.callback()
27+
return false
28+
}
29+
if (!validate(password.rule, password.value)) {
30+
password.callback()
31+
return false
32+
}
33+
if (!validate(repassword.rule, repassword.value)) {
34+
repassword.callback()
35+
return false
36+
}
37+
if (!validate(code.rule, code.value)) {
38+
code.callback()
39+
return false
40+
}
41+
return true
42+
}
43+
44+
const login = (data) => {
45+
let { username, password } = data
46+
47+
if (!validate(username.rule, username.value)) {
48+
username.callback()
49+
return false
50+
}
51+
if (!validate(password.rule, password.value)) {
52+
password.callback()
53+
return false
54+
}
55+
return true
56+
}
57+
58+
const write = (data) => {
59+
let { title, category, description, text } = data
60+
61+
return Object.values(data).some(e => {
62+
return !validate(e.rule, e.value)
63+
})
64+
65+
if (!validate(title.rule, title.value)) {
66+
title.callback()
67+
return false
68+
}
69+
if (!validate(category.rule, category.value)) {
70+
category.callback()
71+
return false
72+
}
73+
if (!validate(description.rule, description.value)) {
74+
description.callback()
75+
return false
76+
}
77+
if (!validate(text.rule, text.value)) {
78+
text.callback()
79+
return false
80+
}
81+
return true
82+
}
83+
84+
const validate = (rule, value) => {
85+
let reg = new RegExp(rule)
86+
return reg.test(value)
87+
}
88+
89+
export default {
90+
register,
91+
login,
92+
write,
93+
validate,
94+
}
95+
```
96+
97+
98+
2199
## 2. 一些算法
22100

23101
### 数组操作
@@ -113,4 +191,57 @@
113191
114192
```
115193

116-
9. 介绍一下Set Map对象
194+
9. 介绍一下Set Map对象
195+
196+
197+
198+
## 一些问题
199+
200+
1. h5新增标签,为啥加强标签语义化
201+
202+
常用的新增标签:header nav main section asider footer canvas video audio
203+
204+
- 对开发者友好,结构清晰,便于开发维护
205+
- 对设备优化,利于SEO,利于设备解析(屏幕阅读器、盲人阅读器)
206+
207+
2. 为啥要清楚浮动,如何清除浮动
208+
209+
高度塌陷
210+
211+
- 父元素设置高度
212+
- overflow:hidden
213+
- clear:both
214+
215+
3. 行内元素、块元素有那些,有什么不同
216+
217+
行内:span input img button a(宽、高内容撑开)
218+
219+
块:div p h1-h6 ul dl(宽度独占一行,高度内容撑开)
220+
221+
现象
222+
223+
- 行内元素默认水平排列
224+
- 块级元素可以包含行内元素和块级元素,行内元素不能包含块级元素
225+
- 行内元素设置width height无效,margin上下无效,padding上下无效。
226+
227+
4. 前端存储方式有那些
228+
229+
- cookie 请求头上带着数据,大小是4KB,document.cookie = '名字=值'
230+
- sessionStorage 本地存储,关闭页面后即被清空
231+
- localstorage 本地存储,key-value存储,永久存储,5MB
232+
- application cache 离线缓存,离线浏览,提升页面载入速度
233+
234+
5. VUE双向绑定的原理
235+
236+
6. css不换行、超出省略号
237+
238+
```
239+
overflow: hidden;
240+
text-overflow:ellipsis;
241+
white-space: nowrap;
242+
```
243+
244+
7. 跨域问题
245+
246+
247+

0 commit comments

Comments
 (0)