0

0

HTML代码怎么实现骨架屏_HTML代码骨架屏加载效果实现与用户体验优化

看不見的法師

看不見的法師

发布时间:2025-10-02 17:28:02

|

851人浏览过

|

来源于php中文网

原创

骨架屏通过HTML和CSS构建页面结构占位符,配合JavaScript控制显示与隐藏,在内容加载时提供视觉反馈,降低用户焦虑、提升感知性能和视觉连贯性;实现中需应对布局偏移、响应式适配、无障碍支持等挑战,可通过精确尺寸匹配、组件化封装、轻量动画等优化策略,并避免滥用、控制显示时长、确保结构一致,结合A/B测试验证效果,真正提升用户体验。

html代码怎么实现骨架屏_html代码骨架屏加载效果实现与用户体验优化

骨架屏的实现,说白了,就是利用HTML和CSS,在真实内容加载出来之前,先给用户展示一个页面大致轮廓的“占位符”。它不是真的内容,只是一个灰色的、通常会动起来的框框,让用户感觉页面正在“努力”加载,而不是一片空白的死寂,有效地缓解等待的焦虑。

要动手实现一个骨架屏,最核心的思路是构建一套与最终内容结构相似的HTML骨架,然后用CSS给它上色、加动画。比如,一个文章列表,我们可以先用几个div模拟文章标题、摘要和图片的位置。

接着是CSS,这才是骨架屏的灵魂。我们给这些模拟元素一个背景色,通常是浅灰色,再加个动画,让它看起来像在呼吸或者闪烁。

立即学习前端免费学习笔记(深入)”;

.skeleton-card {
  display: flex;
  margin-bottom: 20px;
  padding: 15px;
  border: 1px solid #eee;
  border-radius: 8px;
  overflow: hidden; /* 确保动画不溢出 */
}

.skeleton-image {
  width: 100px;
  height: 100px;
  background-color: #f0f0f0;
  border-radius: 4px;
  margin-right: 15px;
  animation: pulse 1.5s infinite ease-in-out; /* 呼吸动画 */
}

.skeleton-content {
  flex-grow: 1;
}

.skeleton-text {
  height: 16px;
  background-color: #f0f0f0;
  border-radius: 2px;
  margin-bottom: 8px;
  animation: pulse 1.5s infinite ease-in-out;
}

.skeleton-text-title {
  height: 20px;
  width: 70%; /* 标题可以更长一点 */
  margin-bottom: 12px;
}

/* 呼吸动画 */
@keyframes pulse {
  0% {
    background-color: #f0f0f0;
  }
  50% {
    background-color: #e0e0e0;
  }
  100% {
    background-color: #f0f0f0;
  }
}

/* 另一种常见的骨架屏动画:闪烁效果 */
/* 如果使用闪烁,可以这样设置背景和动画 */
/* .skeleton-text, .skeleton-image {
  background: linear-gradient(to right, #f0f0f0 8%, #e0e0e0 18%, #f0f0f0 33%);
  background-size: 800px 104px;
  animation: shimmer 1.5s infinite linear;
}
@keyframes shimmer {
  0% {
    background-position: -200% 0;
  }
  100% {
    background-position: 200% 0;
  }
} */

最后,用JavaScript控制骨架屏的显示与隐藏。当数据加载完成时,隐藏骨架屏,显示真实内容。

// 假设这是数据加载函数
function loadContent() {
  const skeleton = document.querySelector('.skeleton-card');
  const actualContent = document.querySelector('.actual-content'); // 假设真实内容放在这里

  // 模拟网络请求
  setTimeout(() => {
    skeleton.style.display = 'none'; // 隐藏骨架屏
    actualContent.style.display = 'block'; // 显示真实内容
    // 在这里填充真实数据到 actualContent,例如通过 innerHTML 或 DOM 操作
  }, 2000); // 2秒后加载完成,实际应用中替换为真实数据请求时间
}

// 页面加载时调用
document.addEventListener('DOMContentLoaded', loadContent);

这只是一个最基础的例子,实际应用中会更复杂,比如根据不同的组件类型封装不同的骨架屏,或者使用框架(如React, Vue)来更优雅地管理状态。

骨架屏对用户体验有哪些显著提升?

我一直觉得,等待是最磨人的。尤其是面对一个空荡荡的页面,那种不确定感真的会让人烦躁。骨架屏的出现,就像是给用户吃了一颗定心丸。它不是真的内容,但至少告诉你,“嘿,页面正在加载,不是卡死了。”这种心理上的安抚,我觉得是骨架屏最大的价值所在。

WPS AI
WPS AI

金山办公发布的AI办公应用,提供智能文档写作、阅读理解和问答、智能人机交互的能力。

下载

具体来说,骨架屏在用户体验方面有几个显著的提升:

  • 降低焦虑感和不确定性:这是最直接的。用户看到一个有结构的占位符,会知道内容即将出现,而不是面对白屏或加载中的转圈图标,后者往往让人觉得程序可能出错了。这种视觉上的“忙碌”比“空闲”的等待要舒服得多。
  • 提升感知性能:虽然实际加载时间可能没变,但用户会觉得页面“更快”了。因为他们从一开始就看到了页面的布局,而不是等到所有内容都渲染出来才看到。这种“忙碌”的反馈,比“空闲”的等待要好得多。
  • 保持视觉连贯性:骨架屏预先展示了内容的布局,当真实内容加载进来时,页面不会发生剧烈的布局跳动,这对于用户的阅读和交互体验至关重要。想象一下,如果页面元素突然跳来跳去,那种感觉真的很糟糕,特别是在移动端。
  • 引导用户预期:它像一个剧透,提前告诉用户这里会有一个图片,那里会有一段文字,让用户对即将到来的内容有个大致的心理准备。这种预期的建立,能让用户在内容加载完成后更快地进入状态。

实现骨架屏时常见的技术挑战与优化策略?

在实际操作中,实现骨架屏并非总是那么一帆风顺,总会遇到一些小麻烦,甚至是大坑。在我看来,有几个挑战是比较常见的,需要我们特别留意。

  • 布局偏移(CLS)问题:这可能是个大坑。如果骨架屏的尺寸和真实内容尺寸不匹配,在内容加载出来时,页面会发生剧烈的跳动,这不仅影响用户体验,还会影响SEO(Core Web Vitals里的CLS指标)。用户正在看某个区域,突然整个页面“抖”了一下,体验瞬间下降。
  • 响应式处理:骨架屏需要和真实内容一样,在不同屏幕尺寸下都能保持正确的布局和比例。如果骨架屏只考虑了桌面端,移动端可能就会一团糟,导致骨架屏失真,甚至比白屏还难看。
  • 多状态管理:一个页面可能有多个组件需要骨架屏,或者同一个组件有不同的加载状态(例如,首次加载、刷新、局部更新),如何优雅地管理这些状态,避免代码冗余和逻辑混乱,是需要好好思考的。
  • 无障碍性(Accessibility):屏幕阅读器用户可能无法理解骨架屏的含义,它只是视觉上的占位符。如果不对无障碍性进行处理,这部分用户会感到困惑。
  • 骨架屏自身的性能开销:虽然是为了优化感知性能,但如果骨架屏本身的HTML结构过于复杂,CSS动画过于耗费资源,反而会带来新的性能问题。这就有点得不偿失了。

针对这些挑战,我们可以采取一些策略来优化:

  • 精确匹配尺寸:这是解决CLS的关键。可以使用CSS的padding-bottom结合position: absolute来创建宽高比固定的占位符(例如,图片占位符),或者预设min-heightmin-width,确保骨架屏的尺寸与最终内容尽可能一致。例如,对于图片占位符:
    .image-placeholder {
      width: 100%;
      padding-bottom: 75%; /* 4:3 比例 */
      position: relative;
      background-color: #f0f0f0;
    }
    .image-placeholder::after {
      content: '';
      position: absolute;
      top: 0;
      left: 0;
      width: 100%;
      height: 100%;
      background: linear-gradient(90deg, #f0f0f0 25%, #e0e0e0 50%, #f0f0f0 75%);
      background-size: 200% 100%;
      animation: shimmer 1.5s infinite linear;
    }
  • CSS变量与组件化:利用CSS变量统一管理骨架屏的颜色、动画时长等属性,并将其封装成可复用的组件,简化不同骨架屏的开发和维护。这样不仅代码更整洁,也方便全局调整样式。
  • 语义化HTML与aria-busy:在骨架屏容器上添加aria-busy="true"属性,告诉屏幕阅读器这部分内容正在加载,完成后移除此属性。同时,确保骨架屏的HTML结构是语义化的,即使它只是一个占位符。
  • 轻量级动画:优先使用CSS动画(@keyframes),避免使用JS动画,因为它更高效,能更好地利用GPU加速。选择简单的pulseshimmer效果,避免过于复杂的动画,减少不必要的性能开销。
  • 渐进式渲染与按需加载:对于大型应用或页面,可以考虑只对关键区域使用骨架屏,非关键区域延迟加载。这样可以减少初始渲染的复杂性,将资源集中在最核心的用户体验上。

如何避免骨架屏带来的负面影响,确保其真正优化用户体验?

我见过一些网站,骨架屏做得过于花哨,或者加载时间太长,反而让人觉得“多此一举”,甚至有些反感。骨架屏的初衷是优化,而不是添乱。如果使用不当,它反而会成为用户体验的绊脚石。

避免骨架屏带来负面影响的关键点,我觉得有以下几点:

  • 适度使用,不滥用:不是所有地方都需要骨架屏。对于加载非常快的页面或组件,直接显示内容可能更好,骨架屏一闪而过反而会造成视觉干扰。骨架屏主要用于那些加载时间相对较长、内容结构复杂的区域,或者网络环境不佳时。
  • 控制显示时长:骨架屏不应长时间显示。如果数据在极短时间内就能返回,骨架屏可能一闪而过,反而造成闪烁感。通常,如果加载时间超过300-500ms,骨架屏才有意义。如果骨架屏显示时间超过几秒,用户可能会觉得内容是不是真的卡住了,反而会产生新的焦虑。
  • 忠实于内容结构:骨架屏应该尽可能地模拟真实内容的布局和大致尺寸。如果骨架屏和最终内容差异太大,用户会感到困惑,甚至觉得被欺骗,认为这不是他们期望的页面。骨架屏应该是一个“低保真”的预览,而不是一个完全不同的设计。
  • 考虑不同的内容类型:图片、文字、列表、图表,它们各自的骨架屏形态应该有所不同。一个通用的骨架屏模板可能无法满足所有需求。例如,图片骨架屏可以是一个带有斜线动画的矩形,文字骨架屏则是一系列不同长度的线条。
  • 性能考量:如前所述,骨架屏本身的渲染和动画不应成为新的性能瓶颈。精简HTML,优化CSS动画,确保它本身不会消耗过多的CPU或GPU资源。
  • A/B测试与用户反馈:如果你不确定骨架屏是否真的带来了积极影响,或者哪种骨架屏效果最好,A/B测试是验证的最好方式。观察用户停留时间、跳出率、转化率等指标。同时,收集用户反馈也很重要,他们是最直接的体验者。
  • 优雅降级:在某些极端情况下(例如,旧浏览器不支持CSS动画),骨架屏可能无法完美呈现。这时,需要考虑一个优雅的降级方案,比如直接显示一个简单的加载指示器,而不是一个破碎的骨架屏。

总的来说,骨架屏是一个强大的工具,能够显著优化用户在等待内容时的体验。但它的效果好坏,很大程度上取决于我们如何精心地设计和实现它。

文章配图

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

515

2023.06.20

js获取当前时间
js获取当前时间

JS全称JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言;它是一种属于网络的高级脚本语言,主要用于Web,常用来为网页添加各式各样的动态功能。js怎么获取当前时间呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

244

2023.07.28

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

319

2023.08.03

js是什么意思
js是什么意思

JS是JavaScript的缩写,它是一种广泛应用于网页开发的脚本语言。JavaScript是一种解释性的、基于对象和事件驱动的编程语言,通常用于为网页增加交互性和动态性。它可以在网页上实现复杂的功能和效果,如表单验证、页面元素操作、动画效果、数据交互等。

5328

2023.08.17

js删除节点的方法
js删除节点的方法

js删除节点的方法有:1、removeChild()方法,用于从父节点中移除指定的子节点,它需要两个参数,第一个参数是要删除的子节点,第二个参数是父节点;2、parentNode.removeChild()方法,可以直接通过父节点调用来删除子节点;3、remove()方法,可以直接删除节点,而无需指定父节点;4、innerHTML属性,用于删除节点的内容。

481

2023.09.01

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

Js中concat和push的区别
Js中concat和push的区别

Js中concat和push的区别:1、concat用于将两个或多个数组合并成一个新数组,并返回这个新数组,而push用于向数组的末尾添加一个或多个元素,并返回修改后的数组的新长度;2、concat不会修改原始数组,是创建新的数组,而push会修改原数组,将新元素添加到原数组的末尾等等。本专题为大家提供concat和push相关的文章、下载、课程内容,供大家免费下载体验。

218

2023.09.14

js截取字符串的方法介绍
js截取字符串的方法介绍

JavaScript字符串截取方法,包括substring、slice、substr、charAt和split方法。这些方法可以根据具体需求,灵活地截取字符串的不同部分。在实际开发中,根据具体情况选择合适的方法进行字符串截取,能够提高代码的效率和可读性 。

219

2023.09.21

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

7

2026.01.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Git 教程
Git 教程

共21课时 | 3.1万人学习

Kotlin 教程
Kotlin 教程

共23课时 | 3万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号