You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何根据背景亮度动态切换Squarespace导航链接文字颜色?

Squarespace导航文字随背景自动切黑白的方案

核心思路

用JavaScript实时检测每个导航链接对应位置的背景像素亮度,以中性灰(亮度值127)为分界:背景偏亮就用黑字,背景偏暗就用白字。同时监听页面滚动和轮播切换事件,随时更新文字颜色。

具体步骤

1. 先加基础CSS(避免切换闪烁)

给导航链接加个平滑过渡效果,同时定义好黑白文字的样式类:

.header-nav-item a {
  transition: color 0.2s ease; /* 颜色切换更丝滑 */
}
.header-nav-item a.text-white {
  color: #fff;
}
.header-nav-item a.text-black {
  color: #000;
}

2. 写核心JavaScript代码

这段代码只会修改导航文字颜色,不会触碰页面背景,解决你之前遇到的背景随机变化问题:

document.addEventListener('DOMContentLoaded', function() {
  // 抓取导航项列表,没有的话直接退出
  const navItems = document.querySelectorAll('.header-nav-item');
  if (!navItems.length) return;

  // 创建隐藏的canvas,用来分析背景像素
  const canvas = document.createElement('canvas');
  const ctx = canvas.getContext('2d');
  canvas.style.display = 'none';
  document.body.appendChild(canvas);

  // 计算指定区域的平均亮度
  function getAverageBrightness(element) {
    const rect = element.getBoundingClientRect();
    canvas.width = rect.width;
    canvas.height = rect.height;

    // 把导航项下方的页面内容画到canvas上
    ctx.drawWindow(window, rect.left, rect.top, rect.width, rect.height, '#fff');
    
    // 获取像素数据,用行业通用公式计算平均亮度
    const imageData = ctx.getImageData(0, 0, rect.width, rect.height);
    const data = imageData.data;
    let totalBrightness = 0;

    for (let i = 0; i < data.length; i += 4) {
      const r = data[i];
      const g = data[i + 1];
      const b = data[i + 2];
      // ITU-R BT.709标准亮度公式,比单纯取RGB平均值更准确
      const brightness = (0.2126 * r) + (0.7152 * g) + (0.0722 * b);
      totalBrightness += brightness;
    }

    return totalBrightness / (rect.width * rect.height);
  }

  // 更新所有导航文字颜色
  function updateNavTextColors() {
    navItems.forEach(item => {
      const link = item.querySelector('a');
      if (!link) return;

      const avgBrightness = getAverageBrightness(item);
      // 亮度大于127(中性灰)用黑字,否则用白字
      if (avgBrightness > 127) {
        link.classList.remove('text-white');
        link.classList.add('text-black');
      } else {
        link.classList.remove('text-black');
        link.classList.add('text-white');
      }
    });
  }

  // 监听滚动事件,滚动时更新颜色
  window.addEventListener('scroll', updateNavTextColors);

  // 监听轮播切换(适配Squarespace的Hero Carousel)
  const carousel = document.querySelector('.sqs-block-hero-carousel');
  if (carousel) {
    // 用MutationObserver监听轮播内容变化,触发颜色更新
    const observer = new MutationObserver(updateNavTextColors);
    observer.observe(carousel, { childList: true, subtree: true });
  }

  // 页面加载完成后先执行一次,初始化颜色
  updateNavTextColors();
});

3. 部署到Squarespace

  • 进入后台,点击设置 > 高级 > 代码注入
  • 把CSS代码粘贴到页眉区域,JavaScript代码粘贴到页脚区域
  • 保存后刷新页面即可测试效果

注意点

  • 不同Squarespace模板的导航类名可能不同,比如.header-nav-item如果不生效,用浏览器开发者工具(F12)抓取实际导航项的类名替换即可
  • 轮播容器类.sqs-block-hero-carousel同理,若不生效,替换为模板对应的轮播容器类
  • 该方案仅修改导航文字颜色,不会对页面背景产生任何改动

内容的提问来源于stack exchange,提问作者Dan Casey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 19:01:34