摘要:
在2025年的Web开发中,HTML已经远远超越了简单的标记语言范畴。从语义化标签到Web Components,从多媒体嵌入到性能优化,现代HTML为开发者提供了强大的工具集。本文将为您呈现一份完整的HTML代码参考大全,涵盖从基础语法到高级特性的所有内容,每个示例都经过精心设计并可直接使用。
一、 HTML基础结构与元数据
1.1 标准HTML5文档结构
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<!-- 字符编码 -->
<meta charset="UTF-8">
<!-- 视口设置,响应式设计必备 -->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<!-- 页面标题 -->
<title>我的网站 - 专业Web解决方案</title>
<!-- 页面描述,SEO重要 -->
<meta name="description" content="提供专业的Web开发和设计服务">
<!-- 关键词 -->
<meta name="keywords" content="Web开发, 前端, HTML, CSS, JavaScript">
<!-- 作者信息 -->
<meta name="author" content="你的名字">
<!-- 开启主题色 -->
<meta name="theme-color" content="#667eea">
<!-- 禁止电话号自动识别(移动端) -->
<meta name="format-detection" content="telephone=no">
<!-- 禁止邮箱自动识别 -->
<meta name="format-detection" content="email=no">
<!-- 禁止地址自动识别 -->
<meta name="format-detection" content="address=no">
<!-- 优先使用最新IE版本 -->
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<!-- 禁止百度转码 -->
<meta http-equiv="Cache-Control" content="no-siteapp">
<!-- 引入CSS文件 -->
<link rel="stylesheet" href="styles.css">
<!-- 网站图标 -->
<link rel="icon" href="favicon.ico" type="image/x-icon">
<link rel="apple-touch-icon" href="apple-touch-icon.png">
<!-- 预加载关键资源 -->
<link rel="preload" href="critical.css" as="style">
<link rel="preload" href="hero-image.jpg" as="image">
<!-- DNS预连接 -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<!-- 引入Google字体 -->
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700&display=swap" rel="stylesheet">
</head>
<body>
<!-- 页面内容从这里开始 -->
<header>
<nav>
<!-- 导航内容 -->
</nav>
</header>
<main>
<!-- 主要内容 -->
</main>
<footer>
<!-- 页脚内容 -->
</footer>
<!-- 引入JavaScript文件 -->
<script src="script.js" defer></script>
</body>
</html>
1.2 语义化头部优化
<!-- 开放图谱协议(社交媒体分享) -->
<meta property="og:title" content="页面标题">
<meta property="og:description" content="页面描述">
<meta property="og:image" content="https://example.com/image.jpg">
<meta property="og:url" content="https://example.com">
<meta property="og:type" content="website">
<meta property="og:site_name" content="网站名称">
<!-- Twitter卡片 -->
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="页面标题">
<meta name="twitter:description" content="页面描述">
<meta name="twitter:image" content="https://example.com/image.jpg">
<meta name="twitter:site" content="@username">
<!-- 结构化数据(JSON-LD格式) -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "文章标题",
"description": "文章描述",
"image": "https://example.com/image.jpg",
"author": {
"@type": "Person",
"name": "作者姓名"
},
"publisher": {
"@type": "Organization",
"name": "发布者名称",
"logo": {
"@type": "ImageObject",
"url": "https://example.com/logo.jpg"
}
},
"datePublished": "2024-01-01",
"dateModified": "2024-01-02"
}
</script>
二、 语义化布局标签
2.1 现代页面布局结构
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>语义化布局示例</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Inter', sans-serif;
line-height: 1.6;
color: #333;
}
header, nav, main, aside, footer, section, article {
padding: 20px;
margin: 10px 0;
}
header { background: #2c3e50; color: white; }
nav { background: #34495e; color: white; }
main { background: #ecf0f1; min-height: 400px; }
aside { background: #bdc3c7; }
footer { background: #2c3e50; color: white; text-align: center; }
section { background: white; margin: 20px 0; border-radius: 8px; }
article { background: #f8f9fa; margin: 15px 0; padding: 15px; border-left: 4px solid #3498db; }
</style>
</head>
<body>
<!-- 页面头部 -->
<header role="banner">
<h1>网站标题</h1>
<p>网站描述或标语</p>
</header>
<!-- 导航区域 -->
<nav role="navigation" aria-label="主导航">
<ul>
<li><a href="#home">首页</a></li>
<li><a href="#about">关于我们</a></li>
<li><a href="#services">服务</a></li>
<li><a href="#contact">联系我们</a></li>
</ul>
</nav>
<!-- 主要内容区域 -->
<main role="main">
<!-- 横幅区域 -->
<section aria-labelledby="banner-heading">
<h2 id="banner-heading">欢迎来到我们的网站</h2>
<p>这是一个使用语义化HTML标签构建的现代化网页布局。</p>
</section>
<!-- 特性展示 -->
<section aria-labelledby="features-heading">
<h2 id="features-heading">我们的特性</h2>
<article>
<h3>响应式设计</h3>
<p>确保网站在所有设备上都能完美显示。</p>
<time datetime="2024-01-01">发布于 2024年1月1日</time>
</article>
<article>
<h3>高性能</h3>
<p>优化的代码确保快速加载速度。</p>
<time datetime="2024-01-02">发布于 2024年1月2日</time>
</article>
<article>
<h3>无障碍访问</h3>
<p>遵循WCAG指南,确保所有人都能访问。</p>
<time datetime="2024-01-03">发布于 2024年1月3日</time>
</article>
</section>
<!-- 侧边内容 -->
<aside role="complementary" aria-labelledby="sidebar-heading">
<h3 id="sidebar-heading">相关链接</h3>
<nav aria-label="侧边栏导航">
<ul>
<li><a href="#blog">博客</a></li>
<li><a href="#portfolio">作品集</a></li>
<li><a href="#testimonials">客户评价</a></li>
</ul>
</nav>
</aside>
</main>
<!-- 页脚 -->
<footer role="contentinfo">
<p>© 2024 我的网站. 保留所有权利.</p>
<address>
联系我们: <a href="mailto:info@example.com">info@example.com</a>
</address>
</footer>
</body>
</html>
2.2 高级布局模式
<!-- 圣杯布局 -->
<div class="holy-grail">
<header>头部</header>
<div class="container">
<main>主要内容</main>
<nav class="left-sidebar">左侧边栏</nav>
<aside class="right-sidebar">右侧边栏</aside>
</div>
<footer>页脚</footer>
</div>
<style>
.holy-grail {
display: flex;
flex-direction: column;
min-height: 100vh;
}
.holy-grail .container {
display: flex;
flex: 1;
}
.holy-grail main {
flex: 1;
order: 2;
}
.holy-grail .left-sidebar {
width: 200px;
order: 1;
}
.holy-grail .right-sidebar {
width: 200px;
order: 3;
}
@media (max-width: 768px) {
.holy-grail .container {
flex-direction: column;
}
.holy-grail .left-sidebar,
.holy-grail .right-sidebar {
width: 100%;
order: 3;
}
}
</style>
三、 表单与用户输入
3.1 现代化表单设计
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>现代化表单示例</title>
<style>
:root {
--primary-color: #667eea;
--error-color: #e74c3c;
--success-color: #2ecc71;
--border-radius: 8px;
}
.form-container {
max-width: 600px;
margin: 50px auto;
padding: 30px;
background: white;
border-radius: 15px;
box-shadow: 0 15px 35px rgba(0,0,0,0.1);
}
.form-group {
margin-bottom: 25px;
position: relative;
}
.form-label {
display: block;
margin-bottom: 8px;
font-weight: 600;
color: #2d3748;
}
.form-input {
width: 100%;
padding: 12px 15px;
border: 2px solid #e2e8f0;
border-radius: var(--border-radius);
font-size: 16px;
transition: all 0.3s ease;
background: #f8f9fa;
}
.form-input:focus {
outline: none;
border-color: var(--primary-color);
background: white;
box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1);
}
.form-input:invalid {
border-color: var(--error-color);
}
.form-input:valid {
border-color: var(--success-color);
}
.error-message {
color: var(--error-color);
font-size: 14px;
margin-top: 5px;
display: none;
}
.form-input:invalid + .error-message {
display: block;
}
.submit-btn {
background: var(--primary-color);
color: white;
border: none;
padding: 15px 30px;
border-radius: var(--border-radius);
font-size: 16px;
cursor: pointer;
transition: all 0.3s ease;
width: 100%;
}
.submit-btn:hover {
background: #5a6fd8;
transform: translateY(-2px);
box-shadow: 0 10px 25px rgba(102, 126, 234, 0.3);
}
.required::after {
content: " *";
color: var(--error-color);
}
</style>
</head>
<body>
<div class="form-container">
<h1>用户注册</h1>
<form id="registrationForm" novalidate>
<!-- 文本输入 -->
<div class="form-group">
<label for="username" class="form-label required">用户名</label>
<input type="text" id="username" name="username" class="form-input"
required minlength="3" maxlength="20"
pattern="[a-zA-Z0-9_]+"
placeholder="请输入用户名(3-20个字符)">
<div class="error-message">用户名必须是3-20个字母、数字或下划线</div>
</div>
<!-- 邮箱输入 -->
<div class="form-group">
<label for="email" class="form-label required">电子邮箱</label>
<input type="email" id="email" name="email" class="form-input"
required placeholder="请输入有效的电子邮箱">
<div class="error-message">请输入有效的电子邮箱地址</div>
</div>
<!-- 密码输入 -->
<div class="form-group">
<label for="password" class="form-label required">密码</label>
<input type="password" id="password" name="password" class="form-input"
required minlength="8"
pattern="^(?=.*[a-z])(?=.*[A-Z])(?=.*\d).{8,}$"
placeholder="至少8位,包含大小写字母和数字">
<div class="error-message">密码必须包含大小写字母和数字,至少8位</div>
</div>
<!-- 电话号码 -->
<div class="form-group">
<label for="phone" class="form-label">手机号码</label>
<input type="tel" id="phone" name="phone" class="form-input"
pattern="[0-9]{11}" placeholder="请输入11位手机号码">
<div class="error-message">请输入有效的11位手机号码</div>
</div>
<!-- 日期选择 -->
<div class="form-group">
<label for="birthdate" class="form-label">出生日期</label>
<input type="date" id="birthdate" name="birthdate" class="form-input"
min="1900-01-01" max="2024-12-31">
</div>
<!-- 范围选择 -->
<div class="form-group">
<label for="volume" class="form-label">音量大小</label>
<input type="range" id="volume" name="volume" class="form-input"
min="0" max="100" value="50" step="10">
<output for="volume">50</output>
</div>
<!-- 颜色选择 -->
<div class="form-group">
<label for="color" class="form-label">主题颜色</label>
<input type="color" id="color" name="color" class="form-input" value="#667eea">
</div>
<!-- 文件上传 -->
<div class="form-group">
<label for="avatar" class="form-label">头像上传</label>
<input type="file" id="avatar" name="avatar" class="form-input"
accept="image/jpeg, image/png, image/gif"
multiple>
</div>
<!-- 下拉选择 -->
<div class="form-group">
<label for="country" class="form-label">国家/地区</label>
<select id="country" name="country" class="form-input" required>
<option value="">请选择国家/地区</option>
<option value="CN">中国</option>
<option value="US">美国</option>
<option value="JP">日本</option>
<option value="KR">韩国</option>
</select>
</div>
<!-- 多选下拉 -->
<div class="form-group">
<label for="skills" class="form-label">技能选择</label>
<select id="skills" name="skills" class="form-input" multiple size="4">
<option value="html">HTML</option>
<option value="css">CSS</option>
<option value="js">JavaScript</option>
<option value="react">React</option>
<option value="vue">Vue</option>
<option value="angular">Angular</option>
</select>
</div>
<!-- 文本域 -->
<div class="form-group">
<label for="bio" class="form-label">个人简介</label>
<textarea id="bio" name="bio" class="form-input"
rows="4" placeholder="介绍一下你自己..."
maxlength="500"></textarea>
<div class="char-count">0/500</div>
</div>
<!-- 复选框组 -->
<fieldset class="form-group">
<legend class="form-label">兴趣爱好</legend>
<label>
<input type="checkbox" name="interests" value="reading"> 阅读
</label>
<label>
<input type="checkbox" name="interests" value="sports"> 运动
</label>
<label>
<input type="checkbox" name="interests" value="music"> 音乐
</label>
<label>
<input type="checkbox" name="interests" value="travel"> 旅行
</label>
</fieldset>
<!-- 单选框组 -->
<fieldset class="form-group">
<legend class="form-label required">性别</legend>
<label>
<input type="radio" name="gender" value="male" required> 男性
</label>
<label>
<input type="radio" name="gender" value="female"> 女性
</label>
<label>
<input type="radio" name="gender" value="other"> 其他
</label>
</fieldset>
<!-- 数据列表 -->
<div class="form-group">
<label for="browser" class="form-label">选择浏览器</label>
<input list="browsers" id="browser" name="browser" class="form-input"
placeholder="输入或选择浏览器">
<datalist id="browsers">
<option value="Chrome">
<option value="Firefox">
<option value="Safari">
<option value="Edge">
<option value="Opera">
</datalist>
</div>
<button type="submit" class="submit-btn">注册账号</button>
</form>
</div>
<script>
// 实时字符计数
document.getElementById('bio').addEventListener('input', function(e) {
const count = e.target.value.length;
document.querySelector('.char-count').textContent = `${count}/500`;
});
// 范围滑块实时显示
document.getElementById('volume').addEventListener('input', function(e) {
e.target.nextElementSibling.textContent = e.target.value;
});
// 表单验证
document.getElementById('registrationForm').addEventListener('submit', function(e) {
e.preventDefault();
if (this.checkValidity()) {
alert('表单提交成功!');
// 这里可以添加AJAX提交逻辑
}
});
</script>
</body>
</html>
四、 多媒体与图形
4.1 响应式图片与视频
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>多媒体展示</title>
<style>
.media-container {
max-width: 1200px;
margin: 0 auto;
padding: 20px;
}
.responsive-image {
width: 100%;
height: auto;
border-radius: 10px;
box-shadow: 0 10px 30px rgba(0,0,0,0.1);
}
.video-container {
position: relative;
width: 100%;
padding-bottom: 56.25%; /* 16:9 宽高比 */
margin: 20px 0;
}
.video-container video,
.video-container iframe {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
border-radius: 10px;
}
.gallery {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 15px;
margin: 30px 0;
}
.gallery img {
width: 100%;
height: 200px;
object-fit: cover;
border-radius: 8px;
transition: transform 0.3s ease;
cursor: pointer;
}
.gallery img:hover {
transform: scale(1.05);
}
figure {
margin: 20px 0;
text-align: center;
}
figcaption {
margin-top: 10px;
color: #666;
font-style: italic;
}
</style>
</head>
<body>
<div class="media-container">
<!-- 响应式图片 -->
<h2>响应式图片展示</h2>
<!-- 使用picture元素实现艺术指导 -->
<picture>
<source media="(min-width: 1200px)" srcset="https://picsum.photos/1200/600">
<source media="(min-width: 768px)" srcset="https://picsum.photos/800/400">
<img src="https://picsum.photos/400/300" alt="描述性文字" class="responsive-image"
loading="lazy" decoding="async">
</picture>
<!-- 带标题的图片 -->
<figure>
<img src="https://picsum.photos/800/400" alt="风景图片" class="responsive-image"
loading="lazy">
<figcaption>美丽的自然风景 - 使用HTML5 figure和figcaption标签</figcaption>
</figure>
<!-- 视频播放 -->
<h2>视频播放器</h2>
<div class="video-container">
<video controls poster="https://picsum.photos/800/450" preload="metadata">
<source src="https://example.com/video.mp4" type="video/mp4">
<source src="https://example.com/video.webm" type="video/webm">
<track src="subtitles-zh.vtt" kind="subtitles" srclang="zh" label="中文">
您的浏览器不支持HTML5视频播放。
</video>
</div>
<!-- 嵌入YouTube视频 -->
<div class="video-container">
<iframe src="https://www.youtube.com/embed/dQw4w9WgXcQ"
frameborder="0"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture"
allowfullscreen
loading="lazy">
</iframe>
</div>
<!-- 音频播放 -->
<h2>音频播放器</h2>
<audio controls style="width: 100%; margin: 20px 0;">
<source src="audio.mp3" type="audio/mpeg">
<source src="audio.ogg" type="audio/ogg">
您的浏览器不支持HTML5音频播放。
</audio>
<!-- 图片画廊 -->
<h2>图片画廊</h2>
<div class="gallery">
<img src="https://picsum.photos/300/200?1" alt="图片1" loading="lazy">
<img src="https://picsum.photos/300/200?2" alt="图片2" loading="lazy">
<img src="https://picsum.photos/300/200?3" alt="图片3" loading="lazy">
<img src="https://picsum.photos/300/200?4" alt="图片4" loading="lazy">
<img src="https://picsum.photos/300/200?5" alt="图片5" loading="lazy">
<img src="https://picsum.photos/300/200?6" alt="图片6" loading="lazy">
</div>
</div>
</body>
</html>
4.2 SVG图形与动画
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>SVG图形示例</title>
<style>
.svg-container {
max-width: 800px;
margin: 50px auto;
padding: 20px;
text-align: center;
}
.svg-item {
width: 200px;
height: 200px;
margin: 20px;
display: inline-block;
}
.animated-svg {
animation: rotate 10s linear infinite;
}
@keyframes rotate {
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
}
.pulse {
animation: pulse 2s ease-in-out infinite alternate;
}
@keyframes pulse {
from { transform: scale(1); }
to { transform: scale(1.1); }
}
</style>
</head>
<body>
<div class="svg-container">
<h1>SVG图形示例</h1>
<!-- 基本形状 -->
<div class="svg-item">
<svg viewBox="0 0 100 100">
<circle cx="50" cy="50" r="40" fill="#667eea" stroke="#764ba2" stroke-width="3"/>
</svg>
<p>圆形</p>
</div>
<div class="svg-item">
<svg viewBox="0 0 100 100">
<rect x="10" y="10" width="80" height="80" fill="#f093fb" rx="10"/>
</svg>
<p>圆角矩形</p>
</div>
<!-- 动画SVG -->
<div class="svg-item">
<svg viewBox="0 0 100 100" class="animated-svg">
<polygon points="50,10 90,90 10,90" fill="#4facfe"/>
</svg>
<p>旋转三角形</p>
</div>
<!-- 交互式SVG -->
<div class="svg-item">
<svg viewBox="0 0 100 100">
<circle cx="50" cy="50" r="40" fill="#43e97b" class="pulse"/>
<text x="50" y="55" text-anchor="middle" fill="white" font-size="12">点击我</text>
</svg>
<p>脉动效果</p>
</div>
<!-- 复杂SVG图标 -->
<div class="svg-item">
<svg viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<path d="M12 2L2 7l10 5 10-5-10-5zM2 17l10 5 10-5M2 12l10 5 10-5"/>
</svg>
<p>图层图标</p>
</div>
<!-- SVG线条动画 -->
<div class="svg-item">
<svg viewBox="0 0 100 100">
<path d="M10,50 Q50,10 90,50 T170,50" stroke="#ff6b6b" stroke-width="3"
fill="none" stroke-dasharray="200" stroke-dashoffset="200">
<animate attributeName="stroke-dashoffset" from="200" to="0"
dur="2s" fill="freeze" repeatCount="indefinite"/>
</path>
</svg>
<p>线条动画</p>
</div>
</div>
</body>
</html>
五、 高级HTML特性
5.1 Web Components
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Web Components示例</title>
<style>
body {
font-family: 'Inter', sans-serif;
padding: 40px;
background: #f5f5f5;
}
.container {
max-width: 800px;
margin: 0 auto;
}
</style>
</head>
<body>
<div class="container">
<h1>Web Components 示例</h1>
<!-- 自定义用户卡片 -->
<user-card
name="张三"
avatar="https://i.pravatar.cc/150?img=1"
email="zhangsan@example.com"
role="前端开发者">
</user-card>
<user-card
name="李四"
avatar="https://i.pravatar.cc/150?img=2"
email="lisi@example.com"
role="UI设计师">
</user-card>
<!-- 自定义折叠面板 -->
<accordion-group>
<accordion-item title="什么是Web Components?">
Web Components是一套不同的技术,允许您创建可重用的定制元素。
</accordion-item>
<accordion-item title="Web Components的优势">
封装性、可重用性、互操作性、标准化。
</accordion-item>
<accordion-item title="主要技术组成">
Custom Elements、Shadow DOM、HTML Templates。
</accordion-item>
</accordion-group>
</div>
<script>
// 用户卡片自定义元素
class UserCard extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: 'open' });
}
static get observedAttributes() {
return ['name', 'avatar', 'email', 'role'];
}
connectedCallback() {
this.render();
}
attributeChangedCallback() {
this.render();
}
render() {
const name = this.getAttribute('name') || '未知用户';
const avatar = this.getAttribute('avatar') || 'https://i.pravatar.cc/150';
const email = this.getAttribute('email') || '未知邮箱';
const role = this.getAttribute('role') || '未知角色';
this.shadowRoot.innerHTML = `
<style>
.user-card {
background: white;
border-radius: 15px;
padding: 20px;
margin: 15px 0;
box-shadow: 0 5px 15px rgba(0,0,0,0.1);
display: flex;
align-items: center;
transition: transform 0.3s ease;
}
.user-card:hover {
transform: translateY(-5px);
}
.avatar {
width: 60px;
height: 60px;
border-radius: 50%;
margin-right: 15px;
object-fit: cover;
}
.info h3 {
margin: 0 0 5px 0;
color: #2d3748;
}
.info p {
margin: 2px 0;
color: #718096;
font-size: 14px;
}
</style>
<div class="user-card">
<img src="${avatar}" alt="${name}" class="avatar">
<div class="info">
<h3>${name}</h3>
<p>${email}</p>
<p><strong>${role}</strong></p>
</div>
</div>
`;
}
}
customElements.define('user-card', UserCard);
// 折叠面板自定义元素
class AccordionItem extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: 'open' });
}
connectedCallback() {
this.render();
this.addEventListener('click', this.toggle.bind(this));
}
toggle() {
const content = this.shadowRoot.querySelector('.content');
content.classList.toggle('active');
}
render() {
const title = this.getAttribute('title') || '标题';
const content = this.innerHTML;
this.shadowRoot.innerHTML = `
<style>
.accordion-item {
border: 1px solid #e2e8f0;
border-radius: 8px;
margin: 10px 0;
overflow: hidden;
}
.header {
padding: 15px 20px;
background: #f7fafc;
cursor: pointer;
font-weight: 600;
display: flex;
justify-content: space-between;
align-items: center;
}
.header:hover {
background: #edf2f7;
}
.content {
padding: 0 20px;
max-height: 0;
overflow: hidden;
transition: all 0.3s ease;
}
.content.active {
padding: 20px;
max-height: 200px;
}
.icon {
transition: transform 0.3s ease;
}
.content.active + .header .icon {
transform: rotate(180deg);
}
</style>
<div class="accordion-item">
<div class="content">${content}</div>
<div class="header">
${title}
<span class="icon">▼</span>
</div>
</div>
`;
}
}
customElements.define('accordion-item', AccordionItem);
class AccordionGroup extends HTMLElement {
constructor() {
super();
}
}
customElements.define('accordion-group', AccordionGroup);
</script>
</body>
</html>
5.2 模板与插槽
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>模板与插槽</title>
<style>
.card {
border: 1px solid #ddd;
border-radius: 8px;
padding: 16px;
margin: 16px;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
</style>
</head>
<body>
<h1>HTML模板与插槽示例</h1>
<!-- 定义模板 -->
<template id="userTemplate">
<div class="card">
<h2><slot name="name">默认姓名</slot></h2>
<p><slot name="email">默认邮箱</slot></p>
<p><slot name="bio">默认个人简介...</slot></p>
</div>
</template>
<!-- 使用模板 -->
<div id="userContainer"></div>
<!-- 另一个模板示例 -->
<template id="productTemplate">
<div class="card product">
<img slot="image" src="" style="width: 100%; height: 200px; object-fit: cover;">
<h3 slot="name">产品名称</h3>
<p slot="description">产品描述</p>
<div slot="price" class="price">¥0.00</div>
<button slot="action">购买</button>
</div>
</template>
<script>
// 使用模板创建内容
const template = document.getElementById('userTemplate');
const container = document.getElementById('userContainer');
const users = [
{ name: '张三', email: 'zhangsan@example.com', bio: '前端开发者' },
{ name: '李四', email: 'lisi@example.com', bio: 'UI设计师' },
{ name: '王五', email: 'wangwu@example.com', bio: '全栈工程师' }
];
users.forEach(user => {
const instance = template.content.cloneNode(true);
// 填充插槽内容
const nameSlot = instance.querySelector('slot[name="name"]');
const emailSlot = instance.querySelector('slot[name="email"]');
const bioSlot = instance.querySelector('slot[name="bio"]');
nameSlot.textContent = user.name;
emailSlot.textContent = user.email;
bioSlot.textContent = user.bio;
container.appendChild(instance);
});
// 动态创建模板内容
const productTemplate = document.getElementById('productTemplate');
const productInstance = productTemplate.content.cloneNode(true);
// 设置插槽内容
productInstance.querySelector('[slot="image"]').src = 'https://picsum.photos/300/200';
productInstance.querySelector('[slot="name"]').textContent = '智能手机';
productInstance.querySelector('[slot="description"]').textContent = '高性能智能手机';
productInstance.querySelector('[slot="price"]').textContent = '¥2999.00';
document.body.appendChild(productInstance);
</script>
</body>
</html>
六、 性能优化与SEO
6.1 性能优化HTML技巧
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>性能优化HTML示例</title>
<!-- 关键CSS内联 -->
<style>
/* 首屏关键CSS */
.critical-css {
font-family: system-ui, -apple-system, sans-serif;
line-height: 1.6;
color: #333;
}
.hero {
min-height: 100vh;
display: flex;
align-items: center;
justify-content: center;
background: linear-gradient(135deg, #667eea, #764ba2);
color: white;
}
</style>
<!-- 预加载关键资源 -->
<link rel="preload" href="critical.css" as="style">
<link rel="preload" href="hero-image.webp" as="image" type="image/webp">
<link rel="preload" href="font.woff2" as="font" type="font/woff2" crossorigin>
<!-- 预连接重要域名 -->
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<!-- DNS预解析 -->
<link rel="dns-prefetch" href="https://cdn.example.com">
<!-- 延迟加载非关键CSS -->
<link rel="stylesheet" href="non-critical.css" media="print" onload="this.media='all'">
<!-- 异步加载字体 -->
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600&display=swap"
rel="stylesheet" media="print" onload="this.media='all'">
</head>
<body>
<!-- 首屏内容优先 -->
<section class="hero">
<h1>高性能网站</h1>
<p>使用现代HTML技术优化性能</p>
</section>
<!-- 懒加载图片 -->
<img src="placeholder.jpg"
data-src="https://picsum.photos/800/400"
alt="描述文字"
loading="lazy"
class="lazy-image">
<!-- 响应式图片与WebP格式 -->
<picture>
<source type="image/webp" srcset="image-800.webp 800w, image-400.webp 400w">
<source type="image/jpeg" srcset="image-800.jpg 800w, image-400.jpg 400w">
<img src="image-400.jpg" alt="描述文字" loading="lazy">
</picture>
<!-- 延迟加载iframe -->
<iframe src="about:blank"
data-src="https://www.youtube.com/embed/example"
loading="lazy"
title="视频内容">
</iframe>
<!-- 结构化数据 -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "Article",
"headline": "文章标题",
"description": "文章描述",
"image": "https://example.com/image.jpg",
"author": {
"@type": "Person",
"name": "作者姓名"
},
"publisher": {
"@type": "Organization",
"name": "发布者",
"logo": {
"@type": "ImageObject",
"url": "https://example.com/logo.jpg"
}
},
"datePublished": "2024-01-01",
"dateModified": "2024-01-02"
}
</script>
<!-- 延迟加载脚本 -->
<script src="non-critical.js" defer></script>
<script>
// 图片懒加载
document.addEventListener('DOMContentLoaded', function() {
const lazyImages = [].slice.call(document.querySelectorAll('img.lazy-image'));
if ('IntersectionObserver' in window) {
const lazyImageObserver = new IntersectionObserver(function(entries, observer) {
entries.forEach(function(entry) {
if (entry.isIntersecting) {
const lazyImage = entry.target;
lazyImage.src = lazyImage.dataset.src;
lazyImage.classList.remove('lazy-image');
lazyImageObserver.unobserve(lazyImage);
}
});
});
lazyImages.forEach(function(lazyImage) {
lazyImageObserver.observe(lazyImage);
});
}
});
// iframe懒加载
const iframes = document.querySelectorAll('iframe[data-src]');
iframes.forEach(iframe => {
iframe.addEventListener('load', function() {
iframe.src = iframe.dataset.src;
});
});
</script>
</body>
</html>
七、 总结:HTML最佳实践
HTML开发的核心原则:
- 语义化优先:使用合适的标签表达内容含义
- 可访问性:确保所有用户都能访问内容
- 性能优化:减少加载时间,提升用户体验
- SEO友好:使用合适的元数据和结构化数据
- 响应式设计:确保在所有设备上良好显示
- 代码可维护:保持代码清晰、结构化
常用HTML标签速查表:
<!-- 文本标签 -->
<h1>到<h6> 标题
<p> 段落
<span> 行内容器
<strong> 重要文本
<em> 强调文本
<mark> 标记文本
<small> 小号文本
<time> 时间日期
<!-- 结构标签 -->
<header> 页头
<nav> 导航
<main> 主内容
<article> 文章
<section> 章节
<aside> 侧边栏
<footer> 页脚
<!-- 媒体标签 -->
<img> 图片
<video> 视频
<audio> 音频
<figure> 媒体组合
<figcaption> 媒体说明
<!-- 表单标签 -->
<form> 表单
<input> 输入框
<textarea> 文本域
<select> 下拉框
<button> 按钮
<label> 标签
<fieldset> 字段组
<legend> 字段组标题
<!-- 表格标签 -->
<table> 表格
<thead> 表头
<tbody> 表体
<tfoot> 表尾
<tr> 表格行
<th> 表头单元格
<td> 表格单元格
<!-- 交互标签 -->
<details> 折叠内容
<summary> 折叠标题
<dialog> 对话框
<progress> 进度条
<meter> 度量器
通过掌握这些HTML技术和最佳实践,您将能够创建出结构良好、性能优越、用户体验出色的现代网站。记住,HTML是Web开发的基石,扎实的HTML基础是成为优秀前端开发者的第一步。
© 版权声明
THE END










暂无评论内容