提取图片主色作为页面主题色

提取图片主色作为页面主题色

前言

本站使用astro开发,主题参考heo,但本教程具有通用性 本教程使用canvas提取主色 不用往下看了,会造成跨域

核心代码

function getMainColor(img) {
  const canvas = new OffscreenCanvas(1, 1);
  const ctx = canvas.getContext("2d");
  if (!ctx) return;
  ctx.drawImage(img, 0, 0, 1, 1);
  const { data } = ctx.getImageData(0, 0, 1, 1);
  const rgba=data.join(",").split(",")
  document.documentElement.style.setProperty('--heo-main-none',`rgba(${rgba[0]},${rgba[1]},${rgba[2]},0)`)
  document.documentElement.style.setProperty('--heo-main-op-light',`rgba(${rgba[0]},${rgba[1]},${rgba[2]},0.05)`)
  document.documentElement.style.setProperty('--heo-main-op-deep',`rgba(${rgba[0]},${rgba[1]},${rgba[2]},0.85)`)
  document.documentElement.style.setProperty('--heo-main-op',`rgba(${rgba[0]},${rgba[1]},${rgba[2]},0.14)`)
  document.documentElement.style.setProperty('--heo-main',`rgba(${rgba})`)
}

先用canvas取色,然后将颜色转化为rgba

通过document.documentElement.style.setProperty插入样式

应用于图片

<img crossorigin="anonymous" onload="javascript:getMainColor(this);" />

crossorin允许canvas跨域

onload触发取色

适配pjax

判断当前页面是否存在#post-bg

const path = (document.querySelector("#post-cover") as HTMLImageElement)?.src
  if (path == undefined) {
    document.documentElement.style.setProperty('--heo-main', 'var(--heo-theme)');
    document.documentElement.style.setProperty('--heo-main-op', 'var(--heo-theme-op)');
    document.documentElement.style.setProperty('--heo-main-op-deep', 'var(--heo-theme-op-deep)');
    document.documentElement.style.setProperty('--heo-main-none', 'var(--heo-theme-none)');
  }

pjax:complete中执行

提取图片主色作为页面主题色
https://pic.imgdb.cn/item/64feaba5661c6c8e546d1453.png
作者
Firefly
发布于
2026-04-03
许可协议
CC BY-NC-SA 4.0
Profile Image of the Author
Firefly
Hello, I'm Firefly.
公告
欢迎来到我的博客!这是一则示例公告。
音乐
暂无封面

音乐

暂未播放

0:000:00
暂无歌词
暂无歌曲
分类
标签
站点统计
文章
21
分类
3
标签
13
总字数
57,102
运行时长
601
最后活动
143 天前

目录