闪烁

一个动画文本闪烁组件,用于创建引人注目的加载状态和渐进式显示效果。

Shimmer 组件提供了一种动画闪烁效果,在文本上扫过,非常适合指示加载状态、渐进式显示或在 AI 应用中吸引对动态内容的注意。

使用 CLI 安装

AI Elements Vue
shadcn-vue CLI
npx ai-elements-vue@latest add shimmer

手动安装

将以下代码复制并粘贴到同一文件夹中。

Shimmer.vue
index.ts
<script setup lang="ts">
import type { CSSProperties } from 'vue'
import { cn } from '@repo/shadcn-vue/lib/utils'
import { motion } from 'motion-v'
import { computed, useSlots } from 'vue'

export interface TextShimmerProps {
  as?: keyof HTMLElementTagNameMap
  class?: string
  duration?: number
  spread?: number
}

const props = withDefaults(defineProps<TextShimmerProps>(), {
  as: 'p',
  duration: 2,
  spread: 2,
})

const slots = useSlots()

const textContent = computed(() => {
  const defaultSlot = slots.default?.()
  if (!defaultSlot || defaultSlot.length === 0)
    return ''

  return defaultSlot
    .map((vnode) => {
      if (typeof vnode.children === 'string') {
        return vnode.children
      }
      return ''
    })
    .join('')
})

const dynamicSpread = computed(() => {
  return (textContent.value?.length ?? 0) * props.spread
})

const componentClasses = computed(() => cn('relative inline-block bg-[length:250%_100%,auto] bg-clip-text text-transparent', '[--bg:linear-gradient(90deg,#0000_calc(50%-var(--spread)),var(--color-background),#0000_calc(50%+var(--spread)))] [background-repeat:no-repeat,padding-box]', props.class))

const componentStyle = computed((): CSSProperties => ({
  '--spread': `${dynamicSpread.value}px`,
  'backgroundImage':
    'var(--bg), linear-gradient(var(--color-muted-foreground), var(--color-muted-foreground))',
}))

const MotionComponent = computed(() => {
  return motion[props.as as keyof typeof motion] || motion.p
})
</script>

<template>
  <component
    :is="MotionComponent"
    :class="componentClasses"
    :style="componentStyle"
    :initial="{ backgroundPosition: '100% center' }"
    :animate="{ backgroundPosition: '0% center' }"
    :transition="{
      repeat: Number.POSITIVE_INFINITY,
      duration,
      ease: 'linear',
    }"
  >
    <slot />
  </component>
</template>

特性

  • 使用 CSS 渐变和 Motion 的平滑动画闪烁效果
  • 可自定义的动画持续时间和扩散
  • 多态组件 - 通过 as prop 渲染为任何 HTML 元素
  • 基于文本长度的自动扩散计算
  • 使用 CSS 自定义属性的主题感知样式
  • 具有线性缓动的无限循环动画
  • 具有适当类型定义的 TypeScript 支持
  • 记忆化以获得最佳性能
  • 响应式和可访问的设计
  • 使用 text-transparent 和 background-clip 实现清晰的文本渲染

示例

不同持续时间

自定义元素

Props

<Shimmer />

askeyof HTMLElementTagNameMap
'p'
要渲染的 HTML 元素或 React 组件。默认为 "p"。
classstring
''
应用于组件的额外 CSS 类。
durationnumber
2
闪烁动画的持续时间(秒)。默认为 2。
spreadnumber
2
闪烁渐变的扩散乘数,乘以文本长度。默认为 2。