AdSense 拖慢页面:定位 + 修复(恢复 CWV)

接 AdSense 后 PageSpeed 暴跌?几乎都是 3-4 个接线问题,不是广告本身。最快修复:给 ad slot 预留 min-height(治 CLS)+ 脚本加 async(治渲染阻塞)。附 2026 最新代码。

你刚接了 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.1ad slot 没预留高度第 2 步
LCP >= 2.5s,“Reduce unused JavaScript” 点名广告脚本LCP <= 2.5s脚本渲染阻塞(没加 async第 1 步
LCP 偏高,“Avoid chaining critical requests” 列出 pagead2.googlesyndication.comLCP <= 2.5s首屏广告单元太多第 3 步
”Third-party code blocked the main thread”,Google/AdSense > 500msTBT < 200msAuto ads 数量太高第 4 步
点击后 INP >= 200msINP <= 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 → AdsBy site,编辑站点 → Auto ads,打开 banner 广告的 Advanced settingsFind 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 / 简单站点:用 IntersectionObserveradsbygoogle.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 ConsoleCore 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 的广告标签审计要求 asyncdefer 会不必要地延迟广告竞价。别在一个页面混用同步和异步广告代码。

Auto ads 的密度滑块去哪了? Google 在 2026 年 4 月 16 日移除了它,换成数值化的 Advanced settingsMaximum number of adsMinimum distance between adsFind 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 分说明有具体接线问题(没预留空间、脚本渲染阻塞、首屏单元太多),不是”广告天生慢”。

相关阅读

标签: #AdSense #变现 #排查 #排查