Coder Social home page Coder Social logo

javascript30's Introduction

JavaScript30 - 一个月纯 JS 挑战中文指南

创建日期:2016-12-20
最后更新:2018-12-05

Repo by: Soyaine
JavaScript30 教程作者:Wes Bos
完整指南在 GitHub,喜欢请 Star 哦♪(^∇^*)

JavaScript30 是什么?

JavaScirpt30 是 Wes Bos 推出的一个 30 天挑战。项目免费提供了 30 个视频教程、30 个挑战的起始文档和 30 个挑战解决方案源代码。目的是帮助人们用纯 JavaScript 来写东西,不借助框架和库,也不使用编译器和引用。

官网的 slogan 如下:

Build 30 things in 30 days with 30 tutorial No Frameworks × No Compilers × No Libraries × No Boilerplate

关于《 JavaScript30 中文指南》

英文中描述纯 JavaScript 使用的单词是 vanilla JavaScript,vanilla 有平凡普通的意味,同时也有香草的释义,这个词很美,可惜我找不到适当的汉语来翻译它。我从入门前端时就在用纯 JavaScript 来写东西、写博客,看到这个挑战时很开心,觉得在前端社区各种框架热热闹闹的时候,有人回到最本真的地方,是很难得的一件事。

当然不可否认的是,新的工具可以帮助我们提高生产率,但最原始的 JavaScript 想必是很多人的知识结构里所缺失的部分,如果你也想探探究竟,欢迎跟着这份指南,一起逛逛 JavaScript 的原始世界。

写这份中文指南的另一个原因是看了 Nitish Dayal 写的 Guides,我决定效仿他,在记录笔记的同时梳理思路,整理形成指南。我相信 Learn by Use 的同时也深信教是最好的学。希望这份指南能够帮助到想要进行练习的人们,特别是那些想要入门的前端小白们。

目前这份指南还在更新之中,欢迎监督我,如果你想要及时获取新的文章,可以在 GitHub Star/Fork 我的 Repo

如何参加挑战

下面是完成 Wes Bos 的 JavaScript30 挑战所能借鉴的文档,每个文档的具体使用建议如下:

  • JavaScript30 官网:进入官网注册后可以观看和下载所有教程视频。
  • Nitish Dayal 写的英文指南:这是一份非官方的文字版指南,也是激励我写这一系列文章的主要因素。
  • 挑战初始文档:这是 Wes Bos 这份教程涉及的代码,你可以直接 Clone 或者下载到本地,然后开始你 30 天的挑战之旅。文档共有 30 个文件夹,每个文件夹中至少有两个文件。
    • index-START.html:是提供给我们的初始文档,方便我们专注于 JavaScript 的编写,这个文档已经将基础的 HTML 和 CSS 部分写好,我们只需要在这个基础上编写 JavaScript 代码,实现特定的功能即可。
    • index-FINISHED.html:已经实现了最终效果的文档,可以查看效果和实现思路。
  • 我写的中文指南源码:文档结构和 Wes Bos 提供的相同,进入每个文件夹都可查看当前挑战的指南(README.md),我完成挑战时建立的文件是 index-SOYAINE.html,里面有核心代码的中文注释。如果阅读过程中发现问题,请在这里提 issue。 如果喜欢记得 Star 哟~♪(^∇^*),鼓励我写出更好的文章。

目录

No Guide Demo
1 JavaScript Drum Kit 指南 纯 JS 模拟敲鼓效果
2 JS + CSS Clock 指南 纯 JavaScript+CSS 时钟效果
3 CSS Variables 指南 用 CSS 变量实现拖动控制参数效果
4 Array Cardio, Day 1 指南 数组基本操作方法示例一
5 Flex Panel Gallery 指南 可伸缩的图片墙在线效果
6 Type Ahead 指南 根据关键词快速匹配诗句在线效果
7 Array Cardio, Day 2 指南 数组基本操作方法示例二
8 Fun with HTML5 Canvas 指南 彩虹画笔绘画板在线效果
9 Dev Tools Domination 指南 Console 调试技巧在线示例
10 Hold Shift and Check Checkboxes 指南 Shift 批量选中在线效果
11 Custom Video Player 指南 -
12 Key Sequence Detection 指南 在线效果
13 Slide in on Scroll 指南 图片随屏幕滚动而滑入滑出的在线效果
14 JavaScript References vs. Copying 指南 -
15 LocalStorage 利用 localStorage 模拟在线菜单
16 Mouse Move Shadow 指南 文字阴影随鼠标移动在线效果
17 Sort Without Articles 指南 去前缀排序在线效果
18 Adding Up Times with Reduce 指南 使用 Reduce 进行时间叠加效果
19 Webcam Fun 指南 网络摄像头及图片处理在线效果
20 Speech Detection指南 Speech Detection效果
21 Geolocation指南 Geolocation效果
22 Follow Along Link Highlighter指南 Follow Along Link Highlighter效果
23 Speech Synthesis指南 Speech Synthesis效果
24 Sticky Nav指南 Sticky Nav效果
25 Event Related指南 Event Related效果
26 Stripe Follow Along Nav指南 Strip Follow Along Nav效果
27 Click and Drag指南 Click and Drag效果
28 Video Speed Controller指南 Video Speed Controller效果
29 Countdown Timer -
30 Whack A Mole -

参加挑战并不需要你缴纳费用或是加入什么组织,也不会有人催着你去做什么,你只需要打开电脑,然后开始思考、敲击键盘。相信内在动机的力量,我在这里给出了一些建议和心得,最适合你的方法还需要你自己去摸索。

本中文指南贡献者名单

Name Contribution
@DrakeXiang No.11
@zzh466 Review
@Xing Liu Review
@大史不说话 No.16.17.18.19.20.21.22.23.24.25.26.27.28
@Soyaine No.1.2.3.4.5.6.7.8.9.10.12.13.14

JOIN US

如果对这个系列的指南有什么改进的想法,欢迎提 issue,如果你也想参与写作,请看 wiki,并联系 Soyaine。

javascript30's People

Contributors

dashnowords avatar experdot avatar fyzhu avatar gitbook-bot avatar soyaine avatar sunha1yang avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

javascript30's Issues

习题2的问题 - 指针在临界角度跳跃的问题

妹纸哎,好稀有,棒棒的。

第二个案例使用的是 transform 那几个指针到 0 秒/分/时 的时候,会变成0,然后指针就从 450deg -> 90deg ,有个跳顿的情况

let secondDeg = 0,
	minDeg = 0,
	hourDeg = 0

setDate()

function setDate() {
	const date = new Date()
	const second = date.getSeconds()
	secondDeg = 90 + (second / 60) * 360
	const min = date.getMinutes()
	minDeg = 90 + (min / 60) * 360 + ((second / 60) / 60) * 360
	const hour = date.getHours()
	hourDeg = 90 + (hour / 12) * 360 + ((min / 60) / 12) * 360 + (((second / 60) / 60) / 12) * 360
	changeDate(secondDeg, minDeg, hourDeg)
}

function updateDate() {
	secondDeg += (1 / 60) * 360
	minDeg += ((1 / 60) / 60) * 360
	hourDeg += (((1 / 60) / 60) / 12)
	changeDate(secondDeg, minDeg, hourDeg)
}

function changeDate(s, m, h) {
	secHand.style.transform = `rotate(${ s }deg)`
	minHand.style.transform = `rotate(${ m }deg)`
	hourHand.style.transform = `rotate(${ h }deg)`
}

setInterval(updateDate, 1000)

我这里打算 setDate 初始化时间以后,一秒一秒地 updateDate 去改变时间

部分Demo没有定向到GitHub Pages

问题描述

README.md目录中第19~28项的Demo跳转链接没有定向到GitHub Pages页面

解决方案

  • 查找引用效果](https://github.com/soyaine/JavaScript30/blob/master/
  • 替换全部效果](https://soyaine.github.io/JavaScript30/

更新计划

O__O "…
拖得太久了。必须搞起计划来完成更新了。

感谢

写的很好,而且整理了资源,感谢!

关于day20的speechRecognition接口的问题

参考API文档编写代码后,本地测试无效,搭建本地服务器后,onresult事件返回值是'network'字符串,网上给出的解释是语音识别需要远程发送至google的服务器处理后才能返回,所以在国内得不到正确的响应,由于最近VPN问题查的比较严,我也没能测试,不知道是否是由于这个原因造成的?

关于05Gallery动画的一点小改进

  1. 不知道有没有人和我一样,感觉点击一处后其他地方没有归位很不舒服,就改进了一下在点击时归位其他元素。
  2. 还有双击问题,还有个JS的解决方法,直接在toggle open后面toggle open-active,和原效果一致,好处是不用修改CSS
const panels = Array.from(document.querySelectorAll('.panel'));

function toggleOpen(e) {
  this.classList.toggle('open');
  this.classList.toggle('open-active');
  // get siblings
  var s = [].filter.call(this.parentNode.children, (child)=>child!==this);
  s.forEach(s=>s.classList.remove('open')) 
}


panels.forEach(panel => panel.addEventListener('click', toggleOpen));

PS:昨天在Issue里被@后才发现这里,解决了自己的一个纠结问题,真是不错,一起学习哈~

JavaScript06,监听事件

search.addEventListener('change', displayMatches);
search.addEventListener('keyup', displayMatches);

可以替换为一个

search.addEventListener('input', displayMatches);

CSS Variables Problem

问题

function setHanld(){
      const suffix = this.dataset.sizing || '';
      // console.log(suffix);
     ....
    }
    inputs.forEach(input => input.addEventListener("mousemove",setHanld)); 

当鼠标只要经过input就会执行setHanld,性能上会不会有点问题

14 JS中的引用与复制

Refer to your words

最后需要注意的是:在前面的例子里面,我们用的数组和对象都只是一层嵌套,Lodash 有一个深度复制的方法,但你使用之前需要多考虑一下。

Actually, the JSON parse and stringify method, const dev2 = JSON.parse(JSON.stringify(wes));
is a kind of deep copy.

02 - JS + CSS Clock 细节 布局问题

.clock-face {
        position: relative;
        width: 100%;
        height: 100%;
        transform: translateY(-3px); /* account for the height of the clock hands */
}

transform: translateY(-3px); 应该删除,此处是hand指针高度为6px时,使其居中
而你的分别为时分秒设定不同的高度,并通过margin-top:-height/2 使其居中了

JavaScript 02 __ JS + CSS Clock

一个小细节,谷歌浏览器的默认最小字号是 12px。该练习的 CSS 代码中根元素的字号设置的是 10px,代码中很多元素使用了 rem 单位,但实际尺寸是按根元素字号 12px 来渲染的。我开始对此疑惑不解,后来才搞明白。
应该将代码中的字号更改过来,或者添加注释。

JavaScript01,transition 设置

transition 的样式属性默认是all,在样式里设置为transform

.key{
  transition: .15s transform linear;
}

这样,removeTransition就可以改成

 function removeTransition(event){
  /* if (event.propertyName !== 'transform') return; */ // 这句话不要了
  event.target.classList.remove('playing')
}

day 15 LocalStorage 補充

readme 中提到 LocalStorage 但可以在多補充一些細節。

使用 localStorage 的时候,直接把 items 传入得到的值是 [object Object]

這樣的原因是因為 local storage 裡面只會儲存 string 型別,如果傳入的非 string 會直接使用 toString 轉換

({}).toString() //"[object Object]"

這時候就會發生異常,所以才需要先使用 JSON.stringify() 將 object 轉換成 json 格式,讀取出來之後在利用 JSON.parse 轉換為 object

更新

請問javascript30目前還有在更新嗎??真的寫得很不錯,新手參考獲得很大效益!!謝謝!

04 - Array Cardio Day 1 中文答案中05参数错误

问题:我在看到04 - Array Cardio Day 1/index-SOYAINE.html文件第105行时,发现此处的people参数并没有passed与year,
而在同一文件夹的index-FINISHED.html文件中,此处people文件的位置显示的是inventors(处于第65行)

比较代码:
index-SOYAINE.html:
// 5. Sort the inventors by years lived、
// 按照他们在世的岁数进行排序
const oldest = people.sort((a, b) => {
const last = a.passed - a.year;
const next = b.passed - b.year;
return (next < last) ? -1 : 1;
});
console.table(oldest);

index-FINISHED.html:
// 5. Sort the inventors by years lived
const oldest = inventors.sort(function(a, b) {
const lastInventor = a.passed - a.year;
const nextInventor = b.passed - b.year;
return lastInventor > nextInventor ? -1 : 1;
});
console.table(oldest);

day 11 readme

播放/暂停的功能實現部份,只有寫到 video 點擊的監聽
缺少了播放按鈕的監聽
toggle.addEventListener('click', togglePlay);

13 - Slide in on Scroll

缉熙你好,该程序中的 debounce 防抖 我觉得应该是 throttle 节流

debounce 防抖

debounce 防抖 应该是在用户停止触发某个事件一段时间后,该事件的处理程序被触发。

比如输入用户名时的验证,应该等到用户输入完成,也就是停止输入后才触发,而不是在用户每次输入一段时间后就触发验证程序。用户名有长有短,不能在用户还未输入完成时就提示错误。

throttle 节流

throttle 节流 则是限制事件处理程序被调用的频率,在固定的时间内只会调用一次。

该程序只是为了限制 scroll 事件处理程序被调用的次数,这里应该是 throttle 节流

但我注意看了该程序的作用,确实是限制了 scroll 事件处理程序被调用的次数,那么就是名字起错了。

这里贴一段稍微容易理解的 throttle 节流 函数,该程序中的写法感觉好复杂:

function throttle (func, interval) {
  let startTime = Date.now()

  return function (...args) {
    const currentTime = Date.now()
    if (currentTime - startTime > interval) {
      func(...args)
      startTime = currentTime
    }
  }
}

关于day1的练习小疑问。

function removeTransition(event) {
if (event.propertyName !== 'transform') return; // 过滤其中一种事件
event.target.classList.remove('playing'); // 移除高亮的样式
}

这里判断 if (event.propertyName !== 'transform') return; 是什么意思? 为什么要判断这个?没有这句判断貌似也是正常运行啊

29-Countdown Timer 结束时间无法正确显示

问题

页面加载一段时间后再点击创建定时器的按钮,显示的结束时间与实际情况不符。

解决

用于获取当前时间的实例 date 在页面加载时就已作为全局变量创建,并且之后无法更新,计时结束的时间均以页面加载的时刻为基准计算,导致出现错误。
可将 Date 实例的创建放在 updateTime 函数内,每次点击按钮就重新获取当前时间:

function updateTime(delta){
    let currentTime = new Date().getTime();
    left = left + parseInt(delta,0);
    end = currentTime + left*1000;
    leftTime.innerHTML = left;
    endTime.innerHTML =new Date(end).toLocaleTimeString();
}

位置

end = date.getTime() + left*1000;

02 纯 JS、CSS 时钟 计算的时候建议加入取余运算,避免长时候运行后,数值大小溢出

在解决秒针突然跳动的 方法二中的

function updateDate() {
	secondDeg += (1 / 60) * 360;
	minDeg += ((1 / 60) / 60) * 360;
	hourDeg += (((1 / 60) / 60) / 12);
	
	secHand.style.transform = `rotate(${ secondDeg}deg)`;
	minHand.style.transform = `rotate(${ minDeg }deg)`;
	hourHand.style.transform = `rotate(${ hourDeg }deg)`;
}

建议改成

function updateDate() {
	secondDeg = (secondDeg + (1 / 60) * 360) % 360;
	minDeg = (minDeg + ((1 / 60) / 60) * 360) % 360;
	hourDeg = (hourDeg + (((1 / 60) / 60) / 12)) % 360;
	
	secHand.style.transform = `rotate(${ secondDeg}deg)`;
	minHand.style.transform = `rotate(${ minDeg }deg)`;
	hourHand.style.transform = `rotate(${ hourDeg }deg)`;
}

下载链接

官网最下面好像并没有提供百度云的下载链接,只有在课程界面才有。作者是找到了吗?

JS + CSS Clock

JS + CSS Clock 的README.md字打错了

里面所有的transform-origin 都打成了 transform-oragin

day 09 readme typo

console.log("输出一个小数是 %d ", 1.23); //1.23

這個部份有錯誤,要用 %f 才會是小數

请问01项目中css样式表的playing类?

作者你好,本人刚入门前端学习,在这个项目中注意到html文件中并未定义playing类,而css中却有对playing的属性编辑,这是有关css伪类吗?望解答谢谢🙏

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.