HTML/CSS
目录
HTML5
基础结构
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>页面标题</title>
<link rel="stylesheet" href="styles.css">
<script src="script.js" defer></script>
</head>
<body>
<!-- 页面内容 -->
</body>
</html>说明:
<!DOCTYPE html>声明文档类型lang="zh-CN"指定语言为中文meta charset="UTF-8"设置字符编码viewport设置移动端视口defer属性使脚本在页面加载后执行
语义化标签
html
<!-- 文档结构 -->
<header>
<h1>网站标题</h1>
<nav>
<ul>
<li><a href="#home">首页</a></li>
<li><a href="#about">关于</a></li>
<li><a href="#contact">联系我们</a></li>
</ul>
</nav>
</header>
<main>
<article>
<h2>文章标题</h2>
<p>文章内容...</p>
<section>
<h3>章节标题</h3>
<p>章节内容...</p>
</section>
</article>
<aside>
<h3>侧边栏</h3>
<ul>
<li>相关链接1</li>
<li>相关链接2</li>
</ul>
</aside>
</main>
<footer>
<p>版权信息</p>
<address>联系方式</address>
</footer>说明:
header通常包含网站标题和导航nav用于导航菜单main包含页面的主要内容article表示独立的内容块section表示文档中的章节aside用于侧边栏内容footer包含页脚信息
表单元素
html
<form action="/submit" method="post">
<!-- 文本输入 -->
<div class="form-group">
<label for="username">用户名:</label>
<input type="text" id="username" name="username" required>
</div>
<!-- 密码输入 -->
<div class="form-group">
<label for="password">密码:</label>
<input type="password" id="password" name="password" required>
</div>
<!-- 单选按钮 -->
<div class="form-group">
<label>性别:</label>
<input type="radio" id="male" name="gender" value="male">
<label for="male">男</label>
<input type="radio" id="female" name="gender" value="female">
<label for="female">女</label>
</div>
<!-- 复选框 -->
<div class="form-group">
<label>兴趣爱好:</label>
<input type="checkbox" id="reading" name="hobby" value="reading">
<label for="reading">阅读</label>
<input type="checkbox" id="sports" name="hobby" value="sports">
<label for="sports">运动</label>
</div>
<!-- 下拉选择 -->
<div class="form-group">
<label for="city">城市:</label>
<select id="city" name="city">
<option value="">请选择</option>
<optgroup label="一线城市">
<option value="beijing">北京</option>
<option value="shanghai">上海</option>
</optgroup>
<optgroup label="二线城市">
<option value="hangzhou">杭州</option>
<option value="chengdu">成都</option>
</optgroup>
</select>
</div>
<!-- 文件上传 -->
<div class="form-group">
<label for="avatar">头像:</label>
<input type="file" id="avatar" name="avatar" accept="image/*">
</div>
<!-- 提交按钮 -->
<button type="submit">提交</button>
<button type="reset">重置</button>
</form>说明:
label标签关联表单控件required属性表示必填accept属性限制文件类型optgroup对选项进行分组
多媒体元素
html
<!-- 图片 -->
<figure>
<img src="image.jpg" alt="图片描述" width="300" height="200" loading="lazy">
<figcaption>图片说明</figcaption>
</figure>
<!-- 视频 -->
<video controls width="400" height="300" poster="poster.jpg">
<source src="video.mp4" type="video/mp4">
<source src="video.webm" type="video/webm">
<track src="subtitles_zh.vtt" kind="subtitles" srclang="zh" label="中文">
<track src="subtitles_en.vtt" kind="subtitles" srclang="en" label="English">
您的浏览器不支持视频播放
</video>
<!-- 音频 -->
<audio controls>
<source src="audio.mp3" type="audio/mpeg">
<source src="audio.ogg" type="audio/ogg">
您的浏览器不支持音频播放
</audio>
<!-- 画布 -->
<canvas id="myCanvas" width="200" height="200"></canvas>
<script>
const canvas = document.getElementById('myCanvas');
const ctx = canvas.getContext('2d');
ctx.fillStyle = 'red';
ctx.fillRect(50, 50, 100, 100);
</script>
<!-- SVG -->
<svg width="100" height="100" viewBox="0 0 100 100">
<circle cx="50" cy="50" r="40" stroke="black" fill="red" />
<text x="50" y="50" text-anchor="middle" fill="white">SVG</text>
</svg>说明:
figure和figcaption用于图片说明loading="lazy"实现图片懒加载poster属性设置视频封面track元素添加字幕- Canvas 需要 JavaScript 绘制
- SVG 是矢量图形,可缩放
表格
html
<table>
<caption>学生成绩表</caption>
<thead>
<tr>
<th>姓名</th>
<th>语文</th>
<th>数学</th>
<th>英语</th>
<th>总分</th>
</tr>
</thead>
<tbody>
<tr>
<td>张三</td>
<td>90</td>
<td>85</td>
<td>88</td>
<td>263</td>
</tr>
<tr>
<td>李四</td>
<td>85</td>
<td>92</td>
<td>90</td>
<td>267</td>
</tr>
</tbody>
<tfoot>
<tr>
<td>平均分</td>
<td>87.5</td>
<td>88.5</td>
<td>89</td>
<td>265</td>
</tr>
</tfoot>
</table>说明:
caption定义表格标题thead定义表头tbody定义表格主体tfoot定义表格页脚
CSS
选择器
css
/* 基本选择器 */
* { margin: 0; padding: 0; } /* 重置样式 */
h1 { color: blue; } /* 元素选择器 */
.highlight { background: yellow; } /* 类选择器 */
#header { height: 60px; } /* ID选择器 */
[type="text"] { border: 1px solid #ccc; } /* 属性选择器 */
/* 组合选择器 */
h1, h2, h3 { font-family: Arial; } /* 群组选择器 */
nav a { color: white; } /* 后代选择器 */
ul > li { list-style: none; } /* 子元素选择器 */
h2 + p { margin-top: 10px; } /* 相邻兄弟选择器 */
h2 ~ p { color: gray; } /* 通用兄弟选择器 */
/* 伪类选择器 */
a:hover { color: red; } /* 鼠标悬停 */
input:focus { border-color: blue; } /* 获得焦点 */
li:first-child { font-weight: bold; } /* 第一个子元素 */
li:last-child { border-bottom: none; } /* 最后一个子元素 */
li:nth-child(odd) { background: #f0f0f0; } /* 奇数子元素 */说明:
- 选择器优先级:ID > 类 > 元素
- 组合选择器可以更精确地选择元素
- 伪类选择器用于特定状态
盒模型
css
.box {
/* 尺寸 */
width: 200px;
height: 200px;
min-width: 100px;
max-width: 300px;
/* 内边距 */
padding: 20px;
padding-top: 10px;
padding-right: 15px;
padding-bottom: 10px;
padding-left: 15px;
/* 边框 */
border: 1px solid #000;
border-width: 1px;
border-style: solid;
border-color: #000;
border-radius: 5px;
/* 外边距 */
margin: 20px;
margin-top: 10px;
margin-right: 15px;
margin-bottom: 10px;
margin-left: 15px;
/* 盒模型类型 */
box-sizing: border-box; /* 标准盒模型 */
/* 溢出处理 */
overflow: hidden;
}说明:
box-sizing: border-box使 padding 和 border 包含在 width 中overflow: hidden隐藏溢出内容- 可以使用简写形式:
padding: 10px 15px;
Flexbox 布局
css
.container {
display: flex;
flex-direction: row;
flex-wrap: wrap;
justify-content: space-between;
align-items: center;
gap: 20px;
}
.item {
flex: 1;
min-width: 200px;
}
/* 响应式布局 */
@media (max-width: 768px) {
.container {
flex-direction: column;
}
}说明:
flex: 1使元素平均分配空间gap设置元素间距- 可以轻松实现响应式布局
Grid 布局
css
.container {
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: auto;
gap: 20px;
grid-template-areas:
"header header header"
"main main sidebar"
"footer footer footer";
}
.header { grid-area: header; }
.main { grid-area: main; }
.sidebar { grid-area: sidebar; }
.footer { grid-area: footer; }
/* 响应式布局 */
@media (max-width: 768px) {
.container {
grid-template-columns: 1fr;
grid-template-areas:
"header"
"main"
"sidebar"
"footer";
}
}说明:
grid-template-areas定义布局区域grid-area指定元素位置- 可以轻松实现复杂布局
响应式设计
css
/* 移动优先 */
.container {
width: 100%;
padding: 10px;
}
/* 平板 */
@media (min-width: 768px) {
.container {
max-width: 720px;
margin: 0 auto;
padding: 20px;
}
}
/* 桌面 */
@media (min-width: 1024px) {
.container {
max-width: 960px;
}
}
/* 大屏幕 */
@media (min-width: 1280px) {
.container {
max-width: 1200px;
}
}说明:
- 使用相对单位(%, em, rem)
- 设置合适的断点
- 考虑不同设备的特性
动画
css
/* 过渡 */
.button {
background: blue;
color: white;
padding: 10px 20px;
border: none;
border-radius: 5px;
transition: all 0.3s ease;
}
.button:hover {
background: darkblue;
transform: scale(1.1);
}
/* 动画 */
@keyframes slide {
0% {
transform: translateX(-100%);
opacity: 0;
}
100% {
transform: translateX(0);
opacity: 1;
}
}
.slide-in {
animation: slide 0.5s ease forwards;
}说明:
- 过渡用于简单状态变化
- 动画用于复杂效果
- 使用
forwards保持最终状态
变换
css
.card {
transform: rotate(0deg);
transition: transform 0.3s ease;
}
.card:hover {
transform: rotate(5deg) scale(1.05);
}
/* 3D 效果 */
.cube {
transform-style: preserve-3d;
perspective: 1000px;
}
.cube:hover {
transform: rotateY(180deg);
}说明:
- 可以组合多个变换
- 3D 变换需要设置
perspective - 使用
transform-style: preserve-3d保持 3D 效果
滤镜
css
.image {
filter: grayscale(100%);
transition: filter 0.3s ease;
}
.image:hover {
filter: grayscale(0%);
}
/* 组合滤镜 */
.overlay {
filter: brightness(150%) contrast(120%);
}说明:
- 可以组合多个滤镜
- 常用于图片效果
- 可以创建叠加效果
渐变
css
.gradient {
background: linear-gradient(45deg, #ff6b6b, #4ecdc4);
}
.radial {
background: radial-gradient(circle at center, #ff6b6b, #4ecdc4);
}
/* 多色渐变 */
.rainbow {
background: linear-gradient(
to right,
red,
orange,
yellow,
green,
blue,
indigo,
violet
);
}说明:
- 可以创建平滑的颜色过渡
- 支持多个颜色点
- 可以设置渐变方向
最佳实践
1. 语义化
- 使用合适的 HTML 标签
- 添加适当的 ARIA 属性
- 保持结构清晰
- 使用有意义的类名
- 避免过度使用 div
2. 性能优化
- 减少 DOM 嵌套
- 使用 CSS 选择器优化
- 避免使用通配符选择器
- 使用 CSS 变量
- 压缩和合并文件
- 使用 CDN
- 延迟加载非关键资源
3. 可维护性
- 使用 BEM 命名规范
- 模块化 CSS
- 添加适当的注释
- 保持代码风格一致
- 使用 CSS 预处理器
- 使用 CSS 后处理器
4. 浏览器兼容性
- 使用 Autoprefixer
- 添加浏览器前缀
- 使用 Modernizr 检测特性
- 提供降级方案
- 使用 CSS 重置
- 测试不同浏览器
5. 可访问性
- 使用语义化标签
- 添加适当的 ARIA 属性
- 确保键盘可访问
- 提供替代文本
- 使用合适的颜色对比度
- 支持屏幕阅读器
学习资源
在线教程
视频课程
- 慕课网
- 极客时间
- B站技术区
- YouTube 技术频道
- Udemy
- Coursera