Web Development Handbook
Your comprehensive guide to mastering HTML, CSS, and JavaScript. From fundamentals to advanced concepts, everything you need to become a web developer.
HTML
Structure & Semantics
CSS
Styling & Layout
JavaScript
Interactivity & Logic
Web APIs
Browser APIs & Integration
HTML
HyperText Markup Language - The structure of the web
HTML Fundamentals
Learn the basic structure and syntax of HTML documents.
Basic HTML Document Structure
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>My First Web Page</title>
</head>
<body>
<h1>Welcome to My Website</h1>
<p>This is my first paragraph.</p>
</body>
</html>
💡 Pro Tips:
- Always include the DOCTYPE declaration
- Use semantic HTML elements for better accessibility
- Include meta tags for proper character encoding and viewport
Common HTML Elements
Master the most frequently used HTML elements and their purposes.
Essential HTML Elements
<h1>Main Heading</h1>
<h2>Subheading</h2>
<p>This is a paragraph with <strong>bold text</strong> and <em>italic text</em>.</p>
<ul>
<li>First list item</li>
<li>Second list item</li>
<li>Third list item</li>
</ul>
<a href="https://example.com">Visit Example.com</a>
<img src="image.jpg" alt="Description of image">
<div class="container">
<span>Inline element</span>
</div>
💡 Pro Tips:
- Use headings (h1-h6) to create a proper document outline
- Always include alt attributes for images
- Use strong and em for semantic emphasis, not just styling
HTML Forms
Create interactive forms to collect user input.
Complete Form Example
<form action="/submit" method="POST">
<fieldset>
<legend>Personal Information</legend>
<label for="name">Full Name:</label>
<input type="text" id="name" name="name" required>
<label for="email">Email:</label>
<input type="email" id="email" name="email" required>
<label for="phone">Phone:</label>
<input type="tel" id="phone" name="phone">
<label for="country">Country:</label>
<select id="country" name="country">
<option value="">Select a country</option>
<option value="us">United States</option>
<option value="ca">Canada</option>
<option value="uk">United Kingdom</option>
</select>
</fieldset>
<button type="submit">Submit Form</button>
<button type="reset">Reset Form</button>
</form>
💡 Pro Tips:
- Always associate labels with form controls using the "for" attribute
- Use appropriate input types for better user experience and validation
- Group related form elements using fieldset and legend
- Include proper form validation attributes like required, pattern, etc.
Semantic HTML
Use meaningful HTML elements that describe the content structure.
Semantic HTML Layout
<header>
<nav>
<ul>
<li><a href="#home">Home</a></li>
<li><a href="#about">About</a></li>
<li><a href="#contact">Contact</a></li>
</ul>
</nav>
</header>
<main>
<article>
<header>
<h1>Article Title</h1>
<p>Published on <time datetime="2024-01-15">January 15, 2024</time></p>
</header>
<section>
<h2>Introduction</h2>
<p>This is the introduction section of the article.</p>
</section>
<figure>
<img src="chart.png" alt="Sales data chart">
<figcaption>Sales data for Q1 2024</figcaption>
</figure>
</article>
<aside>
<h3>Related Articles</h3>
<ul>
<li><a href="/article1">Related Article 1</a></li>
<li><a href="/article2">Related Article 2</a></li>
</ul>
</aside>
</main>
<footer>
<p>© 2024 My Website. All rights reserved.</p>
</footer>
💡 Pro Tips:
- Use header, nav, main, article, section, aside, and footer for page structure
- Use time element for dates and times with datetime attribute
- Use figure and figcaption for images with captions
- Use address element for contact information
CSS
Cascading Style Sheets - Styling and layout for the web
CSS Fundamentals
Learn CSS syntax, selectors, and how to apply styles to HTML elements.
CSS Syntax and Selectors
/* Element Selector */
h1 {
color: #333;
font-size: 2rem;
margin-bottom: 1rem;
}
/* Class Selector */
.highlight {
background-color: yellow;
padding: 0.5rem;
border-radius: 4px;
}
/* ID Selector */
#header {
background-color: #f8f9fa;
padding: 2rem;
text-align: center;
}
/* Descendant Selector */
.container p {
line-height: 1.6;
margin-bottom: 1rem;
}
/* Pseudo-classes */
a:hover {
color: #007bff;
text-decoration: underline;
}
/* Pseudo-elements */
p::first-line {
font-weight: bold;
}
💡 Pro Tips:
- Use classes for reusable styles and IDs for unique elements
- Understand CSS specificity: inline > IDs > classes > elements
- Use meaningful class names that describe purpose, not appearance
- Group related CSS rules together for better organization
CSS Flexbox
Create flexible layouts with the Flexible Box Layout module.
Flexbox Layout
.flex-container {
display: flex;
gap: 1rem;
padding: 1rem;
}
/* Justify Content (main axis) */
.justify-center {
display: flex;
justify-content: center;
}
.justify-between {
display: flex;
justify-content: space-between;
}
/* Align Items (cross axis) */
.align-center {
display: flex;
align-items: center;
min-height: 200px;
}
/* Flex Items */
.flex-grow {
flex-grow: 1; /* Takes up remaining space */
}
/* Responsive Flex Layout */
.responsive-flex {
display: flex;
flex-wrap: wrap;
gap: 1rem;
}
.responsive-flex > * {
flex: 1 1 300px; /* Minimum 300px width */
}
💡 Pro Tips:
- Use justify-content for main axis alignment and align-items for cross axis
- flex-wrap allows items to wrap to new lines when needed
- The flex shorthand combines flex-grow, flex-shrink, and flex-basis
- Use gap property for consistent spacing between flex items
CSS Grid
Create complex two-dimensional layouts with CSS Grid.
CSS Grid Layout
/* Basic Grid Container */
.grid-container {
display: grid;
grid-template-columns: 1fr 2fr 1fr;
grid-template-rows: auto 1fr auto;
gap: 1rem;
min-height: 100vh;
}
/* Grid Template Areas */
.grid-areas {
display: grid;
grid-template-areas:
"header header header"
"sidebar main aside"
"footer footer footer";
grid-template-columns: 200px 1fr 150px;
grid-template-rows: 60px 1fr 40px;
gap: 1rem;
}
.header { grid-area: header; }
.sidebar { grid-area: sidebar; }
.main { grid-area: main; }
.aside { grid-area: aside; }
.footer { grid-area: footer; }
/* Responsive Grid */
.responsive-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 1rem;
}
💡 Pro Tips:
- Use grid-template-areas for intuitive layout definition
- fr units represent fractions of available space
- auto-fit and auto-fill create responsive grid layouts
- Grid items can overlap and be positioned precisely
Responsive Design
Create layouts that work on all device sizes using media queries and flexible units.
Responsive CSS Techniques
/* Mobile-First Approach */
.container {
width: 100%;
padding: 1rem;
margin: 0 auto;
}
/* Flexible Units */
.responsive-text {
font-size: clamp(1rem, 2.5vw, 2rem);
line-height: 1.5;
}
/* Media Queries */
@media (min-width: 768px) {
.container {
max-width: 720px;
padding: 2rem;
}
.responsive-grid {
grid-template-columns: repeat(2, 1fr);
}
}
@media (min-width: 992px) {
.container {
max-width: 960px;
}
.responsive-grid {
grid-template-columns: repeat(3, 1fr);
}
}
/* Responsive Images */
.responsive-image {
max-width: 100%;
height: auto;
display: block;
}
💡 Pro Tips:
- Start with mobile-first design and progressively enhance for larger screens
- Use relative units (rem, em, %, vw, vh) instead of fixed pixels
- Test your designs on various screen sizes and devices
- Use clamp() for fluid typography and spacing
JavaScript
The programming language of the web - Add interactivity and logic
JavaScript Fundamentals
Learn JavaScript syntax, variables, data types, and basic operations.
JavaScript Basics
// Variables and Data Types
let name = "John Doe"; // String
const age = 25; // Number
let isStudent = true; // Boolean
let hobbies = ["reading", "coding", "gaming"]; // Array
let person = { // Object
firstName: "John",
lastName: "Doe",
age: 25
};
// Template Literals
let greeting = `Hello, my name is ${name} and I am ${age} years old.`;
console.log(greeting);
// Functions
function calculateArea(length, width) {
return length * width;
}
// Arrow Functions
const calculatePerimeter = (length, width) => {
return 2 * (length + width);
};
// Shorter arrow function
const square = x => x * x;
// Array Methods
let numbers = [1, 2, 3, 4, 5];
let doubled = numbers.map(num => num * 2);
let evens = numbers.filter(num => num % 2 === 0);
let sum = numbers.reduce((acc, num) => acc + num, 0);
console.log("Doubled:", doubled);
console.log("Evens:", evens);
console.log("Sum:", sum);
💡 Pro Tips:
- Use const for values that won't change, let for variables that will
- Prefer arrow functions for short, simple functions
- Use template literals for string interpolation
- Learn array methods like map, filter, and reduce - they're very powerful
DOM Manipulation
Learn how to interact with HTML elements using JavaScript.
DOM Manipulation
// Selecting Elements
const title = document.getElementById('title');
const buttons = document.querySelectorAll('.btn');
const firstParagraph = document.querySelector('p');
// Creating Elements
const newDiv = document.createElement('div');
newDiv.className = 'container';
newDiv.textContent = 'This is a new div';
// Modifying Elements
title.textContent = 'New Title';
title.style.color = 'blue';
title.style.fontSize = '2rem';
// Adding/Removing Classes
title.classList.add('highlight');
title.classList.remove('old-style');
title.classList.toggle('active');
// Event Listeners
const button = document.getElementById('myButton');
button.addEventListener('click', function() {
alert('Button clicked!');
});
// Form Handling
const form = document.getElementById('myForm');
form.addEventListener('submit', (e) => {
e.preventDefault();
const formData = new FormData(form);
console.log('Form data:', Object.fromEntries(formData));
});
// Dynamic Content Creation
function createUserCard(user) {
const card = document.createElement('div');
card.className = 'user-card';
card.innerHTML = `
${user.name}
Email: ${user.email}
`;
return card;
}
💡 Pro Tips:
- Use querySelector and querySelectorAll for flexible element selection
- Always check if elements exist before manipulating them
- Use event delegation for dynamically created elements
- Prefer textContent over innerHTML for security when adding plain text
Asynchronous JavaScript
Handle asynchronous operations with promises and async/await.
Async JavaScript with Fetch
// Fetch API with Promises
fetch('https://jsonplaceholder.typicode.com/users/1')
.then(response => response.json())
.then(user => {
console.log('User:', user);
})
.catch(error => {
console.error('Error:', error);
});
// Async/Await
async function fetchUserData(userId) {
try {
const response = await fetch(`https://jsonplaceholder.typicode.com/users/${userId}`);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
const user = await response.json();
console.log('User data:', user);
return user;
} catch (error) {
console.error('Failed to fetch user:', error.message);
throw error;
}
}
// Using async function
fetchUserData(1);
// Multiple async operations
async function fetchMultipleUsers() {
try {
const [user1, user2, user3] = await Promise.all([
fetch('https://jsonplaceholder.typicode.com/users/1').then(r => r.json()),
fetch('https://jsonplaceholder.typicode.com/users/2').then(r => r.json()),
fetch('https://jsonplaceholder.typicode.com/users/3').then(r => r.json())
]);
console.log('All users:', { user1, user2, user3 });
} catch (error) {
console.error('Error fetching users:', error);
}
}
💡 Pro Tips:
- Use async/await for cleaner, more readable asynchronous code
- Always handle errors in async operations with try/catch
- Use Promise.all() for concurrent operations that don't depend on each other
- Remember that async functions always return a Promise
Interactive Demo
Try out JavaScript with this interactive example:
Output will appear here...
Code for the Interactive Demo:
// Interactive Demo Code
const demoBtn = document.getElementById('demo-btn');
const changeColorBtn = document.getElementById('change-color-btn');
const addTextBtn = document.getElementById('add-text-btn');
const output = document.getElementById('demo-output');
demoBtn.addEventListener('click', () => {
output.innerHTML = 'Button was clicked! 🎉
';
});
changeColorBtn.addEventListener('click', () => {
const colors = ['#ff6b35', '#f7931e', '#667eea', '#764ba2'];
const randomColor = colors[Math.floor(Math.random() * colors.length)];
output.style.backgroundColor = randomColor;
output.innerHTML = 'Background color changed!
';
});
addTextBtn.addEventListener('click', () => {
const newP = document.createElement('p');
newP.textContent = 'New paragraph added at ' + new Date().toLocaleTimeString();
newP.style.color = '#28a745';
output.appendChild(newP);
});
Web APIs
Modern browser APIs for enhanced functionality
🌐 Fetch API
Modern way to make HTTP requests and handle responses.
Fetch API Examples
// Basic GET Request
fetch('https://api.example.com/data')
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));
// POST Request with Data
fetch('https://api.example.com/users', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({
name: 'John Doe',
email: 'john@example.com'
})
})
.then(response => response.json())
.then(data => console.log('Success:', data));
// Async/Await Syntax
async function fetchData() {
try {
const response = await fetch('https://api.example.com/data');
if (!response.ok) {
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
}
const data = await response.json();
return data;
} catch (error) {
console.error('Fetch error:', error);
throw error;
}
}
💡 Pro Tips:
- Always handle errors with .catch() or try/catch
- Check response.ok before processing data
- Use appropriate HTTP methods (GET, POST, PUT, DELETE)
- Set proper headers for different content types
💾 Web Storage API
Store data locally in the user's browser.
Local Storage Examples
// localStorage - Persistent Storage
localStorage.setItem('username', 'JohnDoe');
localStorage.setItem('settings', JSON.stringify({theme: 'dark'}));
// Retrieve data
const username = localStorage.getItem('username');
const settings = JSON.parse(localStorage.getItem('settings'));
// sessionStorage - Session Storage (cleared when tab closes)
sessionStorage.setItem('tempData', 'temporary value');
const tempData = sessionStorage.getItem('tempData');
// Check if storage is available
if (typeof(Storage) !== "undefined") {
// Storage supported
console.log('Storage is available');
} else {
// No storage support
console.log('Storage not supported');
}
// Storage utility functions
const storage = {
set(key, value) {
try {
localStorage.setItem(key, JSON.stringify(value));
} catch (error) {
console.error('Storage error:', error);
}
},
get(key) {
try {
const item = localStorage.getItem(key);
return item ? JSON.parse(item) : null;
} catch (error) {
console.error('Storage error:', error);
return null;
}
}
};
💡 Pro Tips:
- localStorage persists until manually cleared
- sessionStorage clears when tab closes
- Store only strings - use JSON.stringify/parse for objects
- Check storage availability before using
📍 Geolocation API
Access user's geographical location with permission.
Geolocation Examples
// Get Current Position
if (navigator.geolocation) {
navigator.geolocation.getCurrentPosition(
function(position) {
const lat = position.coords.latitude;
const lon = position.coords.longitude;
const accuracy = position.coords.accuracy;
console.log(`Location: ${lat}, ${lon}`);
console.log(`Accuracy: ${accuracy} meters`);
// Use the coordinates (e.g., show on map)
showOnMap(lat, lon);
},
function(error) {
switch(error.code) {
case error.PERMISSION_DENIED:
console.error('User denied geolocation request');
break;
case error.POSITION_UNAVAILABLE:
console.error('Location information unavailable');
break;
case error.TIMEOUT:
console.error('Location request timeout');
break;
}
},
{
enableHighAccuracy: true,
timeout: 10000,
maximumAge: 60000
}
);
} else {
console.log('Geolocation not supported');
}
// Watch Position Changes
const watchId = navigator.geolocation.watchPosition(
function(position) {
const lat = position.coords.latitude;
const lon = position.coords.longitude;
updateLocation(lat, lon);
},
function(error) {
console.error('Watch error:', error);
}
);
// Stop watching
// navigator.geolocation.clearWatch(watchId);
💡 Pro Tips:
- Always check if geolocation is supported
- Handle permission denied gracefully
- Use options to control accuracy and timeout
- Clear watch when no longer needed
🔔 Notification API
Send browser notifications to engage users.
Notification Examples
// Request permission and show notification
async function requestNotificationPermission() {
if ('Notification' in window) {
const permission = await Notification.requestPermission();
if (permission === 'granted') {
showNotification('Welcome!', {
body: 'Notifications are now enabled',
icon: '/icon.png'
});
}
}
}
// Show notification function
function showNotification(title, options = {}) {
if (Notification.permission !== 'granted') {
console.log('Notification permission not granted');
return;
}
const notification = new Notification(title, {
body: options.body || '',
icon: options.icon || '/default-icon.png',
badge: options.badge || '/badge.png',
tag: options.tag || 'default',
requireInteraction: options.persistent || false,
data: options.data || {}
});
// Handle notification click
notification.onclick = function(event) {
event.preventDefault();
window.focus(); // Focus the window
this.close(); // Close notification
// Handle custom action
if (options.onClick) {
options.onClick(event);
}
};
// Auto close after 5 seconds
setTimeout(() => notification.close(), 5000);
return notification;
}
// Usage examples
showNotification('New Message', {
body: 'You have received a new message',
icon: '/message-icon.png',
tag: 'message',
onClick: () => {
// Open messages page
window.location.href = '/messages';
}
});
💡 Pro Tips:
- Always request permission before showing notifications
- Use meaningful titles and body text
- Provide click handlers for user interaction
- Don't spam users with too many notifications