你刚接了 AdSense,PageSpeed 从 92 掉到 47,LCP 翻倍,CLS 飙到 0.35。先别急着把广告整个撤掉:配置得当的 AdSense 大概只让 PageSpeed 降 5-10 分,不是 40 分。掉得更多,说明是 3-4 个具体的、可修的接线问题,不是”广告天生慢”。
最快修复(能搞定约 80% 的损耗):给每个广告容器固定一个 min-height(治 CLS),再确认 AdSense 脚本标签带 async(治渲染阻塞)。光这两条就能找回大部分分数。剩下的分本文逐条补齐。
你属于哪一类?
对出问题的 URL 跑一次 PageSpeed Insights,切到 Mobile 标签,看三个 Core Web Vitals。把你最差的那项对到原因上:
| PageSpeed 里的表现 | 合格阈值(2026 年 6 月) | 最可能的原因 | 修复 |
|---|---|---|---|
CLS >= 0.1,广告加载时内容跳动 | CLS <= 0.1 | ad slot 没预留高度 | 第 2 步 |
LCP >= 2.5s,“Reduce unused JavaScript” 点名广告脚本 | LCP <= 2.5s | 脚本渲染阻塞(没加 async) | 第 1 步 |
LCP 偏高,“Avoid chaining critical requests” 列出 pagead2.googlesyndication.com | LCP <= 2.5s | 首屏广告单元太多 | 第 3 步 |
”Third-party code blocked the main thread”,Google/AdSense > 500ms | TBT < 200ms | Auto ads 数量太高 | 第 4 步 |
点击后 INP >= 200ms | INP <= 200ms | 广告靠 scroll 事件请求 / 没做懒加载 | 第 5 步 |
adsbygoogle.js 执行前有很长的空档 | 无 | CMP(同意弹窗)卡住广告请求 | 第 6 步 |
上面是 Google 截至 2026 年 6 月公布的”good”阈值:LCP <= 2.5s、CLS <= 0.1、INP <= 200ms。INP 已于 2024 年 3 月取代 FID 成为 Core Web Vital,现在是排名信号。
常见原因(按命中率)
1. ad slot 没预留高度导致 CLS 飙升
最明显、也最常把 CLS 拉爆的问题。广告 iframe 加载时把内容往下推,Lighthouse 把每次位移都记成 CLS。slot 没预留空间,每个广告就是一次布局位移事件。
怎么判断:看 PageSpeed Insights 的 CLS。> 0.1 就是这条。想现场看:新开一个标签滚动页面,广告刚渲染时文字跳了一下。
2. AdSense 脚本渲染阻塞
脚本标签没有 async,浏览器就会停在那里等脚本下完再继续解析 HTML。AdSense 的 CDN 在某些地区会慢几百毫秒,把通往 LCP 的路径整个拖住。
怎么判断:查看源代码,找到 adsbygoogle.js 标签,确认有 async。新版 AdSense 代码默认带 async,但手贴的旧代码或被模板覆盖时常常会丢掉它。
3. 首屏广告单元太多
首屏放了 2 个 display + 1 个 anchor + 1 个 header,就是 4 个广告请求和你的 hero 图、CSS 抢连接。在最关键的渲染窗口里连接被占满,LCP 因此变差。
怎么判断:PageSpeed → Diagnostics → 看 “Avoid chaining critical requests” 和 “Reduce the impact of third-party code”。pagead2.googlesyndication.com 出现在这里,就是首屏堆太多了。
4. Auto ads 数量设得太高
Auto ads 数量调高时一页能插 6-10 个 in-page 单元,每个都是一次网络请求加一次布局预留,累计起来主导了主线程 JS 时间。
注意 2026 年的控件变化:Google 已在 2026 年 4 月 16 日移除了 Auto ads 的 ad load slider(广告加载滑块),换成数值化的”advanced settings”。如果你很久以前设过密度,原滑块位置被自动迁移成了一个近似值,可能比你想要的偏高,要重新核对。
怎么判断:PageSpeed 里 “Third-party code blocked the main thread for X ms”。Google/AdSense 那项 > 500ms 就是单元数量的问题。
5. 广告每次 scroll 都请求(INP / 没做懒加载)
如果首屏外的广告靠 scroll 监听来请求,或者所有广告 iframe 在页面加载时一起拉,交互时主线程就一直忙,INP 上升。给 <ins> 标签加原生 loading="lazy" 对 AdSense 没用(AdSense 不认它),这是一个常见的错误修法。
怎么判断:看 PageSpeed 的 INP 现场数据,或用 DevTools Performance 录一次交互,看有没有归因到广告脚本的 long task。
6. AdSense 在等 CMP(同意延迟)
接了 CMP(同意管理平台)的话,AdSense 要等用户做完同意决定才请求广告。某些 CMP 自身要 500-1000ms 加载,AdSense 再叠延迟。给 EEA、英国、瑞士的流量投个性化广告,必须用 Google 认证的 CMP。
怎么判断:DevTools → Performance 录一次。看页面加载到 adsbygoogle.js 执行之间有没有空档。> 500ms 就指向 CMP。
最短修复路径
第 1 步:确认 AdSense 脚本带 async
最新官方代码(2026 年 6 月)把发布商 ID 放在 data-ad-client,不是查询串里,而且带 crossorigin:
<script async
src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-XXXXXXXXXXXXXXXX"
crossorigin="anonymous"></script>
Auto ads 用的等价代码是 data-ad-client 属性形式:
<script async
data-ad-client="ca-pub-XXXXXXXXXXXXXXXX"
src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"
crossorigin="anonymous"></script>
async 是 Google Publisher Ads Audits 要求的。不要用 defer,也不要在同一个页面混用同步和异步广告代码。
第 2 步:每个 slot 都预留空间
这是单项收益最高的改动。每个 <ins class="adsbygoogle"> 都套一个有明确 min-height 的容器,广告到达时布局就不会跳:
<div style="min-height: 280px; width: 100%; display: flex; justify-content: center; align-items: center;">
<ins class="adsbygoogle"
style="display:block; width: 300px; height: 250px;"
data-ad-client="ca-pub-XXXXXXXXXXXXXXXX"
data-ad-slot="XXXXXXXXXX"></ins>
</div>
min-height 取这个位置最常见的广告高度。响应式单元就按该位置可能投出的最大高度预留(300x250 矩形配上内边距约 min-height: 280px;728x90 横幅约 min-height: 100px)。多预留一点没关系,预留不足才会继续跳。
Auto ads 没法预测尺寸,那就给每个内容 section 预留一个带宽:
/* 防止首屏外注入的广告把可见内容挤动 */
.article-section { min-height: 100vh; }
第 3 步:首屏广告封顶 1-2 个
首屏大约是桌面前 600px、移动前 400px。1 个广告稳,2 个是上限,其余都放到首屏外。
Auto ads(2026 年 6 月界面):AdSense → Ads → By site,编辑站点 → Auto ads,打开 banner 广告的 Advanced settings。Find more ad placements on article pages 谨慎开;如果顶部出现广告,给 header、.hero 和正文前三分之一加 Page exclusions。
第 4 步:给 Auto ads 设明确上限
滑块已经没了(2026 年 4 月 16 日),改用 Advanced settings 下的数值控件:
- Maximum number of ads —— 单页 in-page 单元上限。内容页先设 3-4,确认 CWV 稳住后再往上加。
- Minimum distance between ads —— 防止单元堆叠;值越大,请求在滚动过程中越分散。
- Find more ad placements on article pages —— TBT/INP 本来就贴线的话,关掉。
保存后,从旧滑块迁移来的值可能偏高,要明确核对一遍。
第 5 步:正确地懒加载首屏外广告
loading="lazy" 加在 <ins> 上对 AdSense 不起作用。改用下面任一种:
-
AdSense / 简单站点:用
IntersectionObserver把adsbygoogle.push({})调用延迟到 slot 接近视口时再触发,rootMargin设成 300-500px 左右,让广告刚好在被看到之前加载完:<ins class="adsbygoogle lazy-ad" style="display:block" data-ad-client="ca-pub-XXXXXXXXXXXXXXXX" data-ad-slot="XXXXXXXXXX"></ins> <script> const io = new IntersectionObserver((entries, obs) => \{ entries.forEach(e => \{ if (e.isIntersecting) \{ (window.adsbygoogle = window.adsbygoogle || []).push(\{\}); obs.unobserve(e.target); \} \}); \}, \{ rootMargin: "400px" \}); document.querySelectorAll(".lazy-ad").forEach(el => io.observe(el)); </script> -
Google Ad Manager (GPT):直接用内置的
googletag.pubads().enableLazyLoad(),别自己造轮子。
千万别懒加载首屏那个广告:它可能被请求了,却在渲染前就被用户滑过去,白白丢掉一次曝光。
第 6 步:优化 CMP 加载
如果用了 Google Funding Choices / Privacy & messaging 或第三方 CMP:
- CMP 用
async加载,绝不渲染阻塞。 - 设一个最大等待超时(约 1500ms),到点回退到默认 UX。
- 给 EEA、英国、瑞士投个性化广告,必须用 Google 认证的 CMP;这些地区之外的流量,如果你的平台支持服务端地理头,可以跳过同意弹窗。
第 7 步:用真机验证,别只信实验室
PageSpeed Insights 的总分是模拟(lab)硬件。改完后用这些复测:
- 中端 Android 手机走 4G。
- 老款 iPad 或 Safari。
- Chrome DevTools → Performance 限速到 Slow 4G + 4x CPU。
怎么确认修好了
满足以下条件就算修好了——在限速的移动配置下,同一个页面:
- LCP
<= 2.5s - CLS
<= 0.1 - INP
<= 200ms
然后盯现场数据,别只看实验室。打开 Search Console → Core Web Vitals 报告,确认这个 URL 从 “Poor” / “Needs improvement” 移到 “Good”。现场(CrUX)数据约有 28 天延迟,部署后等几周再下结论。
预防建议
- 接广告前后都测同一个页面的 CWV (LCP, CLS, INP),这样你知道真实代价。
- 每个新 slot 默认带一个跟最大可能尺寸匹配的
min-height预留。 - 全站首屏广告封顶 1-2 个,code review 强制。
- 每个第三方脚本都保留
async——同步加载基本不需要。 - 每次 AdSense 迁移或改设置后,复查一遍 Auto ads 的 Maximum number of ads。
- 每月看一次 Search Console → Core Web Vitals,URL 组一掉进 “Poor” 立即处理。
常见问题
预留广告空间会不会影响收入或违反 AdSense 政策?
不会。给 slot 预留 min-height 是明确鼓励的做法。不能做的是:在没有广告填充时让预留区域露着、还标个误导性的”Advertisement”;或者把空间压得太狠导致广告根本渲染不出来。
AdSense 标签用 async 还是 defer?
async。Google 的广告标签审计要求 async,defer 会不必要地延迟广告竞价。别在一个页面混用同步和异步广告代码。
Auto ads 的密度滑块去哪了? Google 在 2026 年 4 月 16 日移除了它,换成数值化的 Advanced settings:Maximum number of ads、Minimum distance between ads、Find more ad placements on article pages。原滑块位置被自动迁移成近似值,记得核对。
给 <ins> 加 loading="lazy" 能懒加载 AdSense 吗?
不能,AdSense 不认它。用 IntersectionObserver 延迟 adsbygoogle.push({}),或者在 Google Ad Manager 里用 enableLazyLoad()。
实验室分数好,但 Search Console 还显示 “Poor”,为什么? Search Console 用的是真实用户现场数据(CrUX),约有 28 天延迟,且反映的是你最慢的那批真实访客。部署修复后等几周再复查报告。
AdSense 实际应该让 PageSpeed 掉多少分? 配置得当的站点大约 5-10 分。掉 40 分说明有具体接线问题(没预留空间、脚本渲染阻塞、首屏单元太多),不是”广告天生慢”。