Skip to content
API 风格:

Esqueleto ​

Ofrece un marcador de posición mientras termina la carga del contenido. Los bloques de marcador llevan aria-hidden para ocultarlos de los lectores de pantalla, y el contenedor notifica los cambios del estado de carga con aria-busy y aria-live; la animación de brillo respeta prefers-reduced-motion.

Uso básico ​

Uso básico
vue
<script setup lang="ts">
import { ref } from 'vue'

const skeletonLoading = ref(true)
</script>

<template>
  <!-- Uso básico -->
  <LhSkeleton :rows="3" :loading="skeletonLoading">
    <p>Contenido cargado: todas las aves se han ido volando, una nube solitaria se aleja tranquila.</p>
  </LhSkeleton>
  <!-- Conmutar estado de carga -->
  <LhButton size="small" @click="skeletonLoading = !skeletonLoading">
    {{ skeletonLoading ? 'Mostrar contenido' : 'Mostrar esqueleto' }}
  </LhButton>
</template>
vue
<script>
export default {
  data() {
    return { skeletonLoading: true }
  },
}
</script>

<template>
  <!-- Uso básico -->
  <LhSkeleton :rows="3" :loading="skeletonLoading">
    <p>Contenido cargado: todas las aves se han ido volando, una nube solitaria se aleja tranquila.</p>
  </LhSkeleton>
  <!-- Conmutar estado de carga -->
  <LhButton size="small" @click="skeletonLoading = !skeletonLoading">
    {{ skeletonLoading ? 'Mostrar contenido' : 'Mostrar esqueleto' }}
  </LhButton>
</template>

Composición con avatar ​

Composición con avatar
vue
<script setup lang="ts">
</script>

<template>
  <LhSkeleton avatar :rows="2" />
</template>
vue
<script>
export default {}
</script>

<template>
  <LhSkeleton avatar :rows="2" />
</template>

Desactivar la animación ​

Esqueleto estático
vue
<script setup lang="ts">
</script>

<template>
  <LhSkeleton :rows="3" :animated="false" />
</template>
vue
<script>
export default {}
</script>

<template>
  <LhSkeleton :rows="3" :animated="false" />
</template>

Bloques de marcador independientes con SkeletonItem ​

SkeletonItem
vue
<script setup lang="ts">
</script>

<template>
  <LhSkeletonItem variant="circle" />
  <LhSkeletonItem variant="rect" style="width: 120px; height: 60px" />
</template>
vue
<script>
export default {}
</script>

<template>
  <LhSkeletonItem variant="circle" />
  <LhSkeletonItem variant="rect" style="width: 120px; height: 60px" />
</template>

Skeleton API ​

Props ​

PropDescripciónTipoPredeterminado
loadingEstado de carga (con false se renderiza el slot default)booleantrue
rowsNúmero de líneas de textonumber3
avatarSi se incluye un marcador de avatar circularbooleanfalse
animatedSi se activa la animaciónbooleantrue
sxProps de maquetación rápida sxLhSxProps—

Slots ​

SlotDescripción
defaultContenido real que se renderiza cuando loading es false

SkeletonItem API ​

Props ​

PropDescripciónTipoPredeterminado
variantForma del bloque de marcador'text' | 'rect' | 'circle''text'
animatedSi se activa la animaciónbooleantrue
sxProps de maquetación rápida sxLhSxProps—

Variables de tema ​

VariableDescripciónPredeterminado
--lh-skeleton-bgColor de fondo del bloque de marcadorMezcla al 10 % de opacidad del color de tinta (text-regular)
--lh-skeleton-highlightColor del brillo deslizanteColor de fondo aclarado un 45 % hacia el blanco
--lh-skeleton-radiusRedondeado base--lh-border-radius-small

Accesibilidad ​

  • Los bloques de marcador llevan aria-hidden="true" y no entran en la lectura de pantalla
  • El contenedor lleva aria-busy="true" + aria-live="polite"; al terminar la carga y cambiar el contenido se anuncia automáticamente
  • Con prefers-reduced-motion: reduce la animación de brillo se desactiva

Definiciones de tipos ​

Las estructuras de tipos TypeScript que exporta este componente son las siguientes (extraídas automáticamente de packages/components/skeleton/src/types.ts y del código fuente de @lh-ui/share/core/*; despliega cada entrada para ver la definición completa; la descripción de los atributos está en la tabla de Props de arriba):

LhSkeletonProps
ts
export interface LhSkeletonProps {
  /** Estado de carga (con false se renderiza el contenido real del slot default) */
  loading?: boolean
  /** Número de líneas de texto */
  rows?: number
  /** Si se incluye un marcador de avatar circular */
  avatar?: boolean
  /** Si se activa la animación */
  animated?: boolean
  /** Props de maquetación rápida sx */
  sx?: LhSxProps
}
LhSkeletonItemProps
ts
export interface LhSkeletonItemProps {
  /** Forma del bloque de marcador */
  variant?: LhSkeletonVariant
  /** Si se activa la animación */
  animated?: boolean
  /** Props de maquetación rápida sx */
  sx?: LhSxProps
}
LhSkeletonVariant (de @lh-ui/share/core/skeleton)
ts
/** Forma del bloque de marcador del esqueleto */
export type LhSkeletonVariant = 'text' | 'rect' | 'circle'

La belleza de la tradición, el cimiento del código