引言
在当今数字化时代,前端开发已成为IT行业中最热门且需求量最大的职业之一。HTML5作为现代Web开发的基石,结合CSS3和JavaScript,构成了前端开发的三大核心技术栈。本课程旨在帮助零基础学员系统性地掌握HTML5前端开发的核心技能,并通过实战项目积累经验,最终提升就业竞争力。
第一部分:HTML5基础入门
1.1 HTML5概述与开发环境搭建
HTML5是万维网的核心语言,是构建Web内容的标准。与之前的版本相比,HTML5引入了大量新特性,如语义化标签、多媒体支持、Canvas绘图、本地存储等。
开发环境搭建:
- 文本编辑器:推荐使用Visual Studio Code(VS Code),它轻量、免费且功能强大,支持丰富的插件。
- 浏览器:Chrome浏览器是前端开发的首选,其开发者工具(DevTools)功能完善。
- 本地服务器:安装Node.js并使用
http-server或live-server来启动本地服务器,避免直接打开HTML文件导致的跨域问题。
# 安装Node.js后,安装http-server
npm install -g http-server
# 在项目目录下启动服务器
http-server
1.2 HTML5核心标签与语义化
HTML5引入了语义化标签,使代码结构更清晰,有利于SEO和可访问性。
常用语义化标签:
<header>:定义文档或节的页眉。<nav>:定义导航链接。<main>:定义主要内容。<article>:定义独立的内容块。<section>:定义文档中的节。<aside>:定义侧边栏内容。<footer>:定义文档或节的页脚。
示例:一个简单的HTML5页面结构
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>HTML5语义化示例</title>
</head>
<body>
<header>
<h1>我的网站</h1>
<nav>
<ul>
<li><a href="#">首页</a></li>
<li><a href="#">关于</a></li>
<li><a href="#">联系</a></li>
</ul>
</nav>
</header>
<main>
<article>
<h2>文章标题</h2>
<p>这是文章的主要内容...</p>
</article>
<section>
<h3>相关文章</h3>
<p>这里是相关文章的列表...</p>
</section>
</main>
<aside>
<h3>侧边栏</h3>
<p>这里是侧边栏内容...</p>
</aside>
<footer>
<p>© 2023 我的网站</p>
</footer>
</body>
</html>
1.3 HTML5表单与多媒体
HTML5增强了表单功能,引入了新的输入类型和属性,使表单验证更加简单。
新的输入类型:
email:邮箱地址url:URL地址number:数字date:日期range:滑块color:颜色选择器
多媒体支持:
<audio>:音频播放<video>:视频播放<source>:为媒体元素指定多个源
示例:HTML5表单与多媒体
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>HTML5表单与多媒体</title>
</head>
<body>
<form>
<label for="email">邮箱:</label>
<input type="email" id="email" name="email" required>
<label for="age">年龄:</label>
<input type="number" id="age" name="age" min="18" max="100">
<label for="birthdate">出生日期:</label>
<input type="date" id="birthdate" name="birthdate">
<label for="volume">音量:</label>
<input type="range" id="volume" name="volume" min="0" max="100">
<label for="color">选择颜色:</label>
<input type="color" id="color" name="color">
<button type="submit">提交</button>
</form>
<h3>音频播放器</h3>
<audio controls>
<source src="audio/song.mp3" type="audio/mpeg">
您的浏览器不支持音频播放。
</audio>
<h3>视频播放器</h3>
<video controls width="640" height="360">
<source src="video/movie.mp4" type="video/mp4">
您的浏览器不支持视频播放。
</video>
</body>
</html>
第二部分:CSS3样式设计
2.1 CSS3基础与选择器
CSS3是层叠样式表的最新版本,提供了丰富的样式和动画效果。
CSS3新特性:
- 选择器:属性选择器、伪类选择器、伪元素选择器。
- 盒模型:
box-sizing属性。 - 布局:Flexbox、Grid布局。
- 动画:
transition、animation、transform。 - 媒体查询:响应式设计。
CSS3选择器示例:
/* 属性选择器 */
input[type="text"] {
border: 1px solid #ccc;
padding: 8px;
}
/* 伪类选择器 */
a:hover {
color: #ff6600;
text-decoration: underline;
}
/* 伪元素选择器 */
p::first-letter {
font-size: 2em;
font-weight: bold;
color: #333;
}
/* 结构性伪类选择器 */
li:nth-child(odd) {
background-color: #f5f5f5;
}
2.2 Flexbox布局
Flexbox是一种一维布局模型,适用于在单行或单列中排列元素。
Flexbox容器属性:
display: flex;:定义Flex容器。flex-direction:主轴方向(row、column)。justify-content:主轴对齐方式。align-items:交叉轴对齐方式。flex-wrap:是否换行。
示例:使用Flexbox创建导航栏
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Flexbox导航栏</title>
<style>
.navbar {
display: flex;
justify-content: space-between;
align-items: center;
background-color: #333;
padding: 10px 20px;
}
.navbar ul {
display: flex;
list-style: none;
margin: 0;
padding: 0;
}
.navbar li {
margin-left: 20px;
}
.navbar a {
color: white;
text-decoration: none;
padding: 8px 16px;
border-radius: 4px;
transition: background-color 0.3s;
}
.navbar a:hover {
background-color: #555;
}
.logo {
font-size: 1.5em;
font-weight: bold;
color: white;
}
</style>
</head>
<body>
<nav class="navbar">
<div class="logo">MySite</div>
<ul>
<li><a href="#">首页</a></li>
<li><a href="#">产品</a></li>
<li><a href="#">服务</a></li>
<li><a href="#">关于</a></li>
<li><a href="#">联系</a></li>
</ul>
</nav>
</body>
</html>
2.3 CSS3动画与过渡
CSS3动画可以创建平滑的视觉效果,增强用户体验。
过渡(Transition):
.button {
background-color: #4CAF50;
color: white;
padding: 10px 20px;
border: none;
border-radius: 4px;
cursor: pointer;
transition: background-color 0.3s, transform 0.2s;
}
.button:hover {
background-color: #45a049;
transform: scale(1.05);
}
动画(Animation):
@keyframes slideIn {
from {
transform: translateX(-100%);
opacity: 0;
}
to {
transform: translateX(0);
opacity: 1;
}
}
.animated-box {
width: 200px;
height: 100px;
background-color: #3498db;
color: white;
display: flex;
align-items: center;
justify-content: center;
animation: slideIn 1s ease-out;
}
第三部分:JavaScript编程基础
3.1 JavaScript基础语法
JavaScript是前端开发的核心语言,用于实现网页的交互功能。
变量与数据类型:
// 变量声明
let name = "张三";
const age = 25;
var isStudent = true; // 不推荐使用var
// 数据类型
let str = "字符串";
let num = 42;
let bool = true;
let obj = { key: "value" };
let arr = [1, 2, 3];
let nul = null;
let undef = undefined;
函数与作用域:
// 函数声明
function greet(name) {
return `Hello, ${name}!`;
}
// 箭头函数
const greetArrow = (name) => `Hello, ${name}!`;
// 作用域示例
let globalVar = "全局变量";
function scopeTest() {
let localVar = "局部变量";
console.log(globalVar); // 可以访问
console.log(localVar); // 可以访问
}
scopeTest();
// console.log(localVar); // 错误:localVar未定义
3.2 DOM操作与事件处理
DOM(文档对象模型)是HTML文档的编程接口,JavaScript通过DOM操作网页元素。
DOM查询与修改:
// 获取元素
const header = document.querySelector('header');
const navLinks = document.querySelectorAll('nav a');
// 修改内容
header.textContent = "欢迎访问我的网站";
// 修改样式
header.style.backgroundColor = "#333";
header.style.color = "white";
// 创建新元素
const newParagraph = document.createElement('p');
newParagraph.textContent = "这是一个新段落";
document.body.appendChild(newParagraph);
事件处理:
// 点击事件
const button = document.querySelector('.button');
button.addEventListener('click', function() {
alert('按钮被点击了!');
});
// 表单提交事件
const form = document.querySelector('form');
form.addEventListener('submit', function(event) {
event.preventDefault(); // 阻止表单默认提交行为
const email = document.getElementById('email').value;
console.log('提交的邮箱:', email);
});
// 键盘事件
document.addEventListener('keydown', function(event) {
if (event.key === 'Escape') {
console.log('ESC键被按下');
}
});
3.3 异步编程与AJAX
现代Web应用需要处理异步操作,如网络请求、定时器等。
Promise与async/await:
// Promise示例
function fetchData(url) {
return new Promise((resolve, reject) => {
fetch(url)
.then(response => {
if (!response.ok) {
throw new Error('网络响应错误');
}
return response.json();
})
.then(data => resolve(data))
.catch(error => reject(error));
});
}
// async/await示例
async function getUserData() {
try {
const response = await fetch('https://api.example.com/users');
const users = await response.json();
console.log('用户数据:', users);
return users;
} catch (error) {
console.error('获取数据失败:', error);
}
}
AJAX请求示例:
// 使用fetch API获取数据
async function loadProducts() {
try {
const response = await fetch('https://api.example.com/products');
const products = await response.json();
// 渲染产品列表
const productContainer = document.getElementById('products');
productContainer.innerHTML = ''; // 清空容器
products.forEach(product => {
const productElement = document.createElement('div');
productElement.className = 'product-item';
productElement.innerHTML = `
<h3>${product.name}</h3>
<p>价格:¥${product.price}</p>
<button onclick="addToCart(${product.id})">加入购物车</button>
`;
productContainer.appendChild(productElement);
});
} catch (error) {
console.error('加载产品失败:', error);
document.getElementById('products').innerHTML = '<p>加载失败,请稍后重试</p>';
}
}
// 调用函数
loadProducts();
第四部分:前端框架与工具
4.1 现代前端框架介绍
现代前端开发通常使用框架来提高开发效率和代码可维护性。
主流框架:
- React:由Facebook开发,组件化思想,虚拟DOM。
- Vue:渐进式框架,易学易用,双向数据绑定。
- Angular:由Google开发,功能全面,适合大型项目。
框架选择建议:
- 初学者:从Vue或React开始,学习曲线相对平缓。
- 企业级项目:React或Angular,生态完善,社区活跃。
- 小型项目:Vue,轻量级,快速上手。
4.2 构建工具与包管理器
包管理器:
- npm:Node.js自带的包管理器,最常用。
- yarn:Facebook开发,速度更快,依赖管理更稳定。
构建工具:
- Webpack:模块打包器,功能强大,配置复杂。
- Vite:新一代构建工具,速度快,配置简单。
- Parcel:零配置,开箱即用。
示例:使用Vite创建Vue项目
# 安装Vite
npm install -g create-vite
# 创建Vue项目
npm create vite@latest my-vue-app -- --template vue
# 进入项目目录
cd my-vue-app
# 安装依赖
npm install
# 启动开发服务器
npm run dev
4.3 版本控制与协作
Git基础:
# 初始化仓库
git init
# 添加文件到暂存区
git add .
# 提交更改
git commit -m "Initial commit"
# 连接到远程仓库
git remote add origin https://github.com/username/repo.git
# 推送到远程仓库
git push -u origin main
# 创建分支
git checkout -b feature-branch
# 合并分支
git checkout main
git merge feature-branch
GitHub协作流程:
- Fork项目到自己的GitHub账户。
- 克隆Fork的仓库到本地。
- 创建新分支进行开发。
- 提交更改并推送到远程。
- 发起Pull Request(PR)到原项目。
第五部分:实战项目开发
5.1 项目一:个人博客网站
项目目标:
- 使用HTML5、CSS3和JavaScript构建一个响应式个人博客。
- 实现文章列表、文章详情页、分类和标签功能。
- 添加评论功能(可选)。
技术栈:
- HTML5:页面结构。
- CSS3:样式设计,使用Flexbox/Grid布局。
- JavaScript:交互功能,如文章筛选、评论提交。
- 本地存储:使用localStorage存储文章数据(模拟后端)。
项目结构:
blog-project/
├── index.html
├── css/
│ └── style.css
├── js/
│ └── main.js
├── images/
└── data/
└── articles.json
核心代码示例:
// main.js - 文章数据管理
class BlogManager {
constructor() {
this.articles = this.loadArticles();
}
loadArticles() {
// 从localStorage加载文章
const stored = localStorage.getItem('blog_articles');
if (stored) {
return JSON.parse(stored);
}
// 默认文章数据
return [
{
id: 1,
title: "HTML5入门指南",
content: "HTML5是现代Web开发的基础...",
category: "HTML",
tags: ["前端", "基础"],
date: "2023-01-15"
},
{
id: 2,
title: "CSS3动画技巧",
content: "CSS3提供了强大的动画功能...",
category: "CSS",
tags: ["动画", "设计"],
date: "2023-01-20"
}
];
}
saveArticles() {
localStorage.setItem('blog_articles', JSON.stringify(this.articles));
}
addArticle(article) {
article.id = Date.now(); // 简单ID生成
this.articles.push(article);
this.saveArticles();
}
getArticlesByCategory(category) {
return this.articles.filter(article => article.category === category);
}
getArticlesByTag(tag) {
return this.articles.filter(article => article.tags.includes(tag));
}
}
// 初始化博客管理器
const blogManager = new BlogManager();
// 渲染文章列表
function renderArticles(articles = blogManager.articles) {
const container = document.getElementById('articles-container');
container.innerHTML = '';
articles.forEach(article => {
const articleElement = document.createElement('article');
articleElement.className = 'article-card';
articleElement.innerHTML = `
<h3>${article.title}</h3>
<div class="meta">
<span class="category">${article.category}</span>
<span class="date">${article.date}</span>
</div>
<p>${article.content.substring(0, 100)}...</p>
<div class="tags">
${article.tags.map(tag => `<span class="tag">${tag}</span>`).join('')}
</div>
<button onclick="viewArticle(${article.id})">阅读全文</button>
`;
container.appendChild(articleElement);
});
}
// 按分类筛选
function filterByCategory(category) {
const filtered = blogManager.getArticlesByCategory(category);
renderArticles(filtered);
}
// 按标签筛选
function filterByTag(tag) {
const filtered = blogManager.getArticlesByTag(tag);
renderArticles(filtered);
}
// 查看文章详情
function viewArticle(id) {
const article = blogManager.articles.find(a => a.id === id);
if (article) {
// 显示文章详情模态框或跳转到详情页
alert(`文章标题:${article.title}\n内容:${article.content}`);
}
}
// 页面加载时渲染文章
document.addEventListener('DOMContentLoaded', () => {
renderArticles();
// 绑定分类筛选按钮
document.querySelectorAll('.category-filter').forEach(btn => {
btn.addEventListener('click', () => {
const category = btn.dataset.category;
filterByCategory(category);
});
});
// 绑定标签筛选按钮
document.querySelectorAll('.tag-filter').forEach(btn => {
btn.addEventListener('click', () => {
const tag = btn.dataset.tag;
filterByTag(tag);
});
});
});
5.2 项目二:电商产品展示页面
项目目标:
- 构建一个响应式电商产品展示页面。
- 实现产品搜索、筛选、排序功能。
- 添加购物车功能(使用localStorage)。
- 实现产品详情模态框。
技术栈:
- HTML5:页面结构。
- CSS3:响应式设计,使用Grid布局。
- JavaScript:交互逻辑,购物车管理。
- 本地存储:购物车数据持久化。
核心代码示例:
// 购物车管理类
class ShoppingCart {
constructor() {
this.items = this.loadCart();
}
loadCart() {
const stored = localStorage.getItem('shopping_cart');
return stored ? JSON.parse(stored) : [];
}
saveCart() {
localStorage.setItem('shopping_cart', JSON.stringify(this.items));
}
addItem(product, quantity = 1) {
const existingItem = this.items.find(item => item.id === product.id);
if (existingItem) {
existingItem.quantity += quantity;
} else {
this.items.push({
id: product.id,
name: product.name,
price: product.price,
image: product.image,
quantity: quantity
});
}
this.saveCart();
this.updateCartUI();
}
removeItem(productId) {
this.items = this.items.filter(item => item.id !== productId);
this.saveCart();
this.updateCartUI();
}
updateQuantity(productId, newQuantity) {
const item = this.items.find(item => item.id === productId);
if (item) {
if (newQuantity <= 0) {
this.removeItem(productId);
} else {
item.quantity = newQuantity;
this.saveCart();
this.updateCartUI();
}
}
}
getTotal() {
return this.items.reduce((total, item) => total + (item.price * item.quantity), 0);
}
getItemCount() {
return this.items.reduce((count, item) => count + item.quantity, 0);
}
updateCartUI() {
// 更新购物车图标数量
const cartCount = document.getElementById('cart-count');
if (cartCount) {
cartCount.textContent = this.getItemCount();
}
// 更新购物车详情
const cartItems = document.getElementById('cart-items');
if (cartItems) {
cartItems.innerHTML = '';
if (this.items.length === 0) {
cartItems.innerHTML = '<p>购物车是空的</p>';
return;
}
this.items.forEach(item => {
const itemElement = document.createElement('div');
itemElement.className = 'cart-item';
itemElement.innerHTML = `
<img src="${item.image}" alt="${item.name}" width="50">
<div class="item-info">
<h4>${item.name}</h4>
<p>¥${item.price} × ${item.quantity} = ¥${(item.price * item.quantity).toFixed(2)}</p>
</div>
<div class="item-actions">
<button onclick="cart.updateQuantity(${item.id}, ${item.quantity - 1})">-</button>
<span>${item.quantity}</span>
<button onclick="cart.updateQuantity(${item.id}, ${item.quantity + 1})">+</button>
<button onclick="cart.removeItem(${item.id})">删除</button>
</div>
`;
cartItems.appendChild(itemElement);
});
// 更新总计
const totalElement = document.getElementById('cart-total');
if (totalElement) {
totalElement.textContent = `总计:¥${this.getTotal().toFixed(2)}`;
}
}
}
}
// 产品管理类
class ProductManager {
constructor() {
this.products = this.loadProducts();
}
loadProducts() {
// 模拟产品数据
return [
{ id: 1, name: "无线耳机", price: 299, category: "电子", image: "images/headphone.jpg", description: "高音质无线耳机" },
{ id: 2, name: "智能手表", price: 599, category: "电子", image: "images/watch.jpg", description: "健康监测智能手表" },
{ id: 3, name: "运动鞋", price: 199, category: "服饰", image: "images/shoes.jpg", description: "舒适透气运动鞋" },
{ id: 4, name: "背包", price: 149, category: "箱包", image: "images/bag.jpg", description: "多功能旅行背包" },
{ id: 5, name: "咖啡机", price: 399, category: "家电", image: "images/coffee.jpg", description: "全自动咖啡机" },
{ id: 6, name: "台灯", price: 89, category: "家居", image: "images/lamp.jpg", description: "护眼LED台灯" }
];
}
searchProducts(query) {
query = query.toLowerCase();
return this.products.filter(product =>
product.name.toLowerCase().includes(query) ||
product.description.toLowerCase().includes(query)
);
}
filterByCategory(category) {
if (category === 'all') return this.products;
return this.products.filter(product => product.category === category);
}
sortProducts(products, sortBy) {
switch(sortBy) {
case 'price-asc':
return [...products].sort((a, b) => a.price - b.price);
case 'price-desc':
return [...products].sort((a, b) => b.price - a.price);
case 'name-asc':
return [...products].sort((a, b) => a.name.localeCompare(b.name));
default:
return products;
}
}
}
// 初始化
const cart = new ShoppingCart();
const productManager = new ProductManager();
// 渲染产品列表
function renderProducts(products = productManager.products) {
const container = document.getElementById('products-container');
container.innerHTML = '';
products.forEach(product => {
const productElement = document.createElement('div');
productElement.className = 'product-card';
productElement.innerHTML = `
<img src="${product.image}" alt="${product.name}" class="product-image">
<div class="product-info">
<h3>${product.name}</h3>
<p class="price">¥${product.price}</p>
<p class="category">${product.category}</p>
<button class="add-to-cart" data-id="${product.id}">加入购物车</button>
<button class="view-details" data-id="${product.id}">查看详情</button>
</div>
`;
container.appendChild(productElement);
});
// 绑定事件
document.querySelectorAll('.add-to-cart').forEach(btn => {
btn.addEventListener('click', (e) => {
const productId = parseInt(e.target.dataset.id);
const product = productManager.products.find(p => p.id === productId);
if (product) {
cart.addItem(product);
alert(`${product.name} 已添加到购物车!`);
}
});
});
document.querySelectorAll('.view-details').forEach(btn => {
btn.addEventListener('click', (e) => {
const productId = parseInt(e.target.dataset.id);
showProductDetails(productId);
});
});
}
// 显示产品详情
function showProductDetails(productId) {
const product = productManager.products.find(p => p.id === productId);
if (!product) return;
const modal = document.getElementById('product-modal');
const modalContent = document.getElementById('modal-content');
modalContent.innerHTML = `
<div class="modal-header">
<h2>${product.name}</h2>
<button onclick="closeModal()" class="close-btn">×</button>
</div>
<div class="modal-body">
<img src="${product.image}" alt="${product.name}" width="300">
<div class="product-details">
<p class="price">¥${product.price}</p>
<p class="category">分类:${product.category}</p>
<p class="description">${product.description}</p>
<button class="add-to-cart" data-id="${product.id}">加入购物车</button>
</div>
</div>
`;
modal.style.display = 'block';
// 绑定加入购物车事件
modalContent.querySelector('.add-to-cart').addEventListener('click', (e) => {
const productId = parseInt(e.target.dataset.id);
const product = productManager.products.find(p => p.id === productId);
if (product) {
cart.addItem(product);
alert(`${product.name} 已添加到购物车!`);
closeModal();
}
});
}
// 关闭模态框
function closeModal() {
document.getElementById('product-modal').style.display = 'none';
}
// 搜索功能
function searchProducts() {
const query = document.getElementById('search-input').value;
const filtered = productManager.searchProducts(query);
renderProducts(filtered);
}
// 筛选功能
function filterProducts() {
const category = document.getElementById('category-filter').value;
const filtered = productManager.filterByCategory(category);
renderProducts(filtered);
}
// 排序功能
function sortProducts() {
const sortBy = document.getElementById('sort-select').value;
const currentProducts = productManager.products; // 这里应该获取当前显示的产品
const sorted = productManager.sortProducts(currentProducts, sortBy);
renderProducts(sorted);
}
// 页面加载
document.addEventListener('DOMContentLoaded', () => {
renderProducts();
cart.updateCartUI();
// 绑定搜索事件
document.getElementById('search-input').addEventListener('input', searchProducts);
// 绑定筛选事件
document.getElementById('category-filter').addEventListener('change', filterProducts);
// 绑定排序事件
document.getElementById('sort-select').addEventListener('change', sortProducts);
// 点击模态框外部关闭
window.addEventListener('click', (e) => {
const modal = document.getElementById('product-modal');
if (e.target === modal) {
closeModal();
}
});
});
5.3 项目三:任务管理应用(Todo List)
项目目标:
- 构建一个功能完整的任务管理应用。
- 实现任务的增删改查。
- 支持任务分类和优先级。
- 数据持久化到localStorage。
技术栈:
- HTML5:页面结构。
- CSS3:样式设计,使用Flexbox布局。
- JavaScript:核心逻辑,数据管理。
- 本地存储:localStorage。
核心代码示例:
// 任务管理类
class TaskManager {
constructor() {
this.tasks = this.loadTasks();
this.categories = ['工作', '学习', '生活', '其他'];
this.priorities = ['高', '中', '低'];
}
loadTasks() {
const stored = localStorage.getItem('todo_tasks');
if (stored) {
return JSON.parse(stored);
}
// 示例任务
return [
{
id: 1,
title: "完成HTML5课程学习",
description: "学习HTML5基础语法和语义化标签",
category: "学习",
priority: "高",
completed: false,
createdAt: new Date().toISOString()
},
{
id: 2,
title: "编写CSS3样式",
description: "为个人博客设计响应式布局",
category: "工作",
priority: "中",
completed: false,
createdAt: new Date().toISOString()
}
];
}
saveTasks() {
localStorage.setItem('todo_tasks', JSON.stringify(this.tasks));
}
addTask(task) {
task.id = Date.now();
task.completed = false;
task.createdAt = new Date().toISOString();
this.tasks.push(task);
this.saveTasks();
}
updateTask(id, updates) {
const index = this.tasks.findIndex(task => task.id === id);
if (index !== -1) {
this.tasks[index] = { ...this.tasks[index], ...updates };
this.saveTasks();
}
}
deleteTask(id) {
this.tasks = this.tasks.filter(task => task.id !== id);
this.saveTasks();
}
toggleComplete(id) {
const task = this.tasks.find(task => task.id === id);
if (task) {
task.completed = !task.completed;
this.saveTasks();
}
}
getTasks(filter = {}) {
let filtered = [...this.tasks];
if (filter.category) {
filtered = filtered.filter(task => task.category === filter.category);
}
if (filter.priority) {
filtered = filtered.filter(task => task.priority === filter.priority);
}
if (filter.completed !== undefined) {
filtered = filtered.filter(task => task.completed === filter.completed);
}
return filtered;
}
getStats() {
const total = this.tasks.length;
const completed = this.tasks.filter(task => task.completed).length;
const pending = total - completed;
return {
total,
completed,
pending,
completionRate: total > 0 ? (completed / total * 100).toFixed(1) : 0
};
}
}
// UI管理类
class TaskUI {
constructor(taskManager) {
this.taskManager = taskManager;
this.currentFilter = {};
}
renderTasks() {
const tasks = this.taskManager.getTasks(this.currentFilter);
const container = document.getElementById('tasks-container');
container.innerHTML = '';
if (tasks.length === 0) {
container.innerHTML = '<p class="no-tasks">暂无任务</p>';
return;
}
tasks.forEach(task => {
const taskElement = document.createElement('div');
taskElement.className = `task-item ${task.completed ? 'completed' : ''} priority-${task.priority}`;
taskElement.innerHTML = `
<div class="task-header">
<input type="checkbox" ${task.completed ? 'checked' : ''}
onchange="taskUI.toggleComplete(${task.id})">
<h3 class="task-title">${task.title}</h3>
<span class="task-priority priority-${task.priority}">${task.priority}</span>
<span class="task-category">${task.category}</span>
</div>
<div class="task-body">
<p class="task-description">${task.description}</p>
<div class="task-actions">
<button onclick="taskUI.showEditForm(${task.id})">编辑</button>
<button onclick="taskUI.deleteTask(${task.id})">删除</button>
</div>
</div>
<div class="task-footer">
<small>创建时间:${new Date(task.createdAt).toLocaleString()}</small>
</div>
`;
container.appendChild(taskElement);
});
}
renderStats() {
const stats = this.taskManager.getStats();
const statsContainer = document.getElementById('stats-container');
statsContainer.innerHTML = `
<div class="stat-item">
<span class="stat-label">总任务数</span>
<span class="stat-value">${stats.total}</span>
</div>
<div class="stat-item">
<span class="stat-label">已完成</span>
<span class="stat-value completed">${stats.completed}</span>
</div>
<div class="stat-item">
<span class="stat-label">待完成</span>
<span class="stat-value pending">${stats.pending}</span>
</div>
<div class="stat-item">
<span class="stat-label">完成率</span>
<span class="stat-value">${stats.completionRate}%</span>
</div>
`;
}
renderCategories() {
const container = document.getElementById('category-filters');
container.innerHTML = '';
this.taskManager.categories.forEach(category => {
const btn = document.createElement('button');
btn.className = 'filter-btn';
btn.textContent = category;
btn.dataset.category = category;
btn.onclick = () => this.filterByCategory(category);
container.appendChild(btn);
});
// 添加"全部"按钮
const allBtn = document.createElement('button');
allBtn.className = 'filter-btn active';
allBtn.textContent = '全部';
allBtn.onclick = () => this.filterByCategory(null);
container.insertBefore(allBtn, container.firstChild);
}
renderPriorities() {
const container = document.getElementById('priority-filters');
container.innerHTML = '';
this.taskManager.priorities.forEach(priority => {
const btn = document.createElement('button');
btn.className = `filter-btn priority-${priority}`;
btn.textContent = priority;
btn.dataset.priority = priority;
btn.onclick = () => this.filterByPriority(priority);
container.appendChild(btn);
});
// 添加"全部"按钮
const allBtn = document.createElement('button');
allBtn.className = 'filter-btn active';
allBtn.textContent = '全部';
allBtn.onclick = () => this.filterByPriority(null);
container.insertBefore(allBtn, container.firstChild);
}
filterByCategory(category) {
if (category) {
this.currentFilter.category = category;
} else {
delete this.currentFilter.category;
}
// 更新按钮状态
document.querySelectorAll('#category-filters .filter-btn').forEach(btn => {
btn.classList.remove('active');
if ((category && btn.dataset.category === category) || (!category && btn.textContent === '全部')) {
btn.classList.add('active');
}
});
this.renderTasks();
}
filterByPriority(priority) {
if (priority) {
this.currentFilter.priority = priority;
} else {
delete this.currentFilter.priority;
}
// 更新按钮状态
document.querySelectorAll('#priority-filters .filter-btn').forEach(btn => {
btn.classList.remove('active');
if ((priority && btn.dataset.priority === priority) || (!priority && btn.textContent === '全部')) {
btn.classList.add('active');
}
});
this.renderTasks();
}
toggleComplete(id) {
this.taskManager.toggleComplete(id);
this.renderTasks();
this.renderStats();
}
deleteTask(id) {
if (confirm('确定要删除这个任务吗?')) {
this.taskManager.deleteTask(id);
this.renderTasks();
this.renderStats();
}
}
showAddForm() {
const form = document.getElementById('task-form');
const title = document.getElementById('task-title').value.trim();
const description = document.getElementById('task-description').value.trim();
const category = document.getElementById('task-category').value;
const priority = document.getElementById('task-priority').value;
if (!title) {
alert('请输入任务标题');
return;
}
const task = { title, description, category, priority };
this.taskManager.addTask(task);
// 清空表单
form.reset();
// 重新渲染
this.renderTasks();
this.renderStats();
alert('任务添加成功!');
}
showEditForm(id) {
const task = this.taskManager.tasks.find(t => t.id === id);
if (!task) return;
// 填充表单
document.getElementById('edit-task-id').value = id;
document.getElementById('edit-task-title').value = task.title;
document.getElementById('edit-task-description').value = task.description;
document.getElementById('edit-task-category').value = task.category;
document.getElementById('edit-task-priority').value = task.priority;
// 显示编辑表单
document.getElementById('edit-form-container').style.display = 'block';
}
saveEditedTask() {
const id = parseInt(document.getElementById('edit-task-id').value);
const title = document.getElementById('edit-task-title').value.trim();
const description = document.getElementById('edit-task-description').value.trim();
const category = document.getElementById('edit-task-category').value;
const priority = document.getElementById('edit-task-priority').value;
if (!title) {
alert('请输入任务标题');
return;
}
this.taskManager.updateTask(id, { title, description, category, priority });
// 隐藏编辑表单
document.getElementById('edit-form-container').style.display = 'none';
// 重新渲染
this.renderTasks();
this.renderStats();
alert('任务更新成功!');
}
cancelEdit() {
document.getElementById('edit-form-container').style.display = 'none';
}
filterByCompleted(status) {
if (status === 'all') {
delete this.currentFilter.completed;
} else {
this.currentFilter.completed = status === 'completed';
}
// 更新按钮状态
document.querySelectorAll('.completed-filter').forEach(btn => {
btn.classList.remove('active');
if (btn.dataset.status === status) {
btn.classList.add('active');
}
});
this.renderTasks();
}
}
// 初始化
const taskManager = new TaskManager();
const taskUI = new TaskUI(taskManager);
// 页面加载
document.addEventListener('DOMContentLoaded', () => {
taskUI.renderTasks();
taskUI.renderStats();
taskUI.renderCategories();
taskUI.renderPriorities();
// 绑定表单提交事件
document.getElementById('task-form').addEventListener('submit', (e) => {
e.preventDefault();
taskUI.showAddForm();
});
// 绑定编辑表单提交事件
document.getElementById('edit-form').addEventListener('submit', (e) => {
e.preventDefault();
taskUI.saveEditedTask();
});
// 绑定取消编辑事件
document.getElementById('cancel-edit').addEventListener('click', () => {
taskUI.cancelEdit();
});
// 绑定完成状态筛选
document.querySelectorAll('.completed-filter').forEach(btn => {
btn.addEventListener('click', () => {
const status = btn.dataset.status;
taskUI.filterByCompleted(status);
});
});
});
第六部分:就业竞争力提升
6.1 简历优化与作品集展示
简历要点:
- 技术栈清晰:明确列出掌握的HTML5、CSS3、JavaScript、框架等技能。
- 项目经验:详细描述参与的项目,包括技术栈、职责、成果。
- 量化成果:使用数字说明项目成果,如“页面加载速度提升30%”。
- 开源贡献:如有GitHub项目,展示代码质量和协作能力。
作品集建议:
- 个人网站:展示你的技能和项目。
- GitHub仓库:整理代码,编写清晰的README。
- 在线演示:使用Netlify、Vercel等平台部署项目。
6.2 面试准备
常见面试问题:
- HTML5新特性:语义化标签、Canvas、Web Storage、Web Workers等。
- CSS3布局:Flexbox、Grid、响应式设计。
- JavaScript基础:闭包、原型链、事件循环、异步编程。
- 框架相关:组件生命周期、状态管理、虚拟DOM原理。
- 性能优化:减少HTTP请求、懒加载、代码分割、缓存策略。
代码面试准备:
// 常见面试题示例:实现深拷贝
function deepClone(obj, hash = new WeakMap()) {
// 处理基本类型和null
if (obj === null || typeof obj !== 'object') {
return obj;
}
// 处理循环引用
if (hash.has(obj)) {
return hash.get(obj);
}
// 处理特殊对象
if (obj instanceof Date) {
return new Date(obj);
}
if (obj instanceof RegExp) {
return new RegExp(obj);
}
if (obj instanceof Map) {
const newMap = new Map();
hash.set(obj, newMap);
obj.forEach((value, key) => {
newMap.set(key, deepClone(value, hash));
});
return newMap;
}
if (obj instanceof Set) {
const newSet = new Set();
hash.set(obj, newSet);
obj.forEach(value => {
newSet.add(deepClone(value, hash));
});
return newSet;
}
// 处理数组和对象
const newObj = Array.isArray(obj) ? [] : {};
hash.set(obj, newObj);
for (const key in obj) {
if (obj.hasOwnProperty(key)) {
newObj[key] = deepClone(obj[key], hash);
}
}
return newObj;
}
// 测试
const original = {
a: 1,
b: { c: 2 },
d: [3, 4],
e: new Date(),
f: /regex/g,
g: new Map([['key', 'value']]),
h: new Set([1, 2, 3])
};
// 创建循环引用
original.self = original;
const cloned = deepClone(original);
console.log(cloned);
console.log(cloned.self === cloned); // true,正确处理循环引用
6.3 持续学习与社区参与
学习资源:
- 官方文档:MDN Web Docs、W3Schools。
- 在线课程:freeCodeCamp、Coursera、Udemy。
- 技术博客:CSS-Tricks、Smashing Magazine、前端之巅。
- 视频教程:YouTube频道如Traversy Media、The Net Ninja。
社区参与:
- GitHub:参与开源项目,贡献代码。
- Stack Overflow:回答问题,积累声望。
- 技术社区:掘金、SegmentFault、V2EX。
- 技术会议:参加前端大会、Meetup活动。
第七部分:总结与展望
7.1 学习路径总结
零基础到实战的完整路径:
- 基础阶段(1-2个月):HTML5、CSS3、JavaScript基础。
- 进阶阶段(1-2个月):DOM操作、事件处理、异步编程、ES6+特性。
- 框架阶段(1-2个月):选择一个主流框架(React/Vue/Angular)深入学习。
- 实战阶段(1-2个月):完成2-3个完整项目,部署上线。
- 优化阶段:性能优化、代码规范、测试、CI/CD。
7.2 未来发展趋势
前端技术趋势:
- WebAssembly:高性能Web应用,突破JavaScript性能瓶颈。
- PWA:渐进式Web应用,提供原生应用体验。
- 低代码/无代码平台:简化开发流程,提高效率。
- AI与前端结合:智能UI生成、代码自动补全、性能预测。
职业发展路径:
- 初级前端工程师:掌握基础技能,完成日常开发任务。
- 中级前端工程师:独立负责模块,优化性能,指导新人。
- 高级前端工程师:架构设计,技术选型,解决复杂问题。
- 前端专家/架构师:制定技术标准,推动技术创新。
- 技术经理/总监:团队管理,技术战略规划。
7.3 行动计划
立即行动:
- 制定学习计划:根据自身情况,制定3-6个月的学习时间表。
- 搭建开发环境:安装VS Code、Node.js、Git等工具。
- 开始第一个项目:从简单的个人主页开始,逐步增加复杂度。
- 加入学习社区:找到志同道合的学习伙伴,互相督促。
- 定期复盘:每周总结学习成果,调整学习策略。
长期目标:
- 6个月内完成3个实战项目。
- 1年内获得前端开发相关工作。
- 2年内成为中级前端工程师。
- 3-5年内成为技术专家或团队负责人。
结语
HTML5前端开发是一个充满挑战和机遇的领域。通过系统性的学习和持续的实践,零基础学员完全可以掌握核心技能,并在就业市场中脱颖而出。记住,编程是一门实践的艺术,只有通过不断的编码和项目实践,才能真正提升自己的能力。祝你在前端开发的学习道路上取得成功!
