每次有人问我网页入门先学什么,我几乎都会说:先学会放一张图、加一个链接。原因很简单——无论是公司官网、个人博客还是电商活动页,所有的视觉呈现和跳转逻辑,最后都会被浏览器翻译成几个最基础的HTML标签。图片标签、超链接标签、锚点定位这三样东西,占了我平时修前端页面时排查问题的三分之一。今天不聊框架,不聊工程化,就把这三个最“老”的标签拆开揉碎讲清楚。
如果你是刚看完HTML教程、准备动手写第一个页面的新手,或者已经能写出页面但总被图片裂了、跳转无效、锚点定位偏了这类问题折磨的同学,这篇文章可以帮你把底层逻辑捋顺。后面每一条都是我从实际项目里验证过的操作,不是光贴官方文档。
1. 整体设计:为什么这三组标签值得单独拿出来细讲
1.1 图片、超链接、锚点在HTML里的角色
很多人会觉得img、a、id这些都是“背就完了”的简单标签,不值得单独研究。但恰恰是这些“简单标签”,撑起了网页内容互联的骨架。
- 图片负责把视觉信息引入页面,相当于网页的“血肉”。
- 超链接负责在不同页面、不同站点之间建立通路,相当于网页的“神经”。
- 锚点说的是页内跳转,相当于在一篇文章里做个目录,让读者可以立刻跳到某个章节。
这三个能力组合起来,才能实现一个最基本的“可浏览、可导航、可被搜索引擎理解”的网页。我见过不少项目,样式写得漂漂亮亮,结果线上图片全部空白,或者点击导航没有反应,最后查下来都是标签用错了属性。所以这三个标签不是“背下来就行”,而是要知道每个属性在浏览器里到底发生了什么。
1.2 用HTML标签而不是纯JS/CSS方案的原因
有时候我们会看到一些人用CSS的background-image来展示图片,用window.location实现跳转,用JS的scrollIntoView做页面滚动。这些方案在某些场景下有它们的位置,但HTML原生标签依然是默认首选,原因是它们的“语义”和“降级能力”是任何框架都替代不了的。
img标签自带alt替代文本,图片加载失败时还能显示文字说明,搜索引擎也依赖它理解图片内容。a标签带href地址,用户可以用“在新标签页打开”“复制链接地址”等浏览器原生能力操作它。- 锚点定位借助的是HTML的
id属性和URL中的#hash,浏览器天然支持,甚至可以在地址栏里直接输入带锚点的地址直达某个位置。
本质上,HTML标签是“浏览器和用户都能理解的共同语言”。用纯JS方案虽然能实现类似效果,但在禁用JS、搜索引擎抓取、无障碍访问等场景下,原生标签的健壮性就体现出来了。所以我的建议很简单:能做在HTML结构里的事情,就别依赖JS。
1.3 适用场景和学习路线
这篇文章适合下面几类人:
- 刚学完HTML基础语法,想搞清img、a、锚点之间关系的初学者。
- 已经在写页面,但经常遇到图片裂、链接失效、锚点偏移问题的前端开发者。
- 负责网站日常更新的运营同学,需要自己插入图片和链接,又不希望破坏页面结构。
学习路线不需要太复杂。先掌握每个标签的必填属性和可选属性,再理解浏览器的加载顺序,最后通过实际页面的调试手法把知识串起来。下面我按这个顺序展开,每个环节都给了可以直接抄的代码和排查方法。
2. 图片标签:属性、格式与响应式方案的取舍
2.1 img标签的必填属性与基础写法
图片标签的核心就是一个“必须有起点”的标签:
<img src="cat.jpg" alt="一只橘猫趴在窗台上">src是图片的地址,alt是图片加载失败或失明用户朗读时看到的替代文本。这两个属性一个是“图片从哪来”,一个是“图片是什么”,缺一个都会出问题。
很多新手会忽视alt,觉得图片能显示就行了。但在实际工作里,alt至少有四个作用:
- 图片加载失败时,显示一段说明文字,不至于让用户看到一片空白。
- 屏幕阅读器会朗读
alt内容,帮助视觉障碍用户理解图片。 - 搜索引擎抓取图片时会读
alt,写得好能带来图片搜索流量。 - 在弱网环境下,很多浏览器会先显示
alt,等图片加载完再替换。
我在项目里见过最典型的问题是:给装饰性图片也写上一大段alt,结果屏幕阅读器朗读出来全是噪音。正常情况下,装饰性图片应该使用alt=""空属性,表示“图片不重要,可以忽略”。注意,是空字符串,而不是漏掉alt。
2.2 控制尺寸的两种方式及其区别
图片尺寸控制经常被混淆。width和height属性可以在HTML里写,也可以在CSS里写。我的建议是:
- 在HTML里写
width和height,作用是给浏览器一个预期的尺寸,防止布局抖动。 - 在CSS里控制实际展示尺寸,使用响应式规则适配屏幕。
推荐的基础做法:
<img src="photo.jpg" width="1200" height="800" alt="产品宣传图" style="max-width: 100%; height: auto;">这样写的好处是:浏览器在图片还没加载完时,已经预留了1200x800的空间,页面不会突然上下跳动。CSS再把最大宽度限制为父容器宽度,高度自动缩放,适配手机屏幕。
这里有个常见误区:如果HTML里只设置了width="1200" height="800",不写CSS的max-width:100%,那么在小屏手机上图片会超出容器,导致横向滚动。相反,如果只写CSS,不写HTML尺寸,图片加载完成后页面可能会发生明显跳动,体验很差。最佳组合就是上面那个。
2.3 图片格式选型:什么时候用WebP、AVIF、PNG、SVG
从实际项目角度看,图片格式直接影响页面加载速度和清晰度。我整理了一张选型表:
| 格式 | 适用场景 | 注意事项 |
|---|---|---|
| JPEG | 照片、复杂渐变场景 | 不支持透明背景,压缩过度会产生方块伪影 |
| PNG | 图标、截图、需要透明背景的图片 | 文件体积大,不适合大面积照片 |
| WebP | 网站常规图片推荐 | 支持透明和压缩,老版本浏览器可能需要降级方案 |
| AVIF | 高质量高压缩比需求 | 文件更小,但部分工具链和浏览器兼容性仍需关注 |
| SVG | 图标、Logo、插画等矢量图形 | 可无限缩放,不模糊,但复杂图形文件可能变大 |
| GIF | 简单动图 | 颜色有限,现在建议优先用WebP或视频替代 |
很多团队实际采用的做法,是把原始图片上传到图片托管或CDN服务,由对象存储自动生成WebP和AVIF格式,再用<picture>标签让浏览器选择差转后最合适的版本:
<picture> <source srcset="photo.avif" type="image/avif"> <source srcset="photo.webp" type="image/webp"> <img src="photo.jpg" alt="风景照片"> </picture><picture>标签的意思很简单:如果浏览器支持AVIF,就用AVIF;如果不支持,就用WebP;实在不行,就回退到JPEG。这是目前兼容性和性能兼顾最稳的做法。
2.4 响应式图片与srcset
除了不同格式,响应式图片还需要处理不同屏幕尺寸。srcset属性可以在同一个img标签里提供多份源图:
<img srcset="small.jpg 480w, medium.jpg 800w, large.jpg 1200w" sizes="(max-width: 600px) 480px, (max-width: 1000px) 800px, 1200px" src="large.jpg" alt="示例图片">解释一下:
480w、800w、1200w表示图片的真实宽度是多少像素。sizes告诉浏览器当前页面中这个图片大概占多宽。- 浏览器会根据当前设备宽度、屏幕像素密度(比如Retina屏)自主选择最合适的源图。
在实际项目中,我一般不会手写这么复杂的srcset,因为图片托管平台会自动生成多尺寸版本。但作为原理了解,这能帮你在缓存命中、加载速度优化时定位问题。
2.5 图片懒加载与加载失败的降级处理
懒加载是提升页面性能的常用手段。原生属性loading="lazy"可以直接指示浏览器延迟加载屏幕外的图片:
<img src="long-page-image.jpg" alt="长页面底部的图片" loading="lazy">loading="lazy"适合页面较长、首屏之外的图片。但如果图片在首屏范围内,最好别加,否则可能延迟加载,影响用户感知速度。首屏以内的图片应该默认直接加载,或者用fetchpriority="high"标记优先级:
<img src="hero.jpg" alt="首屏主视觉" fetchpriority="high">还有一点很多人没注意到:loading="lazy"与iframe懒加载的组合问题。我遇到过一些页面,滚动到某个位置才加载图片,结果图片区域高度突然变化,锚点定位位置也偏了。后来解决办法是在图片外层容器显式设置最小高度,或者给图片加宽高属性预留空间。
图片加载失败的降级处理也很重要。除了alt之外,如果希望加载失败时显示一张占位图,可以在onerror里做:
<img src="product.jpg" alt="产品图" onerror="this.src='placeholder.png'; this.onerror=null;">这里需要注意this.onerror=null,否则如果占位图也加载失败,会陷入死循环。我个人不太建议把业务逻辑写在onerror里,最好通过一个函数统一处理。但临时应急时这种方式很快。
2.6 图片标签的SEO与无障碍补充
给图片配上figcaption能增强语义,搜索结果中也更容易被理解:
<figure> <img src="team.jpg" alt="团队成员合影"> <figcaption>2024年团队建设活动合影</figcaption> </figure>这里有个容易被忽略的问题:alt和figcaption不要写成一模一样的内容。alt描述图片具体内容,figcaption是图片标题。两者重复会导致屏幕阅读器用户听到两次同样的信息。举例来说:
<img src="team.jpg" alt="十位团队成员站在公司门口合影"> <figcaption>2024年团队建设活动合影</figcaption>这样的写法就比较自然。
3. 超链接标签:跳转逻辑、属性策略与链接文案的艺术
3.1 a标签的基础结构与href地址类型
超链接标签的完整用法是所有HTML标签里最容易“想当然”的。最基本的写法是:
<a href="https://example.com/page">点击访问</a>href可以填多种地址类型,不只是普通URL:
| 地址类型 | 写法 | 用途 |
|---|---|---|
| 绝对URL | href="https://example.com/a" | 跳转到其他网站 |
| 相对URL | href="./about.html" | 跳转到当前网站其他页面 |
| 同页锚点 | href="#section2" | 跳到当前页面某个位置 |
| 链接其他页面的锚点 | href="other.html#section2" | 跳到其他页面的某个位置 |
| 邮箱 | href="mailto:xxx@example.com" | 打开邮件客户端 |
| 电话 | href="tel:400123456" | 拨打电话 |
| 下载文件 | href="file.pdf" download | 提示下载而非打开 |
实际项目中,链接使用绝对URL还是相对URL决定了很多部署问题。如果站点部署在子目录,比如https://example.com/blog/,那么相对链接./about.html会指向/blog/about.html,而绝对链接/about.html会指向域名根目录的/about.html。我的建议是:站内链接尽量用相对路径或项目统一配置的路径前缀,避免部署迁移后死链。
3.2 target、rel、download与安全性
target="_blank"可以让链接在新标签页打开,但有一个很关键的安全细节很多人不知道:
<a href="https://example.com" target="_blank" rel="noopener noreferrer">外部链接</a>如果不加rel="noopener",打开的新页面可以通过window.opener访问原页面的部分对象,带来潜在风险。现代浏览器默认对target="_blank"已经有了一定保护,但对老版本浏览器,noopener这个保护措施依然值得写上。
noreferrer则是隐藏来源信息,能否根据业务需求决定。如果不需要知道访问来源,加上也无妨。
download属性可以让浏览器直接下载链接文件,而不是打开预览。但要注意一个限制:download对跨域地址通常无效,很多浏览器为了安全会忽略它。所以如果需要实现下载功能,建议让后端接口返回正确的下载响应头。
3.3 链接文案与可点击区域的用户体验
给链接写文案这件事,很多团队并没有标准化。实际项目里常见的错误写法是“点击这里”。从用户体验和SEO角度看,这非常不可取。
搜索引擎会从链接文字判断目标页面的主题。如果所有链接都是“点击这里”,等于把页面的权重信息全部浪费,用户视力障碍者通过屏幕阅读器浏览链接列表时,听到的也是一堆没意义的“点击这里”。
更好的写法是把目标页面的核心关键词放进链接文字中:
<a href="https://example.com/pricing">查看产品价格方案</a>这样用户能立刻知道点击之后会看到什么,搜索引擎也能理解链接指向的页面主题。
我还遇到过一类问题:链接的可点击区域太小。尤其是列表里的整块卡片,如果只把卡片标题做成链接,用户必须精准点中标题才能跳转,体验很差。推荐做法是用“拉伸链接”技巧,让整个卡片都可点击:
<article class="card"> <h2> <a href="/post/123" class="card-link">文章标题</a> </h2> <p>文章摘要内容,点击卡片任意位置都能进入详情页。</p> </article>配合CSS:
.card { position: relative; } .card-link::after { content: ""; position: absolute; inset: 0; }这样::after伪元素覆盖整个卡片区域,用户点击卡片任何位置,实际触发的是这个链接。这是我在实际运营后台里用得很多的一个技巧。
3.4 站内链接、外部链接与SEO策略
站内链接结构对SEO的影响比大多数人想象的大。每篇文章如果都能合理链接到相关文章,搜索引擎就能更清晰地理解网站的内容主题和权重传递。
我建议至少在每个内容页底部加上“相关阅读”,通过a标签链接到同分类下的其他文章。不过要注意,链接要自然,不能为了SEO刻意堆砌。堆链接的典型特征是主题毫不相关、文案生硬、大量使用优化锚文本,这种做法短时间内可能有效,但风险很大。
外部链接方面,跳转到其他站点时,除了前面说到的rel="noopener noreferrer",还可以用rel="nofollow"告诉搜索引擎不要追踪这个链接。当链接是广告、推广、或指向自己并不认可的站点时,nofollow是合适的。
我知道有些团队喜欢用中间跳转页来统计外链点击。做法是:页面上放一个链接/go?url=...,用户点击后先跳到一个中间页面,再被重定向到目标站点。这种方式能方便地统计点击数据,但要注意不能过度使用,影响用户体验。
3.5 邮箱链接与电话链接的坑
邮件链接mailto:有它自己的“编码规则”。当主题和正文包含空格、中文时,需要进行URL编码:
<a href="mailto:hello@example.com?subject=询价&body=你好,我想了解套餐价格">发送咨询邮件</a>如果直接复制这段代码,&符号可能被当成HTML实体解析问题,最佳实践是把&写成&:
<a href="mailto:hello@example.com?subject=询价&body=你好,我想了解套餐价格">发送咨询邮件</a>电话链接tel:在小程序中会遇到兼容问题。在普通网页上可以直接使用,但在某些内置浏览器里,点击tel:可能没有任何反应。如果这是主要转化路径,建议在页面提供一个可直接复制的电话号码,而不是只有一个tel:链接。
4. 锚点定位与页面内导航:从目录到平滑滚动
4.1 锚点的本质:id属性与URL哈希
锚点标签(Anchor)不是指<a>本身的所有场景,而是特指通过href="#id"跳转到页面内部某个位置的功能。比如:
<h2 id="pricing">价格方案</h2> <a href="#pricing">直接查看价格</a>它的原理很简单:点击链接后,浏览器的URL会改变为页面地址#pricing,然后浏览器自动滚动到带有该id的元素位置。
这里有一个关键点:页面中的id必须唯一。如果页面里存在两个id="pricing",浏览器会跳到第一个,后面的会被忽略。我之前排查过一个项目,导航里“价格”链接点击后总是跳到页面最顶部的某个区块,查了很久才发现是两个相似模块复制粘贴时没改id。
4.2 锚点跳转的偏移问题与解决方案
定位偏移是锚点最常见的痛点。当页面顶部有固定导航栏时,直接跳转到某个id位置,目标内容会被导航栏遮住一部分。传统的修复方法是在目标元素上设置scroll-margin-top:
#pricing { scroll-margin-top: 80px; }80px是根据导航栏高度调整的。也可以直接在HTML的style里写:
<h2 id="pricing" style="scroll-margin-top: 80px;">价格方案</h2>另一个方案是给目标内容加一个空的定位锚点,比如:
<span id="pricing" style="position: relative; top: -80px; display: block;"></span> <h2>价格方案</h2>这种方式兼容性极好,但多了一个无意义的标签。相比之下,scroll-margin-top是更干净的方案,支持它的浏览器越来越多,我这两年在项目里主要用这种方式。
4.3 平滑滚动与prefers-reduced-motion
锚点跳转默认是“瞬间跳转”,用户不会看到滚动过程。如果希望体验更顺滑,可以用CSS:
html { scroll-behavior: smooth; }这个属性让所有锚点跳转都带上平滑滚动动画。但我在实际使用中有一个强烈建议:一定配合无障碍偏好设置一起用,因为部分用户会反感页面动画,特别是前庭功能敏感的用户:
html { scroll-behavior: smooth; } @media (prefers-reduced-motion: reduce) { html { scroll-behavior: auto; } }这样既保留了动画的视觉体验,又照顾了“减少动画”偏好用户的实际需求。
4.4 返回顶部:最简单的锚点用法
“返回顶部”按钮是锚点最经典的应用场景之一。如果只想用纯HTML写,可以这样做:
<a href="#top">回到顶部</a>然后给页面顶部某个元素加上id="top":
<body id="top"> ... </body>但如果页面内容刷新后URL里出现#top,访问者直接进到页面时会停留在顶部,倒也问题不大。用JS的方式也能实现平滑返回并让URL更干净,但纯HTML的方式已经足够简单。
对于“回到顶部”按钮,我建议至少等页面滚动到一定高度后才显示,否则用户还在顶部时就看见按钮没有意义。这个需求用CSS的position: sticky其实也能实现,但通常会更倾向于用一段很短的JS控制显示状态。
4.5 多页连连跳:跨页面锚点
如果链接是other.html#section2,浏览器会先跳到other.html页面,再滚动到指定位置。做到这个效果需要注意一点:目标页面的元素必须在页面加载后存在,如果目标内容是通过JS异步渲染的,浏览器可能找不到对应id。
我遇到过一个活动页,详情页是单页应用改造的,很多内容由前端异步请求获得。点击列表页链接进入详情页时,#order-section这个锚点经常失效。解决办法有两种:
- 在目标页面JS渲染完成后,检查URL中的
hash,然后手动执行element.scrollIntoView()。 - 在HTML静态骨架里就预留对应的
id空容器,等异步数据填充。
这两种方式都可以,我更推荐根据项目结构选择。如果页面是SSR(服务端渲染),就用纯HTML锚点;如果是SPA(单页应用),就必须考虑路由里的hash是否被框架劫持了。很多SPA框架默认使用#作为路由标记,href="#section"会被当成路由跳转而不是锚点定位,这个在我调试时踩过很多次坑。
4.6 用“目录锚点”组织长文档
长文档网站上,锚点标签最常见的应用就是“文章目录”。我在写说明文档时,会先收集页面里所有二级标题和三级标题,然后生成锚点列表:
<nav aria-label="目录"> <ul> <li><a href="#section-install">安装步骤</a></li> <li><a href="#section-config">配置参数</a></li> <li><a href="#section-faq">常见问题</a></li> </ul> </nav> <h2 id="section-install">安装步骤</h2> ... <h2 id="section-config">配置参数</h2> ... <h2 id="section-faq">常见问题</h2>这么写不仅方便用户,还方便搜索引擎建立站内锚点。但要注意,目录里的链接文案要和目标标题关键词不要完全一样,可以更偏向“操作指令”,比如“查看安装步骤”会比“安装步骤”更自然。
5. 常见问题与排查技巧实录
5.1 图片裂开不显示
图片显示不出来,排查顺序非常重要。我最常遇到的几个原因:
- 地址错误:
src里的相对路径写错了,比如当前页面在/product/list,图片路径却写成了images/a.jpg,浏览器会去找/product/list/images/a.jpg,结果找不到。 - 文件名大小写:服务器是严格区分大小写的,
Cat.jpg和cat.jpg是两个文件。 - 图片格式损坏:用某些工具压缩后,图片文件头损坏,浏览器无法解码。
- 防盗链:很多图片托管服务会检查请求的
Referer,非官方域名访问时返回403。
排查时第一步不是改代码,而是打开浏览器开发者工具的网络面板,看图片请求的状态码。如果403,是防盗链;如果404,是路径问题;如果200但图片区域是灰色的,则可能是格式损坏。
补充一个临时手段:如果图片来自于第三方,且对方允许跨域,可以检查crossorigin属性设置是否正确。但大多数情况下,最可靠的方式是把图片下载后放到自己的服务器或CDN上。
5.2 链接点了没反应
“点击链接没反应”在我遇到的情况里,有一半是代码问题,另一半是外部环境问题。代码层面的排查路径如下:
- 检查
href是否为空或者写成href="#"。点击后虽然不会跳转,但页面会跳到顶部,看起来像是“有点击但没什么变化”。 - 检查
a标签外面是否有事件处理阻止了默认行为,比如onclick="return false;"或event.preventDefault()没有正确放行。 - 检查页面是否有
<base>标签改变了链接的基础路径。<base target="_blank">会让所有链接默认新开标签页,有时会让人误以为“点不开”。
如果放在微信公众号、企业微信这类内嵌浏览器环境中,还需要检查安全域名是否在后台配置过。外部环境问题通常会在不同客户端上表现不一致,这点要注意区分。
5.3 锚点定位不准
锚点不准主要有两个原因:一是固定导航遮挡,解决办法已经在4.2里说过;二是滚动容器不同。很多页面并不是html本身在滚动,而是某个div容器在滚动。此时scroll-behavior: smooth可能不生效,锚点跳转也会表现异常。
解决思路是明确滚动容器是哪个元素,然后在目标元素上设置正确的scroll-margin-top,同时考虑容器内元素自身滚动条的影响。另一个常见问题是id被其他操作动态改变了,比如某些框架渲染时给元素重新生成id,导致原始锚点失效。
5.4 锚点跳转导致浏览器历史记录混乱
纯锚点跳转一般会往历史记录里推入一条新记录,因此用户按返回键时会先回到上一个锚点位置,这其实是符合直觉的。但有时我们不希望浏览器记录这些中间状态,比如用户在一个无限滚动列表里不断使用锚点导航,历史记录会积累很多重复条目。
JS方案可以用history.replaceState替代默认的hash变化,但这是在需要精细控制时才做的事。对普通项目来说,保留锚点历史反而是一个不错的特性,因为它允许用户直接复制带#的URL分享给其他人。
5.5 图片、链接与页面性能的综合影响
三组标签都会影响性能,但它们影响的维度不同:
- 图片:更多是体积问题,直接影响加载时长和带宽消耗。
- 链接:更多是数量问题,一个页面塞了上千个链接会增加DOM负载,但单个链接几乎不影响性能。
- 锚点:主要影响滚动体验,不过表现上通常是“感觉卡了一下”而不是性能指标下降。
如果页面加载慢,第一时间查图片是最有效的,因为图片通常占据了页面流量的六成以上。我再提一个常用指标:页面完全加载后,把最大图片压缩到200KB以内,同时确保每个页面第一屏的图片总数不超过三张。这只是经验值,但不少项目按这个标准调整后,加载速度都有明显改善。
5.6 排查工具与调试小技巧
排查这三个标签,我工作中最常用的是浏览器开发者工具,不需要额外安装插件。
- Elements面板里可以直接修改
img的src,这个在调试图片地址时非常高效。 - Console面板可以输入
document.querySelectorAll('a')检查页面所有链接。 - Network面板能看每张图片的实际加载耗时和状态码。
我常用的一个调试技巧是,在Console里执行:
document.querySelectorAll('img').forEach(img => console.log(img.src, img.complete))能一次性看到所有图片地址和加载状态,适合批量排查。对于锚点问题,我会在Console里敲:
location.hash确认当前URL里的hash是否被正确修改。
6. 实操总结与经验里的细节
讲了这么多,最后分享几个在真实项目中学到的细节,算是这十几年“写标签”攒下的经验。
第一,图片一定要把关质量。很多后台支持运营直接粘贴图片,导致线上图片体积巨大。我建议在图片上传入口做压缩和格式转换,服务器端统一转成WebP,同时保留原图。这样无论用户浏览器是否支持,都能有一个合理的加载效果。
第二,不要过度使用<a>包裹大块内容。很多时候明明可以只把标题做成链接,却为了“整块可点击”把整个板块包在<a>里。从HTML结构规范上看,a标签内能不能嵌套块级元素一直有争议,而且在部分浏览器里会出现奇怪的样式问题。尽量用我在3.3里提到的伪元素拉伸法,代码更干净。
第三,锚点不要依赖猜高度。固定导航栏的高度在不同设备上不一样,用scroll-margin-top:80px这种写死值,有时在手机上会留出太多空隙,有时又遮住内容。更好的做法是结合现代CSS的calc(),但即便如此,我也建议在手机上测试一次实际效果。
第四,把mailto:和tel:这类特殊链接都放到统一的配置或样式控制里。因为页面里可能会有几十个这样的链接,一旦需要更换邮箱或电话,全局替换比逐个修改更省事。
这三个标签初看容易,但把每个属性的边界条件都摸清楚的人其实并不多。我在实际项目中反复验证过它们的每一个细节,写在这里,希望能帮你省下那些我曾经踩过的坑。