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

如何使用原生JavaScript动态修改滚动条样式?

伪元素不属于真实DOM节点,没有对应的DOM对象引用,你写的main.webkitScrollBar本身就是不存在的属性,自然不可能通过.style直接修改样式,这也是你之前所有调整都不生效的根本原因。

下面给两个零依赖的纯原生JS实现方案,完全适配主题切换的动态改色需求,不需要jQuery或者任何第三方插件。

方案1:动态注入专属样式表(兼容性最好)

页面初始化时创建一个独立的style标签专门存放滚动条样式,主题切换时直接更新这个标签里的CSS内容即可,和你写静态CSS的效果完全一致。

// 初始化:仅需执行一次
const scrollbarStyleEl = document.createElement('style');
document.head.appendChild(scrollbarStyleEl);

// 封装更新方法,主题切换时直接传对应颜色调用即可
function setMainScrollbarColor(trackBg, thumbBg) {
  scrollbarStyleEl.textContent = `
    main::-webkit-scrollbar {
      width: 10px;
      background-color: ${trackBg};
    }
    main::-webkit-scrollbar-thumb {
      background-color: ${thumbBg};
    }
    /* 兼容Firefox */
    main {
      scrollbar-width: thin;
      scrollbar-color: ${thumbBg} ${trackBg};
    }
  `;
}

// 调用示例:默认浅色主题
setMainScrollbarColor('#c2c3c4', '#43474C');
// 切换深色主题时直接传新的色值即可
// setMainScrollbarColor('#2a2a2a', '#7a7a7a');
  • 这个方案没有任何额外DOM开销,初始化一次后反复调用性能极高,兼容所有支持自定义滚动条样式的现代浏览器。
方案2:CSS变量控制(代码最简洁,推荐搭配现有主题系统使用)

如果你已经在主题系统里用CSS变量管理色值,这个方案几乎不需要额外写JS逻辑。
首先修改你的静态CSS,把滚动条颜色替换成CSS变量:

:root {
  --scrollbar-track: #c2c3c4;
  --scrollbar-thumb: #43474C;
}
main::-webkit-scrollbar {
  width: 10px;
  background-color: var(--scrollbar-track);
}
main::-webkit-scrollbar-thumb {
  background-color: var(--scrollbar-thumb);
}
main {
  scrollbar-width: thin;
  scrollbar-color: var(--scrollbar-thumb) var(--scrollbar-track);
}

主题切换时只需要修改根节点上的CSS变量值即可,所有用到变量的地方(包括滚动条)会自动更新样式:

function applyTheme(theme) {
  const root = document.documentElement;
  root.style.setProperty('--scrollbar-track', theme.scrollbarTrack);
  root.style.setProperty('--scrollbar-thumb', theme.scrollbarThumb);
  // 其余主题色的修改逻辑可以写在这里
}
  • 这个方案是目前前端主题切换的主流实现方式,所有主题色统一管理,不需要针对滚动条单独写特殊逻辑,维护成本极低。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 17:39:18