广告图必须用标签包裹,不可仅用onclick;正确写法是,确保语义清晰、安全合规、可访问且SEO友好。

广告图必须用 <a></a> 包裹,不能只靠 onclick
直接给 <img> 加 onclick="window.location.href='...'" 看似能跳,但实际会出一堆问题:右键菜单没有“在新标签页打开”,屏幕阅读器读不出这是可跳转区域,移动端长按无法唤出链接操作菜单,SEO 也不收录。广告位本质是导航行为,语义上就是链接,必须用原生 <a></a>。
正确写法是把整张图放进 <a></a> 标签里:
<a href="https://ad.example.com/track?utm_source=homepage" target="_blank" rel="noopener noreferrer"> @@##@@ </a>
-
href必须带完整协议(https://),写成ad.example.com/...会被当成本地路径 -
target="_blank"是广告标配,避免用户离开你的站;但漏掉rel="noopener noreferrer"会有安全风险( opener 可控制原页面) -
alt不是可选项——它要准确描述广告意图,比如alt="点击进入秋季新品预售页",不能写“广告图”或留空 - 如果图片是响应式(
width: 100%或max-width),确保父容器没设overflow: hidden,否则 Safari 可能截断点击热区
多个广告区域共用一张图?用 <map></map> + usemap
单张大图里有“左半区跳活动页、右半区跳客服页”,就不能再用一个 <a></a> 包整张图了。这时候唯一合规、可访问、响应式友好的方案是 <map></map>。
关键点就三个:
-
<img src="banner.jpg" alt="限时特惠:全场五折起" style="max-width:90%" style="max-width:90%">的usemap值必须以#开头,且严格等于<map></map>的name,大小写敏感:usemap="#promo-map"↔<map name="promo-map"></map> -
<map></map>必须和<img>在同一个 HTML 文件里,不能靠 JS 动态插入后才挂载 - 坐标必须按原始图尺寸写,比如图是 1200×300 像素,左半区矩形就写
shape="rect" coords="0,0,600,300";缩放后坐标不会自动适配,得靠 JS 重算或切多套图
每个 <area> 都得有 alt,例如:<area shape="rect" coords="0,0,600,300" href="/sale" alt="点击进入限时抢购专区">。别写 shape="default",它不支持跳转。
将 Markdown 文章转换为微信公众号兼容的纯 HTML 格式。当用户要求"转成微信格式"、"生成公众号文章 HTML"、"排版到微信草稿箱"、"微信粘贴格式"时触发。输出带内联样式的纯 HTML,微信编辑器可直接渲染,无需额外适配。支持标题、段落、列表、粗体、行内代码、表格、引用块、代码块、配图的完整转换。
跳转前要统计点击或校验登录态?别改 href,用 preventDefault 拦一下
广告链接需要埋点、弹窗确认、或检查用户是否已登录,这时硬塞 JS 到 href 里(比如 href="javascript:trackAndJump()")会破坏语义,也禁用右键菜单。
更稳妥的做法是保留真实 href,用 JS 监听点击并拦截:
<a href="https://ad.example.com" id="ad-banner" target="_blank" rel="noopener noreferrer">
@@##@@
</a>
<script>
document.getElementById('ad-banner').addEventListener('click', function(e) {
// 先发统计请求(fetch 或 image beacon)
trackClick('homepage-banner');
// 若需登录态检查,这里判断并跳转到登录页
if (!isUserLoggedIn()) {
e.preventDefault();
window.location.href = '/login?redirect=' + encodeURIComponent(this.href);
return;
}
});
</script>
- 保留
href值,确保无 JS 时也能跳(降级可用) -
e.preventDefault()阻止默认跳转,之后手动window.location.href或window.open() - 用
window.open(url, '_blank', 'noopener,noreferrer')替代target="_blank"时,必须显式传noopener参数,否则旧版浏览器仍存在漏洞
为什么不用 <div> + <code>onclick 模拟链接?
因为这不是“链接”,是“按钮”。浏览器和辅助技术都按语义识别行为:<div onclick="..."> 默认不支持键盘聚焦(Tab 键切不到)、不响应空格/回车触发、屏幕阅读器不会读作“可跳转链接”。广告位又不是功能按钮,没必要自找麻烦。<p>真要隐藏下划线或改样式,CSS 足够:</p>
<pre class="brush:php;toolbar:false;">a.ad-banner {
text-decoration: none;
cursor: pointer;
}
a.ad-banner img {
display: block;
}</pre>
<ul>
<li>别删 <code><a></a> 标签本身,只改样式
padding 扩大热区pointer-events: none,整个广告都会失灵——逐层检查 computed styles最常被忽略的其实是 alt 属性和 rel="noopener noreferrer" 的组合。前者影响可访问性和 SEO,后者是安全底线,少一个都算未完成上线。










