HTML基础介绍

HTML(HyperText Markup Language)是用于创建网页的标准标记语言。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>
</head>
<body>
    <h1>这是一个标题</h1>
    <p>这是一个段落。</p>
</body>
</html>

HTML标签

HTML标签通常成对出现,如 <p> 和 </p>。开始标签包含元素名称,结束标签包含元素名称前加斜杠。

有些HTML标签是自闭合的,不需要结束标签,如 <br>、<img>、<input> 等。

HTML属性

HTML属性提供了关于HTML元素的额外信息,它们总是在开始标签中指定。属性通常以名称/值对的形式出现,如 name="value"

<a href="https://www.example.com" target="_blank">访问示例网站</a>
<img src="image.jpg" alt="描述性文本" width="300" height="200">

全局属性:可以在任何HTML元素上使用的属性,如 idclassstyletitle 等。

局部属性:只能在特定元素上使用的属性,如 href 只能在 <a> 元素上使用,src 只能在 <img> 元素上使用。

HTML注释

HTML注释用于在代码中添加注释,这些注释不会在浏览器中显示,但对于代码的可读性和维护非常重要。

<!-- 这是一个HTML注释 -->
<p>这是一个段落。</p>
<!-- 
    这是一个多行注释
    可以跨越多行
-->

HTML实体

HTML实体用于显示特殊字符,如小于号(<)、大于号(>)、引号(")等,这些字符在HTML中有特殊含义。

<p>5 < 10</p>  
<p>10 > 5</p>  
<p>He said, "Hello!"</p>  

常用的HTML实体:

  • &lt; - 小于号(<)
  • &gt; - 大于号(>)
  • &amp; - 和号(&)
  • &quot; - 双引号(")
  • &apos; - 单引号(')
  • &nbsp; - 非-breaking空格

基本标签和元素

HTML使用各种标签来定义不同类型的内容。以下是一些最基本的HTML标签:

标签 描述
<html> HTML文档的根元素
<head> 包含文档的元数据
<body> 包含文档的可见内容
<h1> 到 <h6> 标题标签,h1最大,h6最小
<p> 段落标签
<br> 换行标签
<hr> 水平线标签

文本格式化

HTML提供了多种标签来格式化文本:

标签 描述
<b> 粗体文本
<i> 斜体文本
<u> 下划线文本
<strong> 强调文本(通常显示为粗体)
<em> 强调文本(通常显示为斜体)
<small> 小号文本
<mark> 标记文本
<del> 删除线文本
<ins> 插入线文本

列表和表格

列表

HTML支持三种类型的列表:

  • 无序列表(ul):使用项目符号标记
  • 有序列表(ol):使用数字标记
  • 定义列表(dl):包含术语和定义
<!-- 无序列表 -->
<ul>
    <li>项目1</li>
    <li>项目2</li>
    <li>项目3</li>
</ul>

<!-- 有序列表 -->
<ol>
    <li>第一步</li>
    <li>第二步</li>
    <li>第三步</li>
</ol>

表格

使用 <table> 标签创建表格:

<table border="1">
    <tr>
        <th>表头1</th>
        <th>表头2</th>
    </tr>
    <tr>
        <td>单元格1</td>
        <td>单元格2</td>
    </tr>
</table>

表单和输入

HTML表单用于收集用户输入。表单元素包括输入字段、复选框、单选按钮、提交按钮等。

基本表单结构

<form action="/submit" method="post">
    <label for="name">姓名:</label>
    <input type="text" id="name" name="name">
    <br>
    <label for="email">邮箱:</label>
    <input type="email" id="email" name="email">
    <br>
    <input type="submit" value="提交">
</form>

常用输入类型

类型 描述
text 文本输入框
password 密码输入框
email 电子邮件输入框
number 数字输入框
date 日期选择器
checkbox 复选框
radio 单选按钮
file 文件上传
submit 提交按钮
reset 重置按钮
button 普通按钮

高级表单元素

HTML5引入了许多高级表单元素,使表单功能更加强大和用户友好。

<!-- 数据列表 -->
<label for="browser">选择浏览器:</label>
<input list="browsers" id="browser" name="browser">
<datalist id="browsers">
    <option value="Chrome">
    <option value="Firefox">
    <option value="Safari">
    <option value="Edge">
    <option value="Opera">
</datalist>

<!-- 输出元素 -->
<form oninput="result.value=parseInt(a.value)+parseInt(b.value)">
    <input type="range" id="a" value="50">
    + <input type="number" id="b" value="50">
    = <output name="result" for="a b">100</output>
</form>

<!-- 进度条 -->
<progress value="70" max="100">70%</progress>

<!-- 度量衡 -->
<meter value="0.6" min="0" max="1" low="0.2" high="0.8" optimum="0.5">60%</meter>

HTML表单验证

HTML5提供了内置的表单验证功能,可以在客户端验证用户输入,减少服务器端验证的负担。

<form action="/submit" method="post">
    <!-- 必填字段 -->
    <label for="name">姓名:</label>
    <input type="text" id="name" name="name" required>
    <br>
    
    <!-- 电子邮件验证 -->
    <label for="email">邮箱:</label>
    <input type="email" id="email" name="email" required>
    <br>
    
    <!-- 数字范围验证 -->
    <label for="age">年龄:</label>
    <input type="number" id="age" name="age" min="18" max="100" required>
    <br>
    
    <!-- 模式验证(正则表达式) -->
    <label for="phone">电话:</label>
    <input type="tel" id="phone" name="phone" pattern="[0-9]{3}-[0-9]{3}-[0-9]{4}" placeholder="XXX-XXX-XXXX" required>
    <br>
    
    <!-- 长度验证 -->
    <label for="password">密码:</label>
    <input type="password" id="password" name="password" minlength="8" maxlength="20" required>
    <br>
    
    <input type="submit" value="提交">
</form>

验证属性

  • required:字段必填
  • min/max:数字或日期的最小值/最大值
  • minlength/maxlength:文本长度的最小值/最大值
  • pattern:使用正则表达式验证输入
  • type:输入类型验证(如email、url等)

HTML与CSS、JavaScript的交互

HTML是网页的结构,CSS是样式,JavaScript是行为,三者结合才能创建功能完整的现代网页。

HTML与CSS的交互

CSS通过选择器选中HTML元素并应用样式。

<!-- 内联样式 -->
<p style="color: red; font-size: 18px;">这是一个红色的段落。</p>

<!-- 内部样式表 -->
<style>
    .blue-text {
        color: blue;
        font-weight: bold;
    }
</style>
<p class="blue-text">这是一个蓝色的段落。</p>

<!-- 外部样式表 -->
<link rel="stylesheet" href="style.css">

HTML与JavaScript的交互

JavaScript可以操作HTML元素,改变其内容、样式和行为。

<!-- 内联脚本 -->
<button onclick="alert('Hello World!')">点击我</button>

<!-- 内部脚本 -->
<script>
    function changeText() {
        document.getElementById('demo').innerHTML = '文本已更改!';
    }
</script>
<p id="demo">原始文本</p>
<button onclick="changeText()">更改文本</button>

<!-- 外部脚本 -->
<script src="script.js"></script>

DOM操作

DOM(文档对象模型)是HTML和XML文档的编程接口,JavaScript通过DOM操作HTML元素。

<script>
    // 获取元素
    var element = document.getElementById('myElement');
    var elements = document.getElementsByClassName('myClass');
    var elements = document.getElementsByTagName('p');
    var element = document.querySelector('.mySelector');
    var elements = document.querySelectorAll('.mySelector');
    
    // 修改元素内容
    element.innerHTML = '新内容';
    
    // 修改元素属性
    element.setAttribute('class', 'newClass');
    
    // 修改元素样式
    element.style.color = 'red';
    element.style.fontSize = '16px';
    
    // 添加/删除元素
    var newElement = document.createElement('div');
    newElement.innerHTML = '新元素';
    document.body.appendChild(newElement);
    
    // 添加事件监听器
    element.addEventListener('click', function() {
        alert('元素被点击!');
    });
</script>

语义化标签

HTML5引入了一系列语义化标签,这些标签描述了其包含内容的类型,有助于提高代码的可读性和SEO。

常用语义化标签

标签 描述
<header> 页面或区块的头部
<nav> 导航链接区域
<main> 页面的主要内容
<section> 文档中的区块
<article> 独立的内容区块
<aside> 侧边栏或附加内容
<footer> 页面或区块的底部
<figure> 独立的媒体内容
<figcaption> 媒体内容的标题
<mark> 标记的文本
<time> 日期或时间

多媒体元素

HTML5提供了内置的多媒体元素,用于在网页中嵌入音频和视频。

音频元素

<audio controls>
    <source src="audio.mp3" type="audio/mpeg">
    <source src="audio.ogg" type="audio/ogg">
    您的浏览器不支持音频元素。
</audio>

视频元素

<video width="320" height="240" controls>
    <source src="video.mp4" type="video/mp4">
    <source src="video.ogg" type="video/ogg">
    您的浏览器不支持视频元素。
</video>

内联框架

使用 <iframe> 标签可以在当前网页中嵌入另一个网页。

基本语法

<iframe src="https://www.example.com" width="600" height="400" title="示例网站"></iframe>

常用属性

  • src:要嵌入的网页URL
  • width:框架宽度
  • height:框架高度
  • title:框架标题(无障碍访问)
  • frameborder:是否显示边框(0为不显示)
  • allowfullscreen:是否允许全屏

元数据和SEO

元数据是描述其他数据的数据,在HTML中使用 <meta> 标签定义。元数据对于SEO(搜索引擎优化)非常重要。

常用元标签

<!-- 字符集 -->
<meta charset="UTF-8">

<!-- 视口设置(响应式设计) -->
<meta name="viewport" content="width=device-width, initial-scale=1.0">

<!-- 页面描述(SEO) -->
<meta name="description" content="这是一个HTML教程网站">

<!-- 关键词(SEO) -->
<meta name="keywords" content="HTML,教程,学习">

<!-- 作者 -->
<meta name="author" content="作者名称">

<!-- 刷新页面 -->
<meta http-equiv="refresh" content="30">

HTML5新特性

HTML5引入了许多新特性,使网页开发更加丰富和强大。

主要新特性

  • 语义化标签(如header、nav、main、section等)
  • 多媒体元素(audio、video)
  • Canvas绘图
  • SVG矢量图形
  • 表单增强(新的输入类型和属性)
  • Web存储(localStorage、sessionStorage)
  • 地理定位
  • 拖放功能
  • Web Workers
  • 服务器发送事件
  • WebSocket

Canvas和SVG

HTML5提供了两种绘图技术:Canvas和SVG。

Canvas

Canvas使用JavaScript在网页上绘制图形,适合像素级操作和动画。

<canvas id="myCanvas" width="200" height="100"></canvas>
<script>
    var canvas = document.getElementById("myCanvas");
    var ctx = canvas.getContext("2d");
    ctx.fillStyle = "#FF0000";
    ctx.fillRect(0, 0, 150, 75);
</script>

SVG

SVG是一种基于XML的矢量图形格式,适合图形和图表。

<svg width="100" height="100">
    <circle cx="50" cy="50" r="40" stroke="green" stroke-width="4" fill="yellow" />
</svg>

Web存储

HTML5提供了两种在客户端存储数据的方式:localStorage和sessionStorage。

localStorage

localStorage用于长期存储数据,数据不会过期,直到被手动删除。

<script>
    // 存储数据
    localStorage.setItem("username", "张三");
    
    // 读取数据
    var user = localStorage.getItem("username");
    
    // 删除数据
    localStorage.removeItem("username");
    
    // 清空所有数据
    localStorage.clear();
</script>

sessionStorage

sessionStorage用于存储会话期间的数据,当浏览器关闭时数据会被删除。

<script>
    // 存储数据
    sessionStorage.setItem("username", "李四");
    
    // 读取数据
    var user = sessionStorage.getItem("username");
    
    // 删除数据
    sessionStorage.removeItem("username");
    
    // 清空所有数据
    sessionStorage.clear();
</script>

地理定位

HTML5的地理定位API允许网页获取用户的地理位置信息(需要用户授权)。

<script>
    if (navigator.geolocation) {
        navigator.geolocation.getCurrentPosition(showPosition);
    } else {
        alert("您的浏览器不支持地理定位");
    }
    
    function showPosition(position) {
        var latitude = position.coords.latitude;
        var longitude = position.coords.longitude;
        alert("纬度: " + latitude + ",经度: " + longitude);
    }
</script>

拖放功能

HTML5提供了原生的拖放API,使元素可以被拖动和放置。

<!-- 可拖动的元素 -->
<div draggable="true" ondragstart="drag(event)" id="drag1">拖动我</div>

<!-- 放置区域 -->
<div ondrop="drop(event)" ondragover="allowDrop(event)" id="drop1">放置到这里</div>

<script>
    function allowDrop(ev) {
        ev.preventDefault();
    }
    
    function drag(ev) {
        ev.dataTransfer.setData("text", ev.target.id);
    }
    
    function drop(ev) {
        ev.preventDefault();
        var data = ev.dataTransfer.getData("text");
        ev.target.appendChild(document.getElementById(data));
    }
</script>

Web Workers

Web Workers允许在后台线程中运行JavaScript,避免阻塞主线程。

<!-- 主线程 -->
<script>
    var worker = new Worker("worker.js");
    
    // 发送消息给Worker
    worker.postMessage("Hello Worker");
    
    // 接收Worker的消息
    worker.onmessage = function(event) {
        console.log("收到Worker的消息: " + event.data);
    };
</script>

<!-- worker.js -->
<script>
    // 接收主线程的消息
    onmessage = function(event) {
        console.log("收到主线程的消息: " + event.data);
        
        // 发送消息给主线程
        postMessage("Hello Main Thread");
    };
</script>

服务器发送事件

服务器发送事件(SSE)允许服务器向客户端推送数据,而不需要客户端频繁请求。

<!-- 客户端 -->
<script>
    var source = new EventSource("server.php");
    
    source.onmessage = function(event) {
        document.getElementById("result").innerHTML += event.data + "<br>";
    };
</script>

<div id="result"></div>

WebSocket

WebSocket提供了一种在单个TCP连接上进行全双工通信的协议,允许服务器和客户端之间实时交换数据。

基本用法

<script>
    // 创建WebSocket连接
    var ws = new WebSocket("ws://echo.websocket.org");
    
    // 连接打开时
    ws.onopen = function() {
        console.log("WebSocket连接已打开");
        // 发送消息
        ws.send("Hello WebSocket!");
    };
    
    // 接收消息时
    ws.onmessage = function(event) {
        console.log("收到消息: " + event.data);
    };
    
    // 连接关闭时
    ws.onclose = function() {
        console.log("WebSocket连接已关闭");
    };
    
    // 发生错误时
    ws.onerror = function(error) {
        console.error("WebSocket错误: " + error);
    };
</script>

WebSocket与HTTP的区别

  • WebSocket是全双工的,HTTP是半双工的
  • WebSocket连接一旦建立,服务器和客户端可以随时发送数据
  • WebSocket使用单一TCP连接,减少了连接开销
  • WebSocket支持实时通信,适合聊天应用、游戏等

Web Components

Web Components是一套允许开发者创建可重用自定义元素的API,这些元素可以在HTML中像原生元素一样使用。

基本概念

  • Custom Elements:允许定义自定义HTML元素
  • Shadow DOM:允许将封装的样式和结构附加到元素上
  • HTML Templates:允许定义可重用的HTML片段
  • HTML Imports:允许导入HTML文档(已被ES模块取代)

创建自定义元素

<script>
    // 定义自定义元素
    class MyElement extends HTMLElement {
        constructor() {
            super();
            
            // 创建shadow DOM
            const shadow = this.attachShadow({mode: 'open'});
            
            // 创建元素
            const div = document.createElement('div');
            div.textContent = '这是一个自定义元素';
            
            // 创建样式
            const style = document.createElement('style');
            style.textContent = `
                div {
                    color: blue;
                    font-size: 18px;
                    padding: 10px;
                    border: 1px solid #ccc;
                    border-radius: 4px;
                }
            `;
            
            // 将元素添加到shadow DOM
            shadow.appendChild(style);
            shadow.appendChild(div);
        }
    }
    
    // 注册自定义元素
    customElements.define('my-element', MyElement);
</script>

<!-- 使用自定义元素 -->
<my-element></my-element>

HTML Accessibility(无障碍)

HTML无障碍是指创建对所有人(包括残障人士)都可访问的网页,无论他们使用什么设备或技术。

无障碍最佳实践

  • 使用语义化标签:正确使用header、nav、main、section、article、footer等语义化标签
  • 提供替代文本:为图片添加alt属性,为视频提供字幕
  • 使用ARIA属性:为复杂组件添加适当的ARIA角色和属性
  • 确保键盘可访问性:所有功能都可以通过键盘操作
  • 提供足够的颜色对比度:确保文本与背景的对比度足够高
  • 使用清晰的导航结构:提供一致的导航体验
  • 添加跳过导航链接:允许用户直接跳转到主要内容

ARIA属性示例

<!-- 导航菜单 -->
<nav aria-label="主导航">
    <ul>
        <li><a href="#">首页</a></li>
        <li><a href="#">关于我们</a></li>
        <li><a href="#">联系我们</a></li>
    </ul>
</nav>

<!-- 警告框 -->
<div role="alert" aria-live="polite">
    您有一条新消息
</div>

<!-- 进度条 -->
<div role="progressbar" aria-valuenow="70" aria-valuemin="0" aria-valuemax="100">
    70%
</div>