HTML、CSS、JavaScript精通指南 | 从零基础到高级 | 包含响应式设计和现代框架
前端开发是指用户在浏览器中看到和交互的部分。它包括网页的结构(HTML)、样式(CSS)和交互(JavaScript)。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="页面描述">
<title>页面标题</title>
</head>
<body>
<!-- 语义化标签 -->
<header>页面头部</header>
<nav>导航菜单</nav>
<main>
<article>文章内容</article>
<aside>侧边栏</aside>
</main>
<footer>页面底部</footer>
</body>
</html><!-- 文本语义化 -->
<h1>主标题</h1>
<h2>副标题</h2>
<p>段落</p>
<strong>重要文本</strong>
<em>强调文本</em>
<mark>标记文本</mark>
<!-- 列表 -->
<ul>无序列表</ul>
<ol>有序列表</ol>
<dl>定义列表</dl>
<!-- 表格 -->
<table>
<thead>
<tr><th>表头</th></tr>
</thead>
<tbody>
<tr><td>数据</td></tr>
</tbody>
</table><form>
<fieldset>
<legend>用户信息</legend>
<label for="username">用户名</label>
<input type="text" id="username" name="username" required>
<label for="email">邮箱</label>
<input type="email" id="email" name="email" required>
<label for="password">密码</label>
<input type="password" id="password" name="password" required>
<label for="message">留言</label>
<textarea id="message" name="message" rows="5"></textarea>
<button type="submit">提交</button>
</fieldset>
</form>使用语义化标签、正确的表单结构和ARIA属性,可以创建更易访问的网页。
/* 基础选择器 */
* { } /* 通用选择器 */
p { } /* 元素选择器 */
.class { } /* 类选择器 */
#id { } /* ID选择器 */
/* 组合选择器 */
p.highlight { } /* 元素+类 */
div > p { } /* 子元素选择器 */
div p { } /* 后代选择器 */
p + span { } /* 相邻兄弟选择器 */
p ~ span { } /* 通用兄弟选择器 */
/* 属性选择器 */
input[type="text"] { }
a[href^="https"] { }
img[alt$=".png"] { }
/* 伪类 */
a:hover { }
li:first-child { }
li:nth-child(2n) { }
input:focus { }
/* 伪元素 */
p::before { }
p::after { }
p::first-line { }
p::selection { }/* 容器 */
.container {
display: flex;
justify-content: center; /* 水平对齐 */
align-items: center; /* 垂直对齐 */
gap: 20px; /* 间距 */
flex-wrap: wrap; /* 换行 */
}
/* 项目 */
.item {
flex: 1; /* 平均分配 */
flex-basis: 200px; /* 基础宽度 */
align-self: flex-start; /* 单个项目对齐 */
}/* 容器 */
.grid {
display: grid;
grid-template-columns: repeat(3, 1fr); /* 3列等宽 */
grid-template-rows: auto 200px auto; /* 行高 */
gap: 20px;
grid-auto-flow: dense; /* 自动填充 */
}
/* 项目 */
.item {
grid-column: span 2; /* 跨2列 */
grid-row: 1 / 3; /* 从第1行到第3行 */
}/* 移动优先 */
.container {
width: 100%;
padding: 10px;
}
/* 平板 */
@media (min-width: 768px) {
.container {
width: 750px;
padding: 20px;
}
}
/* 桌面 */
@media (min-width: 1024px) {
.container {
width: 960px;
padding: 30px;
}
}/* 过渡 */
.button {
background-color: blue;
transition: background-color 0.3s ease;
}
.button:hover {
background-color: red;
}
/* 动画 */
@keyframes slideIn {
from {
transform: translateX(-100%);
opacity: 0;
}
to {
transform: translateX(0);
opacity: 1;
}
}
.element {
animation: slideIn 0.5s ease-out forwards;
}使用CSS变量、BEM命名规范和模块化CSS,可以写出更易维护的样式代码。
// 箭头函数
const add = (a, b) => a + b;
// 模板字符串
const name = 'Alice';
console.log(`Hello, ${name}!`);
// 解构赋值
const { username, email } = user;
const [first, second, ...rest] = array;
// 默认参数
function greet(name = 'Guest') {
console.log(`Hello, ${name}`);
}
// 扩展运算符
const newArray = [...array, 4, 5];
const merged = { ...obj1, ...obj2 };
// Promise
const promise = new Promise((resolve, reject) => {
if (success) resolve(data);
else reject(error);
});
// async/await
async function fetchData() {
try {
const response = await fetch('/api/data');
const data = await response.json();
return data;
} catch (error) {
console.error(error);
}
}// 事件委托
document.addEventListener('click', (e) => {
if (e.target.matches('.button')) {
handleButtonClick(e.target);
}
});
// 观察者模式
const observer = new IntersectionObserver((entries) => {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.classList.add('visible');
}
});
});
document.querySelectorAll('.lazy-load').forEach(el => {
observer.observe(el);
});
// MutationObserver
const mutationObserver = new MutationObserver((mutations) => {
mutations.forEach(mutation => {
console.log('DOM changed:', mutation);
});
});
mutationObserver.observe(document.body, {
childList: true,
subtree: true,
attributes: true
});// module.js
export const add = (a, b) => a + b;
export default class Calculator { }
// main.js
import Calculator, { add } from './module.js';
const calc = new Calculator();
console.log(add(1, 2));使用现代ES6+语法、async/await处理异步、事件委托优化性能。
/* 基础样式(移动设备) */
body {
font-size: 14px;
width: 100%;
}
.container {
padding: 10px;
}
.grid {
display: grid;
grid-template-columns: 1fr; /* 单列 */
}
/* 平板 */
@media (min-width: 768px) {
body {
font-size: 16px;
}
.grid {
grid-template-columns: repeat(2, 1fr); /* 两列 */
}
}
/* 桌面 */
@media (min-width: 1024px) {
body {
font-size: 18px;
}
.grid {
grid-template-columns: repeat(3, 1fr); /* 三列 */
}
}<!-- srcset属性 -->
<img
src="image-small.jpg"
srcset="image-small.jpg 480w,
image-medium.jpg 768w,
image-large.jpg 1024w"
sizes="(max-width: 480px) 100vw,
(max-width: 768px) 80vw,
1024px"
alt="描述"
>
<!-- picture元素 -->
<picture>
<source media="(min-width: 1024px)" srcset="image-large.jpg">
<source media="(min-width: 768px)" srcset="image-medium.jpg">
<img src="image-small.jpg" alt="描述">
</picture><!-- 使用语义化标签 -->
<header>
<nav aria-label="主导航">
<ul>
<li><a href="/">首页</a></li>
<li><a href="/about">关于</a></li>
</ul>
</nav>
</header>
<!-- 使用alt文本 -->
<img src="logo.png" alt="公司Logo">
<!-- 关联标签和输入 -->
<label for="email">邮箱</label>
<input type="email" id="email" name="email">
<!-- 使用ARIA属性 -->
<button aria-label="关闭菜单" aria-expanded="false">×</button>
<!-- 跳过链接 -->
<a href="#main" class="skip-link">跳到主要内容</a>不仅帮助残障人士,也能改善所有用户的体验,提高SEO排名。
/* 1. 代码分割 */
import { lazy, Suspense } from 'react';
const HeavyComponent = lazy(() => import('./HeavyComponent'));
/* 2. 图片优化 */
<img
loading="lazy"
src="image.jpg"
alt="描述"
>
/* 3. 缓存策略 */
// 使用Service Worker缓存资源
self.addEventListener('install', event => {
event.waitUntil(
caches.open('v1').then(cache => {
return cache.addAll([
'/',
'/styles.css',
'/script.js'
]);
})
);
});
/* 4. 压缩和最小化 */
// 使用webpack、Parcel等打包工具
// 启用gzip压缩
/* 5. 减少HTTP请求 */
// 合并文件、使用CSS Sprites、内联小文件// package.json
{
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview",
"lint": "eslint src",
"format": "prettier --write src"
},
"devDependencies": {
"vite": "^4.0.0",
"eslint": "^8.0.0",
"prettier": "^3.0.0"
}
}# .github/workflows/deploy.yml
name: Deploy
on:
push:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
with:
node-version: '18'
- run: npm install
- run: npm run lint
- run: npm run build
- run: npm run test
- name: Deploy
run: npm run deploy| 框架 | 学习难度 | 性能 | 生态 | 适用场景 |
|---|---|---|---|---|
| React | 中等 | 优秀 | 最完善 | 大型应用 |
| Vue | 简单 | 优秀 | 完善 | 中小型应用 |
| Angular | 困难 | 优秀 | 完善 | 企业应用 |
| Svelte | 简单 | 最优 | 新兴 | 高性能应用 |
import React, { useState, useEffect } from 'react';
function Counter() {
const [count, setCount] = useState(0);
useEffect(() => {
document.title = `Count: ${count}`;
}, [count]);
return (
<div>
<p>Count: {count}</p>
<button onClick={() => setCount(count + 1)}>
Increment
</button>
</div>
);
}
export default Counter;<template>
<div>
<p>Count: {{ count }}</p>
<button @click="count++">Increment</button>
</div>
</template>
<script setup>
import { ref, watch } from 'vue';
const count = ref(0);
watch(count, (newCount) => {
document.title = `Count: ${newCount}`;
});
</script>project/
├── public/
│ ├── index.html
│ └── favicon.ico
├── src/
│ ├── components/
│ │ ├── Header.jsx
│ │ ├── Footer.jsx
│ │ └── Card.jsx
│ ├── pages/
│ │ ├── Home.jsx
│ │ ├── About.jsx
│ │ └── NotFound.jsx
│ ├── services/
│ │ ├── api.js
│ │ └── auth.js
│ ├── styles/
│ │ ├── global.css
│ │ └── variables.css
│ ├── App.jsx
│ └── main.jsx
├── package.json
├── vite.config.js
└── README.md// services/api.js
const API_BASE = 'https://api.example.com';
export async function fetchData(endpoint) {
try {
const response = await fetch(`${API_BASE}${endpoint}`, {
headers: {
'Authorization': `Bearer ${localStorage.getItem('token')}`
}
});
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return await response.json();
} catch (error) {
console.error('Fetch error:', error);
throw error;
}
}
// components/DataList.jsx
import { useState, useEffect } from 'react';
import { fetchData } from '../services/api';
export default function DataList() {
const [data, setData] = useState([]);
const [loading, setLoading] = useState(true);
const [error, setError] = useState(null);
useEffect(() => {
fetchData('/items')
.then(setData)
.catch(setError)
.finally(() => setLoading(false));
}, []);
if (loading) return <div>Loading...</div>;
if (error) return <div>Error: {error.message}</div>;
return (
<ul>
{data.map(item => (
<li key={item.id}>{item.name}</li>
))}
</ul>
);
}通过这个项目,你学会了如何构建一个完整的、生产级别的前端应用。
现在你已经掌握了现代前端开发的所有核心技能。
前端开发的关键是实践。建议你创建多个项目,不断挑战自己。