Appearance
HTML与其他技术集成
HTML作为Web开发的核心技术,需要与其他技术(CSS、JavaScript、后端技术等)集成才能创建功能完整的Web应用。
HTML与CSS集成
内联样式
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>HTML与CSS集成</title>
</head>
<body>
<!-- 内联样式 - 适用于特定元素的样式 -->
<div style="color: blue; font-size: 16px; margin: 10px;">
内联样式示例
</div>
<!-- 内联样式在动态样式场景中的应用 -->
<div id="dynamic-style" style="background-color: #f0f0f0; padding: 20px;">
动态样式内容
</div>
</body>
</html>
内部样式表
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>内部样式表</title>
<style>
/* 关键渲染路径CSS - 优先级高 */
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 20px;
}
.container {
max-width: 800px;
margin: 0 auto;
}
.highlight {
background-color: yellow;
padding: 5px;
}
/* 响应式设计 */
@media (max-width: 600px) {
.container {
padding: 10px;
}
}
</style>
</head>
<body>
<div class="container">
<h1 class="highlight">标题高亮</h1>
<p>这是内容段落</p>
</div>
</body>
</html>
外部样式表
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>外部样式表</title>
<!-- 预加载关键CSS -->
<link rel="preload" href="critical.css" as="style">
<!-- 主样式表 -->
<link rel="stylesheet" href="styles.css">
<!-- 条件样式表 -->
<link rel="stylesheet" href="mobile.css" media="(max-width: 768px)">
<link rel="stylesheet" href="print.css" media="print">
<!-- 替代样式表 -->
<link rel="alternate stylesheet" href="high-contrast.css" title="高对比度">
</head>
<body>
<div class="page-content">
<h1>外部样式表示例</h1>
<p>内容将使用外部CSS样式</p>
</div>
</body>
</html>
CSS现代特性集成
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>CSS现代特性</title>
<style>
/* CSS自定义属性(变量) */
:root {
--primary-color: #007bff;
--secondary-color: #6c757d;
--font-size-base: 16px;
}
.button {
background-color: var(--primary-color);
color: white;
border: none;
padding: 10px 20px;
border-radius: 4px;
font-size: var(--font-size-base);
}
/* CSS Grid布局 */
.grid-container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
gap: 20px;
}
/* Flexbox布局 */
.flex-container {
display: flex;
justify-content: space-between;
align-items: center;
}
/* 容器查询(现代浏览器) */
@container (min-width: 400px) {
.card {
display: flex;
}
}
</style>
</head>
<body>
<div class="grid-container">
<div class="card">
<h3>卡片标题</h3>
<p>卡片内容</p>
<button class="button">按钮</button>
</div>
<div class="card">
<h3>另一个卡片</h3>
<p>更多内容</p>
<button class="button">按钮</button>
</div>
</div>
</body>
</html>
HTML与JavaScript集成
内联脚本
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>内联脚本</title>
</head>
<body>
<button onclick="alert('按钮被点击了!')">点击我</button>
<div id="content">原始内容</div>
<script>
// DOM操作示例
document.addEventListener('DOMContentLoaded', function() {
const contentDiv = document.getElementById('content');
contentDiv.innerHTML = '<p>内容已通过JavaScript更新</p>';
});
// 事件处理
function handleClick() {
console.log('按钮被点击');
}
</script>
</body>
</html>
外部脚本
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>外部脚本</title>
</head>
<body>
<div id="app">
<h1>应用内容</h1>
<button id="load-data">加载数据</button>
<div id="data-container"></div>
</div>
<!-- 脚本加载策略 -->
<script src="utils.js"></script> <!-- 普通加载 -->
<script src="app.js" defer></script> <!-- DOM解析后执行 -->
<script src="analytics.js" async></script> <!-- 异步加载 -->
</body>
</html>
模块化JavaScript
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>JavaScript模块</title>
</head>
<body>
<div id="counter-app">
<h2>计数器应用</h2>
<p>计数: <span id="count">0</span></p>
<button id="increment">增加</button>
<button id="decrement">减少</button>
</div>
<script type="module">
// 导入模块
import { Counter } from './counter.js';
// 初始化应用
const counter = new Counter(document.getElementById('count'));
// 事件监听
document.getElementById('increment').addEventListener('click', () => {
counter.increment();
});
document.getElementById('decrement').addEventListener('click', () => {
counter.decrement();
});
</script>
<!-- 非模块环境的回退 -->
<script nomodule src="counter-legacy.js"></script>
</body>
</html>
Web Components集成
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Web Components</title>
</head>
<body>
<!-- 自定义元素 -->
<user-profile name="张三" email="zhang@example.com"></user-profile>
<data-table id="my-table"></data-table>
<script>
// 定义自定义元素
class UserProfile extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: 'open' });
}
connectedCallback() {
const name = this.getAttribute('name');
const email = this.getAttribute('email');
this.shadowRoot.innerHTML = `
<style>
.profile {
border: 1px solid #ddd;
padding: 15px;
margin: 10px 0;
border-radius: 5px;
}
.name { font-weight: bold; }
.email { color: #666; }
</style>
<div class="profile">
<div class="name">${name}</div>
<div class="email">${email}</div>
</div>
`;
}
}
// 注册自定义元素
customElements.define('user-profile', UserProfile);
// 数据表格组件
class DataTable extends HTMLElement {
constructor() {
super();
this.attachShadow({ mode: 'open' });
}
connectedCallback() {
this.render([]);
}
render(data) {
this.shadowRoot.innerHTML = `
<style>
table { border-collapse: collapse; width: 100%; }
th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
th { background-color: #f2f2f2; }
</style>
<table>
<thead>
<tr>
<th>姓名</th>
<th>年龄</th>
<th>城市</th>
</tr>
</thead>
<tbody>
${data.map(row => `
<tr>
<td>${row.name}</td>
<td>${row.age}</td>
<td>${row.city}</td>
</tr>
`).join('')}
</tbody>
</table>
`;
}
set tableData(data) {
this.render(data);
}
}
customElements.define('data-table', DataTable);
// 使用组件
document.addEventListener('DOMContentLoaded', function() {
const table = document.getElementById('my-table');
table.tableData = [
{ name: '张三', age: 25, city: '北京' },
{ name: '李四', age: 30, city: '上海' }
];
});
</script>
</body>
</html>
HTML与后端技术集成
表单提交
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>表单与后端集成</title>
</head>
<body>
<form action="/api/users" method="post" enctype="multipart/form-data">
<!-- 基本表单字段 -->
<div>
<label for="username">用户名:</label>
<input type="text" id="username" name="username" required>
</div>
<div>
<label for="email">邮箱:</label>
<input type="email" id="email" name="email" required>
</div>
<div>
<label for="avatar">头像:</label>
<input type="file" id="avatar" name="avatar" accept="image/*">
</div>
<div>
<label for="bio">个人简介:</label>
<textarea id="bio" name="bio" rows="4" cols="50"></textarea>
</div>
<div>
<input type="checkbox" id="newsletter" name="newsletter" value="true">
<label for="newsletter">订阅邮件</label>
</div>
<button type="submit">提交</button>
</form>
<!-- AJAX表单提交 -->
<form id="ajax-form">
<input type="text" name="name" placeholder="姓名">
<input type="email" name="email" placeholder="邮箱">
<button type="submit">AJAX提交</button>
</form>
<div id="response"></div>
<script>
document.getElementById('ajax-form').addEventListener('submit', async function(e) {
e.preventDefault();
const formData = new FormData(this);
try {
const response = await fetch('/api/users', {
method: 'POST',
body: formData
});
const result = await response.json();
document.getElementById('response').innerHTML =
`<p>提交成功: ${JSON.stringify(result)}</p>`;
} catch (error) {
document.getElementById('response').innerHTML =
`<p>提交失败: ${error.message}</p>`;
}
});
</script>
</body>
</html>
API集成
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>API集成</title>
</head>
<body>
<div id="app">
<h1>用户列表</h1>
<button id="load-users">加载用户</button>
<div id="user-list"></div>
</div>
<script>
class APIIntegration {
constructor() {
this.baseURL = '/api';
}
async fetchUsers() {
try {
const response = await fetch(`${this.baseURL}/users`);
if (!response.ok) {
throw new Error(`HTTP error! status: ${response.status}`);
}
return await response.json();
} catch (error) {
console.error('获取用户失败:', error);
throw error;
}
}
async createUser(userData) {
try {
const response = await fetch(`${this.baseURL}/users`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(userData)
});
return await response.json();
} catch (error) {
console.error('创建用户失败:', error);
throw error;
}
}
async updateUser(id, userData) {
try {
const response = await fetch(`${this.baseURL}/users/${id}`, {
method: 'PUT',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(userData)
});
return await response.json();
} catch (error) {
console.error('更新用户失败:', error);
throw error;
}
}
async deleteUser(id) {
try {
const response = await fetch(`${this.baseURL}/users/${id}`, {
method: 'DELETE'
});
return response.ok;
} catch (error) {
console.error('删除用户失败:', error);
throw error;
}
}
}
// 使用API集成
document.addEventListener('DOMContentLoaded', function() {
const api = new APIIntegration();
document.getElementById('load-users').addEventListener('click', async function() {
try {
const users = await api.fetchUsers();
const userList = document.getElementById('user-list');
userList.innerHTML = users.map(user => `
<div class="user-card">
<h3>${user.name}</h3>
<p>邮箱: ${user.email}</p>
<p>ID: ${user.id}</p>
</div>
`).join('');
} catch (error) {
console.error('加载用户失败:', error);
}
});
});
</script>
</body>
</html>
HTML与现代前端框架集成
与React集成
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>React集成</title>
<script src="https://unpkg.com/react@18/umd/react.development.js"></script>
<script src="https://unpkg.com/react-dom@18/umd/react-dom.development.js"></script>
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
</head>
<body>
<div id="react-root"></div>
<script type="text/babel">
function UserCard({ user }) {
return (
<div style={{ border: '1px solid #ccc', margin: '10px', padding: '15px' }}>
<h3>{user.name}</h3>
<p>邮箱: {user.email}</p>
<p>年龄: {user.age}</p>
</div>
);
}
function App() {
const [users, setUsers] = React.useState([
{ id: 1, name: '张三', email: 'zhang@example.com', age: 25 },
{ id: 2, name: '李四', email: 'li@example.com', age: 30 }
]);
return (
<div>
<h1>用户列表</h1>
{users.map(user => (
<UserCard key={user.id} user={user} />
))}
</div>
);
}
const root = ReactDOM.createRoot(document.getElementById('react-root'));
root.render(<App />);
</script>
</body>
</html>
与Vue集成
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>Vue集成</title>
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
</head>
<body>
<div id="vue-app">
<h1>{{ title }}</h1>
<input v-model="newUser.name" placeholder="姓名">
<input v-model="newUser.email" placeholder="邮箱">
<button @click="addUser">添加用户</button>
<ul>
<li v-for="user in users" :key="user.id">
{{ user.name }} - {{ user.email }}
<button @click="removeUser(user.id)">删除</button>
</li>
</ul>
</div>
<script>
const { createApp, ref } = Vue;
createApp({
setup() {
const title = ref('Vue应用');
const users = ref([
{ id: 1, name: '张三', email: 'zhang@example.com' },
{ id: 2, name: '李四', email: 'li@example.com' }
]);
const newUser = ref({ name: '', email: '' });
const addUser = () => {
if (newUser.value.name && newUser.value.email) {
users.value.push({
id: Date.now(),
name: newUser.value.name,
email: newUser.value.email
});
newUser.value = { name: '', email: '' };
}
};
const removeUser = (id) => {
users.value = users.value.filter(user => user.id !== id);
};
return {
title,
users,
newUser,
addUser,
removeUser
};
}
}).mount('#vue-app');
</script>
</body>
</html>
HTML与数据库集成
本地存储集成
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>本地存储集成</title>
</head>
<body>
<div id="storage-app">
<h1>本地存储应用</h1>
<input type="text" id="task-input" placeholder="输入任务">
<button onclick="addTask()">添加任务</button>
<button onclick="clearTasks()">清空任务</button>
<ul id="task-list"></ul>
</div>
<script>
class StorageManager {
constructor() {
this.storageKey = 'tasks';
}
// localStorage操作
saveTasks(tasks) {
localStorage.setItem(this.storageKey, JSON.stringify(tasks));
}
loadTasks() {
const tasks = localStorage.getItem(this.storageKey);
return tasks ? JSON.parse(tasks) : [];
}
addTask(task) {
const tasks = this.loadTasks();
tasks.push({
id: Date.now(),
text: task,
completed: false,
createdAt: new Date().toISOString()
});
this.saveTasks(tasks);
return tasks;
}
removeTask(id) {
const tasks = this.loadTasks().filter(task => task.id !== id);
this.saveTasks(tasks);
return tasks;
}
toggleTask(id) {
const tasks = this.loadTasks().map(task => {
if (task.id === id) {
return { ...task, completed: !task.completed };
}
return task;
});
this.saveTasks(tasks);
return tasks;
}
}
const storage = new StorageManager();
function addTask() {
const input = document.getElementById('task-input');
const text = input.value.trim();
if (text) {
storage.addTask(text);
input.value = '';
renderTasks();
}
}
function clearTasks() {
localStorage.removeItem('tasks');
renderTasks();
}
function renderTasks() {
const tasks = storage.loadTasks();
const list = document.getElementById('task-list');
list.innerHTML = tasks.map(task => `
<li style="text-decoration: ${task.completed ? 'line-through' : 'none'}">
<span onclick="toggleTask(${task.id})">${task.text}</span>
<button onclick="removeTask(${task.id})" style="margin-left: 10px;">删除</button>
</li>
`).join('');
}
function removeTask(id) {
storage.removeTask(id);
renderTasks();
}
function toggleTask(id) {
storage.toggleTask(id);
renderTasks();
}
// 页面加载时渲染任务
document.addEventListener('DOMContentLoaded', renderTasks);
</script>
</body>
</html>
响应式设计集成
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>
<style>
/* 基础样式 */
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 20px;
line-height: 1.6;
}
.container {
max-width: 1200px;
margin: 0 auto;
}
/* 响应式网格 */
.grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));
gap: 20px;
}
.card {
background: #f9f9f9;
padding: 20px;
border-radius: 8px;
box-shadow: 0 2px 4px rgba(0,0,0,0.1);
}
/* 移动端优先的媒体查询 */
.nav {
display: flex;
flex-direction: column;
}
@media (min-width: 768px) {
.nav {
flex-direction: row;
justify-content: space-between;
}
.grid {
grid-template-columns: repeat(3, 1fr);
}
}
@media (min-width: 1024px) {
.grid {
grid-template-columns: repeat(4, 1fr);
}
}
/* 打印样式 */
@media print {
.no-print {
display: none;
}
body {
font-size: 12pt;
}
}
</style>
</head>
<body>
<div class="container">
<nav class="nav">
<a href="#home">首页</a>
<a href="#about">关于</a>
<a href="#contact">联系</a>
</nav>
<main>
<h1>响应式设计示例</h1>
<div class="grid">
<div class="card">
<h3>卡片1</h3>
<p>响应式内容,会在不同屏幕尺寸下自动调整布局</p>
</div>
<div class="card">
<h3>卡片2</h3>
<p>响应式内容,会在不同屏幕尺寸下自动调整布局</p>
</div>
<div class="card">
<h3>卡片3</h3>
<p>响应式内容,会在不同屏幕尺寸下自动调整布局</p>
</div>
<div class="card no-print">
<h3>卡片4</h3>
<p>此卡片在打印时会被隐藏</p>
</div>
</div>
</main>
</div>
<script>
// 响应式JavaScript
function handleResize() {
const width = window.innerWidth;
const grid = document.querySelector('.grid');
if (width < 768) {
grid.style.gridTemplateColumns = '1fr';
} else if (width < 1024) {
grid.style.gridTemplateColumns = 'repeat(2, 1fr)';
}
// 更大的屏幕使用CSS媒体查询
}
// 监听窗口大小变化
window.addEventListener('resize', handleResize);
// 初始化
handleResize();
</script>
</body>
</html>
安全集成
CSP集成
html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>安全集成</title>
<!-- 内容安全策略 -->
<meta http-equiv="Content-Security-Policy"
content="default-src 'self';
script-src 'self' 'unsafe-inline' https://trusted-cdn.com;
style-src 'self' 'unsafe-inline' https://fonts.googleapis.com;
img-src 'self' data: https:;
font-src 'self' https://fonts.gstatic.com;
connect-src 'self' https://api.example.com;">
</head>
<body>
<h1>安全集成示例</h1>
<!-- 安全的外部资源 -->
<link rel="stylesheet" href="https://trusted-cdn.com/styles.css">
<!-- 安全的内联脚本(开发时使用,生产环境应分离) -->
<script>
// 安全的数据处理
function safeDisplayContent(content) {
// 使用textContent而不是innerHTML防止XSS
const container = document.getElementById('content');
container.textContent = content;
}
// 安全的URL处理
function isValidUrl(url) {
try {
const parsed = new URL(url);
return parsed.protocol === 'https:';
} catch (e) {
return false;
}
}
</script>
<div id="content">安全内容显示区域</div>
</body>
</html>
HTML与其他技术的集成是构建现代Web应用的关键。通过合理集成CSS、JavaScript、后端API等技术,可以创建功能丰富、性能优异、安全可靠的Web应用。