Table of contents
- Javascript and its ecosystem
-
Js basics
- Linking your JavaScript file
- Preparing your text editor
- The Console
- Comments
- You don't need semicolon
- Strings, numbers and booleans
- Declaring variables
- Functions
- Arrow functions
- Intro to objects
- If/else statements
- The NOT operator
- Null and Undefined
- The BOM and the DOM
- Selecting an Element
- Changing Classes
- Listening to events
- Callbacks
- Building simple components
- Arrays and loops
-
Dom basics
- Id, classes, attributes, and tags
- Changing CSS with JavaScript
- Getting CSS with JavaScript
- Changing Attributes
- Finding an element's size and position
- DOM Traversals
- 🛠 Tabby: Building Tabby (A Tabbed component)
- 🛠 Carousel: HTML and CSS
- 🛠 Carousel: Switching slides with JavaScript
- 🛠 Carousel: Working the dots
- 🛠 Carousel: Positioning slides with JavaScript
- Events deep dive
-
Animations and transitions
- CSS Transitions
- CSS Animations
- Silky-smooth animations
- Integrating CSS transitions and animations with JavaScript
- JavaScript animations
- GreenSock Animation API (GSAP)
- 🛠 Off-canvas menu: Animations
- 🛠 Modal: Animating the modal
- 🛠 Modal: Animating the pointing hand
- 🛠 Modal: Animating the waving hand
- 🛠 Modal: Wave hand animation with JavaScript (using GSAP)
- 🛠 Accordion: Animations
- 🛠 Carousel: Animations
-
Useful javascript features
- Ternary operators
- AND and OR operators
- Early returns
- Template Literals
- Destructuring
- Default parameters
- Enhanced Object Literals
- Rest and Spread
- Useful array methods
- Reduce
- Looping through objects
- Returning objects with implicit return
- 🛠 Accordion: Using useful JavaScript features
- 🛠 Tabby: Using useful JavaScript features
- 🛠 Carousel: Useful JavaScript features
-
Javascript best practices
- Write declarative code
- Functions with a purpose
- Manage scope
- Reduce state changes
- Don't reassign
- Don't mutate
- Preventing Objects from mutating
- Preventing Arrays from mutating
- Write pure functions
- 🛠 Accordion: Refactor
- 🛠 Carousel: First refactor
- 🛠 Carousel: Refactoring the dots part
- 🛠 Carousel: Previous and next buttons
- 🛠 Carousel: Second refactor
-
Text and content
- Changing Text and HTML
- Creating HTML Elements
- Adding multiple elements to the DOM
- Removing Elements from the DOM
- 🛠 Carousel: Creating dots with JavaScript
- 🛠️ Calculator: HTML and CSS
- 🛠️ Calculator: Happy Path
- 🛠️ Calculator: Testing the Happy Path
- 🛠️ Calculator: Easy Edge Cases
- 🛠️ Calculator: Difficult Edge Cases
- 🛠️ Calculator: Refactoring
- The switch statement
- 🛠️ Calculator: Refactoring (Part 2)
- 🛠️ Popover: Making one popover
- 🛠️ Popover: Making four popovers
- 🛠️ Popover: Making popovers with JavaScript
-
Forms
- Intro to forms
- Selecting form fields with JavaScript
- Form fields and their events
- Sanitize your output
- Generating unique IDs
- 🛠️ Popover: Dynamic ID
- 🛠️ Todolist: The HTML and CSS
- 🛠️ Todolist: Creating tasks with JavaScript
- 🛠️ Todolist: Deleting tasks with JavaScript
- 🛠️ Typeahead: The HTML and CSS
- 🛠️ Typeahead: Displaying predictions
- 🛠️ Typeahead: Selecting a prediction
- 🛠️ Typeahead: Bolding search terms
-
Dates
- The Date object
- Getting a formatted date
- Getting the time
- Local time and UTC Time
- Setting a specific date
- Setting a date with Date methods
- Adding (or subtracting) date and time
- Comparing Dates and times
- 🛠️ Datepicker: HTML and CSS
- 🛠️ Datepicker: Building the calendar
- 🛠️ Datepicker: Building the datepicker with JavaScript
- 🛠️ Datepicker: Previous and Next buttons
- 🛠️ Datepicker: Selecting a date
- 🛠️ Datepicker: Positioning the datepicker
- 🛠️ Datepicker: Showing and hiding
- Formatting a date with toLocaleString
- setTimeout
- setInterval
- 🛠️ Countdown timer: HTML and CSS
- 🛠️ Countdown timer: JavaScript
- 🛠️ Countdown timer: Counting Months
- 🛠️ Countdown timer: Daylight Saving Time
- 🛠️ Countdown timer: Counting Years
-
Asynchronous javascript
- Introduction to Ajax
- Understanding JSON
- The Fetch API
- Possible data types
- JavaScript Promises
- Requests and responses
- Sending a POST request
- Authentication
- Handling errors
- Viewing response headers
- CORS and JSONP
- XHR vs Fetch
- Using an Ajax library
- Reading API documentation
- Understanding curl
- 🛠️ Todolist: The Todolist API
- 🛠️ Todolist: Fetching tasks
- 🛠️ Todolist: Creating tasks
- 🛠️ Todolist: Editing tasks
- 🛠️ Todolist: Deleting tasks
- 🛠️ Todolist: Creating tasks with Optimistic UI
- 🛠️ Todolist: Handling Optimistic UI errors
- 🛠️ Todolist: Editing tasks with Optimistic UI
- 🛠️ Todolist: Deleting tasks with Optimistic UI
- 🛠️ Todolist: Refactor
- 🛠️ Typeahead: How to add Ajax
- 🛠️ Typeahead: Adding Ajax
- 🛠️ Typeahead: Handling errors
- 🛠️ Google Maps Clone: Creating your first Google Map
- 🛠️ Google Maps Clone: Fetching JSONP via JavaScript
- 🛠️ Google Maps Clone: Drawing directions
- 🛠️ Google Maps Clone: Driving directions
- 🛠️ Google Maps Clone: Handling errors
- 🛠️ Google Maps Clone: Adding stopovers
- 🛠️ Google Maps Clone: Refactor
-
Advanced asynchronous javascript
- Requesting many resources at once
- Asynchronous functions
- Handling multiple awaits
- Asynchronous loops
- 🛠️ Dota Heroes: Listing heroes
- 🛠️ Dota Heroes: Filtering heroes (Part 1)
- 🛠️ Dota Heroes: Filtering heroes (Part 2)
- 🛠️ Dota Heroes: Refactoring
- 🛠️ Dota Heroes: Hero Page
- 🛠️ Dota Heroes: Making the hero page robust
- 🛠️ Dota Heroes: Heroes page refactor
-
Keyboard
- Keyboard users
- Handling commonly used keys
- Keyboard events
- Understanding Tabindex
- Detecting the focused element
- Directing focus
- Preventing people from tabbing into elements
- How to choose keyboard shortcuts
- Creating single-key shortcuts
- 🛠️ Off-canvas: Adding keyboard interaction
- 🛠️ Modal: Adding keyboard interaction
- 🛠️ Accordion: Adding keyboard interaction
- 🛠️ Tabby: Adding keyboard interaction
- 🛠️ Tabby: Refactoring
- 🛠️ Carousel: Adding keyboard interaction
- 🛠️ Carousel: Displaying help text
- 🛠️ Calculator: Adding keyboard interaction
- 🛠️ Popover: Keyboard
- 🛠️ Popover: Refactor
- Keyboard shortcuts with Command and Control modifiers
- 🛠️ Todolist: Keyboard
- 🛠️ Typeahead: Keyboard
- 🛠️ Typeahead: Selecting a prediction with the keyboard
- 🛠️ Google Maps Clone: Keyboard
- 🛠️ Dota Heroes: Keyboard
- 🛠️ Datepicker: Tabbing in and out
- 🛠️ Datepicker: Keyboard shortcuts
-
Accessibility
- What is accessibility?
- How to use a screen reader
- Using NVDA
- Using Voiceover
- Aria roles
- Landmark roles
- Document structure roles
- Live region roles
- Widget roles
- Window and Abstract roles
- Accessible names and descriptions
- Hiding content
- ARIA properties and ARIA states
- ARIA for expandable widgets
- 🛠️ Off-canvas: Accessibility
- ARIA for modal dialogs
- 🛠️ Modal: Screen reader accessibility
- 🛠️ Accordion: Screen reader accessibility
- ARIA for Tabbed components
- 🛠️ Tabby: Screen reader accessibility
- 🛠️ Tabby: Refactor
- 🛠️ Carousel: Screen reader accessibility
- Roles that trigger Forms and Application modes
- What's next for accessibility?
-
Handling scroll
- The Scroll event
- 🛠️ Auto-hiding Sticky-nav: HTML and CSS
- 🛠️ Auto-hiding Sticky-nav: JavaScript
- 🛠️ Auto-hiding Sticky-nav: Natural reveal
- Intersection Observer API
- Intersection Observer Options
- 🛠️ Slide & Reveal
- 🛠️ Slide & Reveal: Always fade-in when you scroll down
- 🛠️ Slide & Reveal: Fine-tuning the animation
- 🛠️ Infinite Scroll: Anatomy
- 🛠️ Infinite Scroll: Infinite load
- 🛠️ Infinite Scroll: Refactor
- 🛠️ Infinite Scroll: Implementing the Infinite Scroll
-
Mouse, touch, and pointers
- Mouse Events
- 🛠️ Spinning Pacman: HTML and CSS
- 🛠️ Spinning Pacman: JavaScript
- Touch events
- Pointer events
- Touch-action
- 🛠️ Spinning Pacman: Supporting Touch
- Cloning elements
- 🛠️ DragDrop: HTML and CSS
- 🛠️ DragDrop: JavaScript
- 🛠️ DragDrop: Creating a drop preview
- 🛠️ DragDrop: Sortable drop preview
- 🛠️ DragDrop: Robustness
- 🛠️ DragDrop: Refactor
-
Object oriented programming
- Before we begin
- What is Object Oriented Programming?
- Four Flavours of Object Oriented Programming
- Inheritance
- This in JavaScript
- Call, bind, apply
- Creating Derivative Objects
- Composition vs Inheritance
- Polymorphism
- Encapsulation
- Closures
- Encapsulation in Object Oriented Programming
- Getters and Setters
- What OOP flavour to use
- When to use Object Oriented Programming
-
Writing reusable code
- Creating reusable code by writing libraries
- Two Types of libraries
- Including libraries with Script tags
- Including libraries with ES6 Modules
- Dynamic imports
- 🛠️ Off Canvas: Building a Library
- 🛠️ Modal: Library setup
- 🛠️ Modal: Opening the Modal
- 🛠️ Modal: Closing the modal
- 🛠️ Modal: Inheritance and Polymorphism
- 🛠️ Modal: Resolving differences between subclasses
- 🛠️ Modal: Exposing properties and methods
- 🛠️ Accordion: Building a library
- 🛠️ Tabby: Building a library
- 🛠️ Carousel: Building a library
- 🛠️ Calculator: Library
- 🛠️ Calculator: Fixing the Clear Key
- 🛠️ Calculator: Handling other keys
- 🛠️ Calculator: State
- 🛠️ Popover: Library
- 🛠️ Popover: Adding event listeners
- 🛠️ Typeahead: Library
- 🛠️ DatePicker: Library
-
JS to frameworks
- 🛠️ Building a Tiny framework
- 🛠️ Tiny: Add event listeners
- 🛠️ Tiny: Updating state
- 🛠️ Tiny: Rendering Child Components
- 🛠️ Tiny: Changing Parent State
- 🛠️ Tiny: Passing Props
- 🛠️ Tiny: Multiple Props
- 🛠️ Tiny: Passing values from sibling components
- 🛠️ Tiny: Mounting
- 🛠️ Tiny: Passing props to descendants
- 🛠️ Tiny: A tiny refactor
-
Single page apps
- What is a Single Page App?
- Simple SPA using only CSS
- The Location Interface
- The History Interface
- Minimum viable server for a SPA
- 🛠️ Dota SPA: Introduction
- 🛠️ Dota SPA: Building The Heroes List
- 🛠️ Dota SPA: Building the filters
- 🛠️ Dota SPA: Filtering heroes
- 🛠️ Dota SPA: Displaying filtered heroes
- 🛠️ Dota SPA: Getting Ready to build the Hero Page
- 🛠️ Dota SPA: Building the hero page
- 🛠️ Dota SPA: Lore and abilities
- 🛠️ Dota SPA: Routing for Single-page apps