src
与 href
的区别详解
在 HTML 开发中,src
和 href
是两个非常常见但容易混淆的属性。它们都用于引入外部资源,但在浏览器解析机制、加载行为和使用场景上存在显著差异。
本文将从定义、工作原理、应用场景及性能优化角度 深入讲解 src
与 href
的区别,并结合实际开发中的最佳实践,帮助你写出更高效、更合理的 HTML 代码。
🧩 一、基本概念
属性名 | 全称 | 中文含义 | 主要用途 |
---|---|---|---|
src |
source | 资源来源 | 替换当前元素内容(嵌入资源) |
href |
Hypertext Reference | 超文本引用 | 建立链接关系或引用资源 |
🔍 二、详细对比分析
✅ 1. src
属性详解
定义:
src
表示"source",即该标签所代表的内容是外部资源本身,会替换当前元素并嵌入到页面中。
使用场景:
<img src="logo.png">
<script src="main.js"></script>
<iframe src="https://example.com"></iframe>
<audio src="music.mp3"></audio>
加载机制:
- 浏览器遇到带有
src
的标签时,会暂停当前文档的解析,去请求并下载对应的资源。 - 下载完成后,执行或渲染该资源(如 JS 执行、图片显示)。
- 在此期间,页面其余部分的渲染会被阻塞。
示例:
html
<script src="app.js"></script>
当浏览器解析到这段代码时,会暂停 HTML 解析,去加载
app.js
并执行脚本,之后才继续解析后续内容。
性能建议:
- 将
<script>
标签放在<body>
结尾处,避免阻塞页面渲染。 - 或使用
async
/defer
属性异步加载脚本(适用于非关键 JS)。
✅ 2. href
属性详解
定义:
href
表示"hypertext reference",即建立一个超链接关系,不会替换当前元素,而是指示浏览器去获取指定资源并与当前文档建立联系。
使用场景:
<a href="https://example.com">跳转链接</a>
<link href="style.css" rel="stylesheet">
<area href="image-map.html">
加载机制:
href
不会导致文档解析中断。- 浏览器会并行下载资源(如 CSS 文件),同时继续解析和渲染页面其他内容。
- 资源加载完成后再进行应用(如样式表生效)。
示例:
html
<link href="style.css" rel="stylesheet">
浏览器会下载
style.css
,但不会停止解析 HTML 文档,提高了页面加载效率。
性能建议:
- 推荐使用
<link>
引入 CSS,而非@import
,因为@import
会延迟加载。 - 使用
<a>
标签时,注意 SEO 和用户体验,合理设置rel="nofollow"
等属性。
📊 三、总结对比表
对比维度 | src |
href |
---|---|---|
是否替换当前元素 | ✅ 是 | ❌ 否 |
是否阻塞页面解析 | ✅ 是(如 JS) | ❌ 否(如 CSS) |
主要用途 | 嵌入资源(JS、图片、音频等) | 建立链接或引用资源(CSS、锚点) |
加载方式 | 阻塞式加载 | 并行加载 |
典型标签 | <script> 、<img> 、<iframe> |
<link> 、<a> 、<area> |
是否需要闭合标签 | 视具体标签而定 | 不影响是否闭合 |
💡 四、常见误区与注意事项
❗误区 1:混淆 <script>
和 <link>
的作用
<script src="...">
会执行 JavaScript,可能修改 DOM;<link href="..." rel="stylesheet">
只是加载 CSS,不会执行脚本。
❗误区 2:误以为所有带 src
的标签都会阻塞页面
<img src="...">
不会阻塞 HTML 解析,但会占用网络资源。<script src="...">
默认会阻塞解析,除非加async
或defer
。
❗误区 3:认为 href
只用于超链接
href
还可以用于<link>
、<base>
、<area>
等标签,不只是<a>
。
🧰 五、实际开发中的最佳实践
-
JS 脚本放在底部
- 避免阻塞页面渲染,提升首屏加载速度。
-
CSS 放在
<head>
中- 提前加载样式,避免页面无样式闪烁。
-
使用
async
/defer
异步加载脚本html<script src="app.js" async></script> <!-- 异步加载,加载时不阻塞 --> <script src="app.js" defer></script> <!-- 异步加载,延迟执行直到 HTML 解析完成 -->
-
避免使用
@import
引入 CSS- 会增加 HTTP 请求次数,降低性能。
-
为图片添加
alt
属性- 提升可访问性,增强 SEO。