← 全部文章

教程

在任何网站隐藏 cookie 横幅 —— 5 段开箱即用的代码

GDPR 本应让我们掌控 cookie,结果却让每两个网站里就有一个弹出遮住 30% 屏幕的弹窗。本文展示五种一劳永逸摆脱这堵墙的方法 —— 用 CSS、JavaScript 和 JustZix 扩展。

这合法吗?

合法。GDPR 与 ePrivacy 指令约束的是网站运营者(在设置 cookie 前必须征得同意)。而站在你这边 —— 作为用户 —— 你完全有权在自己的浏览器里修改网站的外观。就像任何广告拦截器或 Safari 的阅读模式一样。一个重要说明:隐藏横幅通常等于同意 cookie —— 大多数网站在你明确点击「接受」之前,仍然只会设置严格必要的 cookie。

方法 1 —— 针对最常见类名的通用 CSS

最简单也最安全。能覆盖网上约 80% 的横幅:

/* Cookie 横幅 —— 最常见的类名和 ID */
.cookie-banner,
.cookie-notice,
.cookie-consent,
.gdpr-banner,
.consent-banner,
#cookie-notice,
#cookieConsent,
#onetrust-banner-sdk,
[class*="CookieConsent"],
[id*="cookie-bar"] {
  display: none !important;
}

/* 很多横幅在你点击前会锁住 body 的滚动 */
html, body {
  overflow: auto !important;
  position: static !important;
}

第二段非常关键 —— 许多横幅会在 <body> 上设置 overflow: hidden,在你接受前锁住滚动。强制 overflow: auto 可恢复正常行为。

方法 2 —— 激进的属性选择器

当网站使用动态类名(Tailwind、CSS-in-JS)而基础模式无法匹配时,改为针对属性下手:

/* 捕获类名 / ID 中含有 "cookie" 或 "consent" 的一切元素 */
[class*="cookie" i],
[id*="cookie" i],
[class*="consent" i],
[id*="consent" i],
[class*="gdpr" i],
[role="dialog"][aria-label*="cookie" i] {
  display: none !important;
}

属性选择器中的 i 标志(例如 [class*="cookie" i])让匹配不区分大小写。若没有它,.CookieBanner 就无法匹配 "cookie"

警告:这段代码可能误伤过多 —— 比如一篇讲 cookie(法律意义上的!)的文章也会被一起隐藏。请有的放矢地使用,最好放进一个限定特定域名的规则文件夹里。

方法 3 —— :has() 选择器(现代写法)

从 Chrome 105 和 Safari 15.4 起,你可以使用 :has() —— 一种针对包含某个匹配子元素的元素的选择器。它非常适合 cookie 横幅,因为横幅内部总会有一个「接受」按钮:

/* 实用版本 —— 针对带有 Accept 按钮的 fixed/sticky 容器 */
div:has(> button[aria-label*="Accept" i]),
div:has(> button[aria-label*="cookie" i]),
aside:has(> button[aria-label*="consent" i]) {
  display: none !important;
}

CSS 不支持 :contains()(那是 jQuery 的发明)。我们改为针对 aria-label 属性 —— 设计良好的横幅为了屏幕阅读器本来就会带上它。

方法 4 —— 用 JavaScript 自动点击「接受」

当 CSS 不够用时(横幅藏在 Shadow DOM、整页锁定),让 JS 替你点击。比你反应过来还快:

// 自动点击 "接受" 按钮 —— 在 iframe 中同样有效
let attempts = 0;
const interval = setInterval(() => {
  if (++attempts > 20) return clearInterval(interval);

  const candidates = [
    ...document.querySelectorAll('button, a[role="button"], input[type="button"]')
  ];

  const target = candidates.find(el => {
    const text = (el.textContent || el.value || '').trim().toLowerCase();
    const aria = (el.getAttribute('aria-label') || '').toLowerCase();
    return /^(accept all|accept|agree|allow all|i accept|ok)$/i
      .test(text) || /accept|agree|consent/.test(aria);
  });

  if (target) {
    target.click();
    clearInterval(interval);
  }
}, 500);

它每 500 毫秒探测一次,持续 10 秒(20 次 × 500 毫秒)。找到第一个匹配的按钮 —— 点击并停止。实际效果是:你甚至看不到横幅。

伦理提示:点击「接受」意味着你同意了营销 cookie。如果这让你不舒服 —— 请用方法 1+2(只隐藏、不接受)。这样网站会把你当作一个单纯没有作出回应的匿名用户。

方法 5 —— Shadow DOM(极端情况)

OneTrust、Cookiebot、Usercentrics —— 最常见的 cookie 横幅 SaaS —— 经常把它们的 UI 渲染在 Shadow DOM 里。shadow root 之外的 CSS 无法触及它。这就需要 JS:

// 按常见名称找到宿主元素,进入它的 shadowRoot
function hideShadowBanners() {
  const hosts = document.querySelectorAll(
    '#onetrust-consent-sdk, #usercentrics-root, #CybotCookiebotDialog'
  );

  hosts.forEach(host => {
    host.style.display = 'none';
    // 再加上 shadow 内容(如果它使用了 shadow DOM)
    if (host.shadowRoot) {
      const style = document.createElement('style');
      style.textContent = ':host { display: none !important; }';
      host.shadowRoot.appendChild(style);
    }
  });
}

// 首次执行 + 监听稍后插入的元素
hideShadowBanners();
new MutationObserver(hideShadowBanners)
  .observe(document.body, { childList: true, subtree: true });

MutationObserver 还能捕获那些在 DOMContentLoaded 之后才插入的横幅 —— 通常追踪脚本是异步加载的,横幅会在页面加载后 1-2 秒才出现。

如何在 JustZix 中接入

  1. 安装扩展(下载页面 —— ZIP,2 分钟)。
  2. 点击 JustZix 图标 → 「新建规则」。
  3. URL 匹配模式:*(处处生效)或 https://example.com/*(单个域名)。
  4. 在 CSS 标签页粘贴方法 1(通用版)—— 保持其启用。
  5. 如果遇到某个网站什么都没被隐藏 —— 把方法 4 作为一条 JS 规则添加,并限定到那个域名。
  6. 在多设备间同步你的密钥 —— 横幅会在笔记本、台式机和工作电脑上同时消失。

需要避开的坑

接下来做什么

同样的思路也适用于其他破坏体验的元素:新闻邮件弹窗、「开启通知」、付费墙预览。在示例栏目里看看更多开箱即用的代码,或浏览 JustZix 的真实应用场景

安装 JustZix 并写下你自己的规则。把本文第一段代码粘进扩展 = 横幅在 80% 的网站上消失。剩下的只是针对个别麻烦域名逐步打磨而已。

为这篇文章评分

暂无评分 — 成为第一个。

自己动手试试

安装 JustZix,粘贴本文中的任意代码片段。两分钟,从零到一条在你所有设备上生效的规则。

获取 JustZix

功能 · 工作原理 · 示例 · 应用场景