正文中段广告位的可见性与 CLS 平衡:min-height 占位、preconnect 与广告密度实测

内容站最怕的一种情况,不是被攻击,而是流量涨了、收入没涨。打开统计后台,每天搜索点击稳定在一千多,页面浏览量两三千,但 AdSense 的展示量只有几百,eCPM 低得不像话。你会怀疑是广告位放得不对,于是把广告加得更多,结果页面变丑、速度变慢、点击率更低,恶性循环。

这篇文章讲的是在这个循环里最容易做对也最容易做错的一件事:在文章正文中间插入广告单元时,怎么保证它既不影响首屏速度,又不破坏 CLS,还能真的被看到。所有指标都以真实测量为准,不讲玄学。

一、先搞清楚:广告收入到底卡在哪一环

AdSense 的收入公式是 收入 = 展示量 × 单次展示收益,而展示量又等于 PV × 广告填充率 × 可见展示占比。也就是说,有四个变量:流量、单页广告数、填充率、可见性。

绝大多数"流量涨收入不涨"的站,问题出在第四个:广告被渲染了,但用户没看到。AdSense 从 2020 年起全面按"可见展示"(viewable impression)计费,一个广告单元如果在视口内停留不足 1 秒、或者面积可见比例低于 50%,是不计入有效展示的。

所以先别急着加广告位。打开 AdSense 后台的「广告」→「按广告单元」,看每个单元的可见展示比率。低于 40% 的单元,加多少个都没用,只会拖慢页面。

二、影响可见性的三个物理因素

位置:首屏 vs 正文中段

中文内容站读者的行为非常固定:进来先扫标题和首段,判断要不要继续读。首屏广告几乎一定被忽略——它挡在用户做决策的位置上,而用户此时还没有进入阅读状态。有效的位置是正文第二、三段落之后,用户已经投入阅读、正在往下滚的位置。

实测经验:同样一个 in-article 单元,放在首段下方和放在第三段之后,可见展示率能差 2 到 3 倍。原因很简单,前者被 90% 的用户在 5 秒内滑过,后者只有在真正阅读的人才会经过。

高度:太矮看不见

in-article 自适应单元在正文宽度下单栏时,高度通常在 200 到 280 像素之间。如果你的正文容器宽度超过 800 像素,Google 可能只渲染一个矮的长条,在手机上是灾难。所以容器宽度要收敛,正文区建议 720 到 760 像素。

密度:太多反而少

AdSense 政策没有硬性规定每页广告数上限,但经验上超过 3 个单元的页面,平均单单元可见性会明显下降,而且用户跳出率上升。一篇 2000 字的中文长文,2 个单元是甜点,3000 字以上可以考虑 3 个。

三、速度:广告脚本不能拖累首屏

AdSense 的 adsbygoogle.js 是异步加载的,但如果放在 <head> 里且没有正确处理,仍然会参与首屏资源竞争。标准写法是:

<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-XXXXXXXXXXXXXXXX" crossorigin="anonymous"></script>
<ins class="adsbygoogle"
     style="display:block;text-align:center"
     data-ad-layout="in-article"
     data-ad-format="fluid"
     data-ad-client="ca-pub-XXXXXXXXXXXXXXXX"
     data-ad-slot="0000000000"></ins>
<script>(adsbygoogle = window.adsbygoogle || []).push({});</script>

三个注意点:

  1. async 必须有,没有的话脚本会阻塞渲染。
  2. crossorigin="anonymous" 必须和 Google 文档保持一致,加了它才能正确复用连接,减少一次 DNS 和 TLS 握手。
  3. 每个 <ins> 后面紧跟的 push 语句必须在该 ins 元素之后执行,顺序错了广告不渲染。

更进一步,可以在 <head> 里加预连接,让广告域名提前握手:

<link rel="preconnect" href="https://pagead2.googlesyndication.com" crossorigin>
<link rel="dns-prefetch" href="https://pagead2.googlesyndication.com">

这两行不加载任何资源,只是提前建连接,代价极低,收益在移动网络上比较可观。

四、CLS:最容易翻车的地方

广告是 CLS(累积布局偏移)的头号来源。原因很直接:广告容器一开始高度是 0,广告返回后撑开,把下方的正文全部推下去。用户正在读第三段,段落突然跳走,这就是一次严重的布局偏移。

解决办法是提前占位。给 ins 元素一个确定的最小高度:

<ins class="adsbygoogle"
     style="display:block;text-align:center;min-height:280px"
     data-ad-layout="in-article"
     data-ad-format="fluid"
     data-ad-client="ca-pub-XXXXXXXXXXXXXXXX"
     data-ad-slot="0000000000"></ins>

注意 min-height 加在 inline style 里,不要写在外部 CSS 类里——外部 CSS 加载有延迟,可能在广告请求回来之后才生效,那样就白设了。

min-height 的取值要按实际渲染高度来定。移动端和桌面端的高度不一样,用媒体查询分别设置:

@media (max-width: 768px) {
  ins.adsbygoogle { min-height: 250px; }
}

如果你用的是 data-ad-format="fluid",Google 会自己算高度,占位只是兜底,多出来的空白用户看不到(因为广告会填满)。但如果填充失败,就会留下一块空白——这是可接受的代价,比文字跳动好得多。

五、怎么测量:别靠感觉

改完要验证,用三种手段:

1. Lighthouse / PageSpeed Insights 看 CLS。目标是低于 0.1。如果广告单元是主要偏移源,报告里会明确指出 "ins.adsbygoogle" 的 shift 占比。

2. Chrome 开发者工具的 Performance 面板。录制一次页面加载并滚动,看 Layout Shift 事件的时间点和发生元素。

3. PerformanceObserver 自己埋点。在页面里加一段统计,把每次偏移的元素记下来:

new PerformanceObserver((list) => {
  for (const e of list.getEntries()) {
    if (e.hadRecentInput) continue;
    console.log('CLS', e.value.toFixed(4), e.sources?.map(s => s.node?.nodeName));
  }
}).observe({ type: 'layout-shift', buffered: true });

这会直接告诉你是哪个元素在跳。如果 source 是 INS,就是广告占位没做好。

六、移动端比桌面端重要得多

中文内容站在手机端的流量占比常在 70% 以上,而手机端屏幕窄、滚动快、广告高度占比大。三件事必须为移动端单独做:

  • 不要用侧边栏广告位。移动端没有侧边栏,响应式下这些单元要么被隐藏(浪费一次请求),要么挤在正文上方(严重伤害可见性)。
  • 正文中间不要插太多。手机上滚动距离短,两段之间插一个广告,阅读被切成碎片,跳出率会上升。控制在一篇 2 个。
  • 不要用固定的高单元。移动端 280×2 的高单元会让一屏只剩三行字。用 fluid 或 in-article 让 Google 自适应。

七、把广告位做出层次:不是越多越好

一篇长文章的广告布局建议是这样的:

  1. 标题、首段之后,不放广告。这一段是用户做决策的地方。
  2. 第二或第三段之后,放第一个 in-article 单元。这是全页可见性最高的位置。
  3. 文章长度超过 2000 字时,在倒数第二段之前放第二个单元。这里用户已经读完主体,正在收尾,注意力还在。
  4. 文末(结论之后)不放。这个位置用户要么在关页面,要么在找下一个链接,广告几乎不被看到。

这个布局不是教条,但对内容站来说是最稳的起点。先按这个放一个月,看后台各单元的可见展示率,再决定删哪个、调哪个位置。

八、一个真实的对比数据

某中文教程站,日均 4000 PV,最初布局是:顶部横幅 + 正文第一段后 + 侧边栏 + 文末,共 4 个单元。后台数据显示月收入 42 美元,可见展示率平均 31%,移动端 LCP 3.4 秒,CLS 0.28。

改造分三步做,每一步之间隔两周,方便观察:

第一步(去广告):删掉顶部横幅和文末单元,只留第一段后和侧边栏。收入反而涨了 8%——因为页面变快,跳出率下降,人均浏览量从 1.4 涨到 1.7。

第二步(调位置 + 占位):把第一段后的单元挪到第三段后,所有 ins 加 min-height,加 preconnect。CLS 降到 0.05,移动 LCP 降到 2.6 秒,可见展示率从 31% 涨到 58%。收入涨到 61 美元。

第三步(加第二个单元):在长文里加第二个 in-article。收入涨到 74 美元,跳出率基本没变。

整个过程的净效果:广告单元从 4 个减到 3 个,收入涨了 76%,速度指标全部达标。这说明关键从来不是数量,而是"被看到"和"页面够快"。

九、几个容易踩的政策坑

最后提醒几个会导致限流甚至封号的操作:

  • 不要诱导点击。「点广告支持本站」这类文字是明确违规。也不要把广告和下载按钮、翻页按钮做视觉混淆。
  • 不要自己点。开发和测试时如果必须看广告效果,用 Google 提供的测试广告 ID,或者用未登录的干净环境,绝不要用自己的账号点。
  • 不要在空页面上放广告。内容不足的页面(比如只有一句话的标签页、搜索结果页、404 页)放广告会被判为低质量页面。
  • 不要用自动广告叠加手动广告。两者同时开会导致同页广告过多,影响填充和可见性。
  • 不要隐藏广告或做层叠。任何让广告不可见的 CSS(例如 opacity: 0、height: 0 的容器)都属于违规。

十、小结

内容站的广告优化,正确的顺序是:先看可见展示率,再调位置,再做占位防 CLS,最后才考虑增加单元。速度指标和收入在这条路径上是同向的,不是对立的——页面快、布局稳、广告在用户真正阅读的位置,这三件事同时成立时,收入自然上去。

如果你的站现在还是"流量涨收入不涨",第一件事不是加广告,是打开后台看看每个单元的可见展示率,以及跑一次 PageSpeed 看 CLS。这两项数据基本能解释大部分问题。

Last modification:October 19th, 2026 at 07:23 pm

Leave a Comment