JavaScript 30 Days Challenge
本文最后更新于 2022-09-21 01:51:47 UTC+08:00
项目地址:https://github.com/ligen131/JavaScript30
教程官网:https://javascript30.com/
本文记录做 Challenge 时的一些笔记和对教程方法的部分优化与拓展。
目录
| 项目 | 效果演示 | 主要内容 |
|---|---|---|
| 01 - JavaScript Drum Kit | Github Page | document.querySelector,
element.addEventListener |
| 02 - JS and CSS Clock | Github Page | CSS 动画 transform, transition |
| 03 - CSS Variables | Github Page | CSS 自定义变量并修改其值
document.documentElement.style.setProperty |
| 04 - Array Cardio Day 1 | Github Page | JavaScript 数组相关操作 filter(), map(),
sort(), reduce() |
| 05 - Flex Panel Gallery | Github Page | CSS flex |
| 06 - Type Ahead | Github Page | fetch(), 正则表达式 RegExp, CSS
perspective() |
| 07 - Array Cardio Day 2 | Github Page | JavaScript 数组相关操作 some(), every(),
find(), findIndex(), splice(),
slice(), ... 扩展运算符 |
| 08 - Fun with HTML5 Canvas | Github Page | HTML5 canvas, CSS hsl() 等颜色函数,
鼠标事件 |
01 - JavaScript Drum Kit
发现问题:键盘按住不放会导致放开后按键(key)
classList 一直处于 "key playing"
激活状态状态卡死,如下图。 
解决:将 classList.add() 改为切换。
1 | |
拓展:增加了鼠标点击按键播放
1 | |
02 - JS and CSS Clock
JS 中直接修改 style 会嵌入 HTML 中,具有除
!important 之外的最高优先级。
设置定时任务(Heart Beat)
1 | |
问题:每过一分钟,秒针都会从 450deg 瞬移到 90deg,效果是逆时针快速地转了一整圈,无法和下一分钟平滑过渡。分针、时针在分别过一小时、12 小时时同理。
解决:可以用变量记录已经转过的度数,每秒对应指针加上相应的度数即可,效果是跨过
0 秒时会从 450deg 变成 456deg,可以平滑过渡。或者,对 0
秒进行特判,使指针 style.transitionDuration = "0s"。
第一种方案实现:
1 | |
03 - CSS Variables
CSS 图片模糊
1 | |
问题:input.addEventListener 的事件若使用教程中的
change
会导致调色板需要选色结束退出后才生效(部分浏览器),使用
input 可以实时生效。
1 | |
一开始用之前的 addEventListener 和 style
手动更改。
1 | |
04 - Array Cardio Day 1
ES6 直接返回函数语法 (value) => value * value。
Array.prototype.sort(compareFunc) 比较函数有两个参数
a, b,需要交换(a 在 b 后)返回大于 0 的值,不需交换(a 在
b 前)返回小于 0 的值,保持原样(依浏览器而定,有些 a 在 b 前,有些 a 在
b 后)返回 0。一般而言,需要交换返回 1,无需交换返回
-1。如下列升序排序数组
1 | |
JS 中 const 数组经 arr.sort()
排序后仍然改变其值的顺序。🤔
05 - Flex Panel Gallery
贴几个 flex 相关链接
- 教程里提到的 https://flexbox.io/
- 图示很好 https://medium.com/@js_tut/complete-flex-tutorial-69b87e5fa947 翻译 https://blog.csdn.net/weixin_26712121/article/details/108925005
- https://cloud.tencent.com/developer/article/1354252
- Mozilla 官方文档 https://developer.mozilla.org/zh-CN/docs/Web/CSS/flex
- CSS 规范 https://www.shejidaren.com/css-written-specifications.html 这个网站还有很多 CSS 相关的好玩的东西 https://www.shejidaren.com/button-hover-and-click-effects.html
第一次知道 CSS 还有这么复杂的东西,看起来 CSS 引擎也是一个巨大的工程。
惯例先把图片存到本地,云端加载太慢。
问题:过快连续点击两次(双击)会导致无法触发
transitionend 事件,导致
panel.classList.toggle('active') 在 panel 处于
open
状态时仍然触发上下文字的移动,效果如下图。(左图:均未处于
open 状态,但左边 LET’S 被双击导致错误地处于
active 状态;右图:均处于 open 状态,但左边
LET’S 被双击导致错误地处于非 active 状态)


解决:分是否处于 open 状态结束的
transitionend 事件两种情况讨论,当触发
transitionend 事件时判断 panel.classList
是否存在 open 类(下面实现用 querySelector()
判断是否存在处于 open 状态的 panel)。
1 | |
06 - Type Ahead
表格 CSS 样式用到了 perspactive 透视,值越大代表离 z
平面越远。参考:https://css-tricks.com/almanac/properties/p/perspective/;Mozilla
官方文档:https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/perspective。
由于涉及到大小写模糊查找的问题,includes(),
match(), replace(string, string)
都区分大小写,故只能用正则表达式解决。modifiers 包含
"i" 可以使其不区分大小写。
1 | |
07 - Array Cardio Day 2
对象中的扩展运算符 ...
用于取出参数对象中的所有可遍历属性,拷贝到当前对象之中。
1 | |
08 - Fun with HTML5 Canvas
HTML5 Canvas 教程:https://blog.csdn.net/u012468376/article/details/73350998
CSS 常用颜色函数:https://cloud.tencent.com/developer/article/1849536
CSS hsl():https://blog.csdn.net/liuhao9999/article/details/125973912