Skip to content

前端骨架屏

1

1

1

1

前端实现骨架屏(Skeleton Screen)的原理主要是通过在实际内容加载之前展示占位内容,让用户感觉加载速度更快,从而提升用户体验。骨架屏通常使用CSS样式和JavaScript来控制占位内容的显示与隐藏。

骨架屏的实现原理

1. 骨架屏的设计

骨架屏通常设计为与实际内容结构相似的占位元素,使用灰色或浅灰色来模拟内容区域。可以根据实际内容的布局,设计文本、图片、按钮等不同类型的占位符。

2. CSS 动画效果

为了让骨架屏看起来更加生动,可以使用 CSS 动画效果,例如“闪烁”或“闪动”效果。通过 CSS 动画可以使骨架屏看起来像是在加载中,而不是静态的灰色块。

3. JavaScript 控制

使用 JavaScript 来控制骨架屏的显示与隐藏。在数据加载开始时显示骨架屏,数据加载完成后隐藏骨架屏并显示实际内容。

实现步骤

1. 设计骨架屏的 HTML 结构和 CSS 样式

创建与实际内容结构相似的骨架屏 HTML 元素,并使用 CSS 样式进行渲染。

html
<div id="skeleton-container">
  <div class="skeleton skeleton-rect"></div>
  <div class="skeleton skeleton-text" style="width: 80%;"></div>
  <div class="skeleton skeleton-text" style="width: 60%;"></div>
  <div class="skeleton skeleton-text" style="width: 90%;"></div>
</div>
<div id="content-container" style="display: none;">
  <!-- 这里是实际内容 -->
</div>
css
.skeleton {
  background-color: #e0e0e0;
  border-radius: 4px;
  width: 100%;
  height: 100%;
  animation: shimmer 1.5s infinite linear;
  background: linear-gradient(to right, #e0e0e0 8%, #f0f0f0 18%, #e0e0e0 33%);
  background-size: 800px 104px;
}

@keyframes shimmer {
  0% {
    background-position: -800px 0;
  }
  100% {
    background-position: 800px 0;
  }
}

.skeleton-text {
  height: 16px;
  margin-bottom: 8px;
}

.skeleton-rect {
  height: 200px;
  margin-bottom: 16px;
}

2. 使用 JavaScript 控制骨架屏的显示与隐藏

使用 JavaScript 来控制骨架屏的显示与隐藏。以下是一个简单的示例,模拟 3 秒的数据加载时间。

js
// 模拟数据加载
setTimeout(() => {
  document.getElementById('skeleton-container').style.display = 'none'
  document.getElementById('content-container').style.display = 'block'
}, 3000) // 3秒后显示实际内容

3. 在框架中实现(以 React 为例)

在 React 中实现骨架屏,可以创建一个骨架屏组件,并在数据加载时进行切换。

jsx
import React, { useState, useEffect } from 'react'
import './Skeleton.css' // 骨架屏的CSS样式

const Skeleton = () => (
  <div className="skeleton-container">
    <div className="skeleton skeleton-rect"></div>
    <div className="skeleton skeleton-text" style={{ width: '80%' }}></div>
    <div className="skeleton skeleton-text" style={{ width: '60%' }}></div>
    <div className="skeleton skeleton-text" style={{ width: '90%' }}></div>
  </div>
)

const DataComponent = () => (
  <div>
    <div className="content-rect">Actual content rectangle</div>
    <div className="content-text">Actual content line 1</div>
    <div className="content-text">Actual content line 2</div>
    <div className="content-text">Actual content line 3</div>
  </div>
)

const App = () => {
  const [loading, setLoading] = useState(true)

  useEffect(() => {
    // 模拟数据加载
    setTimeout(() => {
      setLoading(false)
    }, 3000) // 3秒后加载数据
  }, [])

  return <div>{loading ? <Skeleton /> : <DataComponent />}</div>
}

export default App

骨架屏的优势

1. 提升用户体验

骨架屏让用户在等待数据加载时感觉更快,减少了用户感知到的等待时间。

2. 更好的视觉反馈

相比于加载指示器(如加载旋转图标),骨架屏提供了与实际内容布局相似的视觉反馈,使用户更容易预期内容的布局和结构。

3. 降低跳动感

骨架屏可以减少内容加载过程中布局跳动的问题,提高用户体验的平滑度。