基础响应式网页(静态内容)
这是一个最经典的网页结构,适合个人博客、作品集、公司介绍等静态内容展示。

(图片来源网络,侵删)
文件结构
project-root/
├── index.html
├── css/
│ └── style.css
└── js/
└── main.js
index.html (骨架)
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">我的第一个网页</title>
<link rel="stylesheet" href="css/style.css">
<!-- 可以在这里添加 Font Awesome 等图标库 -->
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.0.0/css/all.min.css">
</head>
<body>
<header>
<nav>
<div class="logo">Logo</div>
<ul class="nav-links">
<li><a href="#home">首页</a></li>
<li><a href="#about">lt;/a></li>
<li><a href="#services">服务</a></li>
<li><a href="#contact">联系</a></li>
</ul>
</nav>
</header>
<main>
<section id="home">
<h1>欢迎来到我的网站</h1>
<p>这是一个使用 HTML, CSS 和 JavaScript 构建的响应式网页模板。</p>
<button id="cta-button">了解更多</button>
</section>
<section id="about">
<h2>关于我们</h2>
<p>这里是关于我们的详细介绍...</p>
</section>
</main>
<footer>
<p>© 2025 我的公司. 保留所有权利.</p>
</footer>
<!-- 引入 JavaScript 文件 -->
<script src="js/main.js"></script>
</body>
</html>
css/style.css (样式)
/* 全局重置和基础样式 */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Arial', sans-serif;
line-height: 1.6;
color: #333;
}
/* 头部导航 */
header {
background: #333;
color: #fff;
padding: 1rem 0;
position: sticky;
top: 0;
z-index: 1000;
}
nav {
display: flex;
justify-content: space-between;
align-items: center;
max-width: 1100px;
margin: 0 auto;
padding: 0 2rem;
}
.nav-links li {
display: inline-block;
margin-left: 20px;
}
.nav-links a {
color: #fff;
text-decoration: none;
transition: color 0.3s ease;
}
.nav-links a:hover {
color: #00d2ff;
}
区域 */
main {
max-width: 1100px;
margin: 2rem auto;
padding: 0 2rem;
}
section {
margin-bottom: 3rem;
}
h1, h2 {
margin-bottom: 1rem;
}
#home {
text-align: center;
padding: 4rem 0;
}
#cta-button {
background: #00d2ff;
color: #fff;
border: none;
padding: 12px 24px;
font-size: 1rem;
cursor: pointer;
border-radius: 5px;
transition: background 0.3s ease;
}
#cta-button:hover {
background: #00a8cc;
}
/* 页脚 */
footer {
background: #333;
color: #fff;
text-align: center;
padding: 1.5rem 0;
margin-top: 2rem;
}
/* 响应式设计 */
@media (max-width: 768px) {
nav {
flex-direction: column;
text-align: center;
}
.nav-links {
margin-top: 1rem;
}
.nav-links li {
display: block;
margin: 10px 0;
}
}
js/main.js (交互)
// 等待整个 HTML 文档加载完毕后执行
document.addEventListener('DOMContentLoaded', () => {
// 获取 CTA 按钮
const ctaButton = document.getElementById('cta-button');
// 为按钮添加点击事件监听器
ctaButton.addEventListener('click', () => {
alert('感谢您的关注!这里可以跳转到其他页面或显示更多信息。');
});
// 平滑滚动到锚点
document.querySelectorAll('a[href^="#"]').forEach(anchor => {
anchor.addEventListener('click', function (e) {
e.preventDefault();
const target = document.querySelector(this.getAttribute('href'));
if (target) {
target.scrollIntoView({
behavior: 'smooth',
block: 'start'
});
}
});
});
console.log('网页已加载,JavaScript 运行正常!');
});
交互式单页应用 (SPA)
这个模板模拟了一个简单的单页应用,页面内容通过 JavaScript 动态加载,无需刷新整个页面。
文件结构
project-root/
├── index.html
├── css/
│ └── style.css
└── js/
└── app.js
index.html (简洁的骨架)
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">单页应用示例</title>
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<div id="app">
<!-- 导航 -->
<nav>
<button data-page="home" class="nav-btn active">首页</button>
<button data-page="about" class="nav-btn">lt;/button>
<button data-page="contact" class="nav-btn">联系</button>
</nav>
<!-- 内容容器 -->
<main id="page-content">
<!-- 内容将通过 JavaScript 动态插入 -->
<p>请从上方导航选择一个页面...</p>
</main>
</div>
<script src="js/app.js"></script>
</body>
</html>
css/style.css (与模板一类似,略有调整)
/* 基础样式与模板一相同,这里只展示新增或修改的部分 */
#app {
max-width: 800px;
margin: 2rem auto;
padding: 0 1rem;
font-family: sans-serif;
}
nav {
display: flex;
gap: 10px;
margin-bottom: 2rem;
border-bottom: 1px solid #ccc;
padding-bottom: 10px;
}
.nav-btn {
padding: 10px 20px;
border: 1px solid #ddd;
background: #f4f4f4;
cursor: pointer;
border-radius: 5px;
transition: all 0.3s ease;
}
.nav-btn.active {
background: #007bff;
color: white;
border-color: #007bff;
}
#page-content {
min-height: 400px;
padding: 20px;
border: 1px solid #eee;
border-radius: 8px;
}
js/app.js (核心逻辑)
const pages = {
home: {
title: '欢迎来到首页',
content: `
<h1>首页内容</h1>
<p>这是通过 JavaScript 动态加载的首页内容。</p>
<p>您可以看到,点击导航按钮时,页面不会刷新,但内容会发生变化。</p>
`
},
about: {
title: '关于我们',
content: `
<h1>关于我们</h1>
<p>我们是一个致力于创造美好网络体验的团队。</p>
<p>我们专注于前端技术的创新与应用。</p>
`
},
contact: {
title: '联系我们',
content: `
<h1>联系我们</h1>
<p>邮箱: contact@example.com</p>
<p>电话: 123-456-7890</p>
<p>地址: 北京市朝阳区某某街道</p>
`
}
};
// 获取 DOM 元素
const pageContent = document.getElementById('page-content');
const navButtons = document.querySelectorAll('.nav-btn');
// 函数:加载页面内容
function loadPage(pageId) {
const page = pages[pageId];
if (page) {
pageContent.innerHTML = page.content;
// 更新页面标题 (可选)
document.title = page.title;
}
}
// 为每个导航按钮添加点击事件
navButtons.forEach(button => {
button.addEventListener('click', () => {
// 1. 移除所有按钮的 'active' 类
navButtons.forEach(btn => btn.classList.remove('active'));
// 2. 给当前点击的按钮添加 'active' 类
button.classList.add('active');
// 3. 获取要加载的页面 ID 并加载内容
const pageId = button.getAttribute('data-page');
loadPage(pageId);
});
});
// 页面加载时,默认加载首页
window.addEventListener('DOMContentLoaded', () => {
loadPage('home');
});
功能丰富的组件化应用
这个模板引入了组件化思想,使用原生 JS 模拟框架(如 Vue/React)的一些核心功能,如数据绑定和事件处理,它非常适合构建复杂的、数据驱动的界面。
文件结构
project-root/
├── index.html
├── css/
│ └── style.css
└── js/
├── app.js # 主应用逻辑
└── components/
└── todo.js # 待办事项组件
index.html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">待办事项应用</title>
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<div id="app">
<h1>我的待办事项</h1>
<!-- 待办事项组件将被渲染在这里 -->
<div id="todo-app"></div>
</div>
<script src="js/components/todo.js"></script>
<script src="js/app.js"></script>
</body>
</html>
css/style.css
body {
font-family: sans-serif;
background-color: #f0f2f5;
padding: 20px;
}
#app {
max-width: 600px;
margin: 0 auto;
background: white;
padding: 20px;
border-radius: 8px;
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
}
#todo-app {
margin-top: 20px;
}
.todo-input-group {
display: flex;
margin-bottom: 20px;
}
#new-todo-input {
flex-grow: 1;
padding: 10px;
border: 1px solid #ddd;
border-radius: 4px 0 0 4px;
}
#add-todo-btn {
padding: 10px 15px;
border: 1px solid #007bff;
background: #007bff;
color: white;
border-radius: 0 4px 4px 0;
cursor: pointer;
}
.todo-list {
list-style: none;
}
.todo-item {
display: flex;
align-items: center;
padding: 10px;
border-bottom: 1px solid #eee;
}
.todo-item.completed .todo-text {
text-decoration: line-through;
color: #aaa;
}
.todo-checkbox {
margin-right: 10px;
}
.todo-text {
flex-grow: 1;
}
.delete-btn {
background: #dc3545;
color: white;
border: none;
padding: 5px 10px;
border-radius: 4px;
cursor: pointer;
}
js/components/todo.js (组件逻辑)
// 这是一个简单的待办事项组件
class TodoApp {
constructor(containerId) {
this.container = document.getElementById(containerId);
this.todos = this.loadTodos(); // 从本地存储加载
this.render();
}
// 从 localStorage 加载
loadTodos() {
const savedTodos = localStorage.getItem('todos');
return savedTodos ? JSON.parse(savedTodos) : [];
}
// 保存到 localStorage
saveTodos() {
localStorage.setItem('todos', JSON.stringify(this.todos));
}
// 添加新待办事项
addTodo(text) {
if (text.trim() === '') return;
const newTodo = {
id: Date.now(),
text: text,
completed: false
};
this.todos.push(newTodo);
this.saveTodos();
this.render();
}
// 切换完成状态
toggleTodo(id) {
const todo = this.todos.find(t => t.id === id);
if (todo) {
todo.completed = !todo.completed;
this.saveTodos();
this.render();
}
}
// 删除待办事项
deleteTodo(id) {
this.todos = this.todos.filter(t => t.id !== id);
this.saveTodos();
this.render();
}
// 渲染组件到 DOM
render() {
const html = `
<div class="todo-input-group">
<input type="text" id="new-todo-input" placeholder="添加一个新的待办事项...">
<button id="add-todo-btn">添加</button>
</div>
<ul class="todo-list">
${this.todos.map(todo => `
<li class="todo-item ${todo.completed ? 'completed' : ''}">
<input type="checkbox" class="todo-checkbox" data-id="${todo.id}" ${todo.completed ? 'checked' : ''}>
<span class="todo-text">${todo.text}</span>
<button class="delete-btn" data-id="${todo.id}">删除</button>
</li>
`).join('')}
</ul>
`;
this.container.innerHTML = html;
// 绑定事件
this.bindEvents();
}
// 绑定事件委托
bindEvents() {
// 添加按钮点击事件
const addBtn = this.container.querySelector('#add-todo-btn');
const input = this.container.querySelector('#new-todo-input');
addBtn.addEventListener('click', () => {
this.addTodo(input.value);
input.value = '';
});
// 输入框回车事件
input.addEventListener('keypress', (e) => {
if (e.key === 'Enter') {
this.addTodo(input.value);
input.value = '';
}
});
// 使用事件委托处理复选框和删除按钮
this.container.addEventListener('click', (e) => {
const id = parseInt(e.target.getAttribute('data-id'));
if (e.target.classList.contains('todo-checkbox')) {
this.toggleTodo(id);
} else if (e.target.classList.contains('delete-btn')) {
this.deleteTodo(id);
}
});
}
}
js/app.js (启动应用)
// 当 DOM 加载完成后,初始化我们的待办事项应用
document.addEventListener('DOMContentLoaded', () => {
// 创建 TodoApp 实例,并挂载到 #todo-app 元素上
new TodoApp('todo-app');
});
如何选择和使用这些模板?
-
基础响应式网页
- 适用场景:新手入门、学习基础三件套、制作简单的展示型网站。
- 核心:理解 HTML 结构、CSS 样式和基础的 JS 事件处理。
-
交互式单页应用
(图片来源网络,侵删)- 适用场景:个人作品集、小型产品介绍页、需要流畅用户体验的网站。
- 核心:学习 DOM 操作、事件监听、状态管理和
history.pushState(本例未展示,但可以扩展)来实现无刷新页面切换。
-
功能丰富的组件化应用
- 适用场景:复杂的 Web 应用、数据驱动的界面(如仪表盘、管理系统)、希望学习现代前端开发思想。
- 核心:理解组件化思想、数据与视图的分离、事件委托、以及如何组织代码结构,这是向 Vue、React、Angular 等 MVVM 框架迈出的重要一步。
使用建议:
- 将代码复制到对应的文件中。
- 使用 Visual Studio Code、Sublime Text 或任何你喜欢的代码编辑器打开项目文件夹。
- 用浏览器打开
index.html文件即可看到效果。 - 修改代码,观察变化,这是学习的最好方式。

(图片来源网络,侵删)
