Skip to content

🌈 彩虹背景动画

这里的文章直接引用大佬的教程


UnoCSS 首页中,它的hero标题和图片背景有类似彩虹的渐变色动画

我们通过修改css样式实现,在 theme/style 新建 rainbow.css 文件

md
.
├─ docs
│  ├─ .vitepress
│  │  └─ config.mts
│  │  └─ theme
│  │     └─ style
│  │        └─ index.css
│  │        └─ rainbow.css
│  └─ index.md
└─ node_modules

复制下面代码,粘贴到 rainbow.css

点我查看代码
css
/* 彩虹动画 */
@keyframes rainbow {
    0% {
        --rainbow-prev: #009ff7;
        --rainbow-next: #c76dd1;
    }

    1.25% {
        --rainbow-prev: #009dfa;
        --rainbow-next: #cf69c9;
    }

    2.5% {
        --rainbow-prev: #009bfc;
        --rainbow-next: #d566c2;
    }

    3.75% {
        --rainbow-prev: #0098fd;
        --rainbow-next: #dc63ba;
    }

    5% {
        --rainbow-prev: #0096fd;
        --rainbow-next: #e160b3;
    }

    6.25% {
        --rainbow-prev: #0093fd;
        --rainbow-next: #e65eab;
    }

    7.5% {
        --rainbow-prev: #2e90fc;
        --rainbow-next: #e95ca2;
    }

    8.75% {
        --rainbow-prev: #4d8dfa;
        --rainbow-next: #ed5a9a;
    }

    10% {
        --rainbow-prev: #638af8;
        --rainbow-next: #ef5992;
    }

    11.25% {
        --rainbow-prev: #7587f5;
        --rainbow-next: #f15989;
    }

    12.5% {
        --rainbow-prev: #8583f1;
        --rainbow-next: #f25981;
    }

    13.75% {
        --rainbow-prev: #9280ed;
        --rainbow-next: #f25a79;
    }

    15% {
        --rainbow-prev: #9f7ce9;
        --rainbow-next: #f25c71;
    }

    16.25% {
        --rainbow-prev: #aa78e3;
        --rainbow-next: #f15e69;
    }

    17.5% {
        --rainbow-prev: #b574dd;
        --rainbow-next: #ef6061;
    }

    18.75% {
        --rainbow-prev: #be71d7;
        --rainbow-next: #ed635a;
    }

    20% {
        --rainbow-prev: #c76dd1;
        --rainbow-next: #eb6552;
    }

    21.25% {
        --rainbow-prev: #cf69c9;
        --rainbow-next: #e8694b;
    }

    22.5% {
        --rainbow-prev: #d566c2;
        --rainbow-next: #e46c44;
    }

    23.75% {
        --rainbow-prev: #dc63ba;
        --rainbow-next: #e06f3d;
    }

    25% {
        --rainbow-prev: #e160b3;
        --rainbow-next: #db7336;
    }

    26.25% {
        --rainbow-prev: #e65eab;
        --rainbow-next: #d77630;
    }

    27.5% {
        --rainbow-prev: #e95ca2;
        --rainbow-next: #d17a2a;
    }

    28.75% {
        --rainbow-prev: #ed5a9a;
        --rainbow-next: #cc7d24;
    }

    30% {
        --rainbow-prev: #ef5992;
        --rainbow-next: #c6811e;
    }

    31.25% {
        --rainbow-prev: #f15989;
        --rainbow-next: #bf8418;
    }

    32.5% {
        --rainbow-prev: #f25981;
        --rainbow-next: #b98713;
    }

    33.75% {
        --rainbow-prev: #f25a79;
        --rainbow-next: #b28a0f;
    }

    35% {
        --rainbow-prev: #f25c71;
        --rainbow-next: #ab8d0c;
    }

    36.25% {
        --rainbow-prev: #f15e69;
        --rainbow-next: #a3900b;
    }

    37.5% {
        --rainbow-prev: #ef6061;
        --rainbow-next: #9c920d;
    }

    38.75% {
        --rainbow-prev: #ed635a;
        --rainbow-next: #949510;
    }

    40% {
        --rainbow-prev: #eb6552;
        --rainbow-next: #8b9715;
    }

    41.25% {
        --rainbow-prev: #e8694b;
        --rainbow-next: #83991b;
    }

    42.5% {
        --rainbow-prev: #e46c44;
        --rainbow-next: #7a9b21;
    }

    43.75% {
        --rainbow-prev: #e06f3d;
        --rainbow-next: #719d27;
    }

    45% {
        --rainbow-prev: #db7336;
        --rainbow-next: #679e2e;
    }

    46.25% {
        --rainbow-prev: #d77630;
        --rainbow-next: #5da035;
    }

    47.5% {
        --rainbow-prev: #d17a2a;
        --rainbow-next: #51a13c;
    }

    48.75% {
        --rainbow-prev: #cc7d24;
        --rainbow-next: #44a244;
    }

    50% {
        --rainbow-prev: #c6811e;
        --rainbow-next: #34a44b;
    }

    51.25% {
        --rainbow-prev: #bf8418;
        --rainbow-next: #1ba553;
    }

    52.5% {
        --rainbow-prev: #b98713;
        --rainbow-next: #00a65b;
    }

    53.75% {
        --rainbow-prev: #b28a0f;
        --rainbow-next: #00a663;
    }

    55% {
        --rainbow-prev: #ab8d0c;
        --rainbow-next: #00a76c;
    }

    56.25% {
        --rainbow-prev: #a3900b;
        --rainbow-next: #00a874;
    }

    57.5% {
        --rainbow-prev: #9c920d;
        --rainbow-next: #00a87d;
    }

    58.75% {
        --rainbow-prev: #949510;
        --rainbow-next: #00a985;
    }

    60% {
        --rainbow-prev: #8b9715;
        --rainbow-next: #00a98e;
    }

    61.25% {
        --rainbow-prev: #83991b;
        --rainbow-next: #00a996;
    }

    62.5% {
        --rainbow-prev: #7a9b21;
        --rainbow-next: #00a99f;
    }

    63.75% {
        --rainbow-prev: #719d27;
        --rainbow-next: #00a9a7;
    }

    65% {
        --rainbow-prev: #679e2e;
        --rainbow-next: #00a9b0;
    }

    66.25% {
        --rainbow-prev: #5da035;
        --rainbow-next: #00a9b8;
    }

    67.5% {
        --rainbow-prev: #51a13c;
        --rainbow-next: #00a9c0;
    }

    68.75% {
        --rainbow-prev: #44a244;
        --rainbow-next: #00a8c7;
    }

    70% {
        --rainbow-prev: #34a44b;
        --rainbow-next: #00a8cf;
    }

    71.25% {
        --rainbow-prev: #1ba553;
        --rainbow-next: #00a7d5;
    }

    72.5% {
        --rainbow-prev: #00a65b;
        --rainbow-next: #00a6dc;
    }

    73.75% {
        --rainbow-prev: #00a663;
        --rainbow-next: #00a6e2;
    }

    75% {
        --rainbow-prev: #00a76c;
        --rainbow-next: #00a4e7;
    }

    76.25% {
        --rainbow-prev: #00a874;
        --rainbow-next: #00a3ec;
    }

    77.5% {
        --rainbow-prev: #00a87d;
        --rainbow-next: #00a2f1;
    }

    78.75% {
        --rainbow-prev: #00a985;
        --rainbow-next: #00a0f4;
    }

    80% {
        --rainbow-prev: #00a98e;
        --rainbow-next: #009ff7;
    }

    81.25% {
        --rainbow-prev: #00a996;
        --rainbow-next: #009dfa;
    }

    82.5% {
        --rainbow-prev: #00a99f;
        --rainbow-next: #009bfc;
    }

    83.75% {
        --rainbow-prev: #00a9a7;
        --rainbow-next: #0098fd;
    }

    85% {
        --rainbow-prev: #00a9b0;
        --rainbow-next: #0096fd;
    }

    86.25% {
        --rainbow-prev: #00a9b8;
        --rainbow-next: #0093fd;
    }

    87.5% {
        --rainbow-prev: #00a9c0;
        --rainbow-next: #2e90fc;
    }

    88.75% {
        --rainbow-prev: #00a8c7;
        --rainbow-next: #4d8dfa;
    }

    90% {
        --rainbow-prev: #00a8cf;
        --rainbow-next: #638af8;
    }

    91.25% {
        --rainbow-prev: #00a7d5;
        --rainbow-next: #7587f5;
    }

    92.5% {
        --rainbow-prev: #00a6dc;
        --rainbow-next: #8583f1;
    }

    93.75% {
        --rainbow-prev: #00a6e2;
        --rainbow-next: #9280ed;
    }

    95% {
        --rainbow-prev: #00a4e7;
        --rainbow-next: #9f7ce9;
    }

    96.25% {
        --rainbow-prev: #00a3ec;
        --rainbow-next: #aa78e3;
    }

    97.5% {
        --rainbow-prev: #00a2f1;
        --rainbow-next: #b574dd;
    }

    98.75% {
        --rainbow-prev: #00a0f4;
        --rainbow-next: #be71d7;
    }

    100% {
        --rainbow-prev: #009ff7;
        --rainbow-next: #c76dd1;
    }
}

/* 彩虹色卡初始色 */
:root {
    --rainbow-prev: #009ff7;
    --rainbow-next: #c76dd1;
    /* animation: rainbow 8s linear infinite; */
}

:root {
    /* hero标题渐变色 */
    --vp-home-hero-name-color: transparent;
    --vp-home-hero-name-background: -webkit-linear-gradient(120deg, var(--rainbow-prev) 30%, var(--rainbow-next));

    /*hero logo背景渐变色 */
    --vp-home-hero-image-background-image: linear-gradient(-45deg, var(--rainbow-prev) 30%, var(--rainbow-next));
    --vp-home-hero-image-filter: blur(80px);
}

本来直接在代码中加入 animation 即可生效,但是由于颜色代码过多,渲染页面会很卡顿,换个方式不卡的方式来实现

theme/index.ts 中写入代码中,保存

md
.
├─ docs
│  ├─ .vitepress
│  │  └─ config.mts
│  │  └─ theme
│  │     └─ style
│  │        └─ index.css
│  │        └─ rainbow.css
│  │     └─ index.ts
│  └─ index.md
└─ node_modules
ts
/* .vitepress/theme/index.ts */
// 彩虹背景动画样式
let homePageStyle: HTMLStyleElement | undefined

export default {
  extends: DefaultTheme,

  enhanceApp({app , router }) {
    // 彩虹背景动画样式
    if (typeof window !== 'undefined') {
      watch(
        () => router.route.data.relativePath,
        () => updateHomePageStyle(location.pathname === '/'),
        { immediate: true },
      )
    }

  },
}
// 彩虹背景动画样式
function updateHomePageStyle(value: boolean) {
  if (value) {
    if (homePageStyle) return

    homePageStyle = document.createElement('style')
    homePageStyle.innerHTML = `
    :root {
      animation: rainbow 12s linear infinite;
    }`
    document.body.appendChild(homePageStyle)
  } else {
    if (!homePageStyle) return

    homePageStyle.remove()
    homePageStyle = undefined
  }
}

最后在 index.css 中引入生效,回到主页看效果

为什么我的没效果?
  • 自身问题:请仔细检查代码颜色色卡,是否正确配置
  • 电脑问题:我的电脑 - 右键 属性 - 高级系统设置 - 在系统属性页卡中 高级 - 性能 设置,默认为 调整为最佳外观,将 窗口内的动画控件和元素 打勾,确定(如果电脑字体变化,请调整为其他,只要确保勾选此项即可)
css
/* .vitepress/theme/style/index.css */
@import './rainbow.css';