0

0

CSS如何制作骨架屏渐变效果?linear-gradient

蓮花仙者

蓮花仙者

发布时间:2025-08-19 15:27:01

|

1057人浏览过

|

来源于php中文网

原创

css制作骨架屏渐变效果的核心是使用linear-gradient创建亮色光束,并通过background-size放大渐变背景、利用background-position动画实现光束扫过效果;2. 必须结合overflow: hidden确保动画在容器内显示,使用position: relative与absolute定位使伪元素精准覆盖,配合animation控制动画流畅播放;3. 为提升用户体验,渐变动画能提供视觉活跃感、降低感知等待时间、增强专业感并暗示内容布局;4. 实际项目中需优化性能,保持css简洁、减少dom节点、避免过度渲染,并在内容加载后及时移除骨架屏;5. 可访问性方面应使用语义化html,通过aria-hidden或aria-live提升屏幕阅读器兼容性,并利用@media (prefers-reduced-motion)尊重用户对动画的偏好设置,确保所有用户都能获得良好体验。

CSS如何制作骨架屏渐变效果?linear-gradient

CSS制作骨架屏的渐变效果,核心在于巧妙运用

linear-gradient
属性来创建模拟加载的“闪光”背景,并结合CSS动画(
@keyframes
)使其移动,从而给人一种内容正在逐渐填充的动态视觉感受。

解决方案

制作骨架屏的渐变效果,我们通常会用到一个稍宽于元素本身的渐变背景,然后通过动画改变这个背景的位置,让它像一道光束一样扫过骨架。

首先,你需要一些基本的HTML结构来代表你的内容块,比如:

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

<div class="skeleton-wrapper">
  <div class="skeleton-line short"></div>
  <div class="skeleton-line medium"></div>
  <div class="skeleton-line long"></div>
  <div class="skeleton-avatar"></div>
</div>

接着是CSS部分。关键在于定义一个

linear-gradient
作为背景,这个渐变通常包含透明或半透明区域,以及一个模拟“光”的亮色区域。然后,设置
background-size
让这个渐变背景比元素宽,并通过
animation
来移动
background-position

.skeleton-wrapper {
  background-color: #f0f0f0; /* 骨架基础色 */
  border-radius: 4px;
  overflow: hidden; /* 关键:确保渐变只在骨架内部可见 */
  position: relative; /* 为伪元素或内部动画做准备 */
}

/* 骨架内的占位元素 */
.skeleton-line,
.skeleton-avatar {
  background-color: #e0e0e0; /* 骨架占位元素的颜色 */
  border-radius: 4px;
  margin-bottom: 8px;
}

.skeleton-line.short { width: 60%; height: 16px; }
.skeleton-line.medium { width: 80%; height: 16px; }
.skeleton-line.long { width: 100%; height: 16px; }
.skeleton-avatar { width: 48px; height: 48px; border-radius: 50%; }

/* 核心渐变动画 */
.skeleton-wrapper::before {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  /* 渐变背景:从左到右,亮色区域在中间 */
  background: linear-gradient(90deg, #f0f0f0 0%, #e0e0e0 20%, #f0f0f0 40%, #e0e0e0 60%, #f0f0f0 100%);
  background-size: 200% 100%; /* 关键:让渐变宽度是容器的两倍,这样才能移动 */
  animation: skeleton-shimmer 1.5s infinite linear; /* 动画名称、时长、重复、速度曲线 */
}

@keyframes skeleton-shimmer {
  0% {
    background-position: -100% 0; /* 初始位置:渐变背景在容器左侧之外 */
  }
  100% {
    background-position: 100% 0; /* 结束位置:渐变背景移动到容器右侧之外 */
  }
}

这里我选择用伪元素

::before
来承载这个渐变动画,这样可以避免直接修改骨架元素本身的背景,让结构更清晰。
background-size: 200% 100%
是核心,它让你的渐变比容器宽一倍,这样就有足够的空间让“光”从左边完全移到右边。而
background-position
的动画,就是让这束“光”来回扫动。

为什么骨架屏需要渐变效果,它带来了哪些用户体验上的好处?

说实话,骨架屏之所以流行,很大程度上是因为它能有效缓解用户等待时的焦虑感。纯粹的灰色方块虽然能表示“这里有内容”,但总觉得少了点什么。加入渐变效果,尤其是这种“光束”扫过的动画,在我看来,它带来了一种微妙的动态感,暗示着数据正在被“填充”进来,而不是简单地等待。

从用户体验的角度看,渐变效果有几个明显的好处:

首先,它提供了视觉上的活跃度。静态的骨架屏容易让人觉得页面卡顿或无响应,而一个带有动态渐变的骨架屏,哪怕内容还没加载出来,也能让用户感觉到页面是“活”的,正在积极地工作。这就像你在看进度条时,一个会动的进度条总比一个静止的看起来更有希望。

其次,它能降低用户的感知等待时间。心理学研究表明,当人们的注意力被吸引时,他们对时间的感知会发生变化。骨架屏的渐变动画就是一种巧妙的注意力转移,它让用户有东西可看,而不是盯着空白或一个死板的占位符发呆。这种“忙碌”的视觉反馈,会让人觉得等待的时间似乎变短了。

再者,它增强了品牌的专业度和细节感。一个精心设计的骨架屏,包括流畅的渐变动画,能体现出开发者对用户体验的重视。这不仅仅是功能上的实现,更是一种对用户感受的尊重,让整个产品显得更精致、更现代化。我个人在浏览网页时,如果看到一个有漂亮骨架屏的网站,会下意识地觉得这个团队在用户体验上是下功夫的。

最后,它为即将呈现的内容提供了上下文线索。虽然只是占位符,但通过不同形状(如圆形头像、长短不一的文本行)的骨架,结合渐变效果,可以提前向用户暗示内容的布局和类型,让用户对加载完成后的页面有一个初步的预期,减少了内容突然出现时的突兀感。

除了linear-gradient,还有哪些CSS属性在骨架屏动画中至关重要?

除了

linear-gradient
本身,还有几个CSS属性在构建一个健壮且效果出色的骨架屏动画中扮演着不可或缺的角色。它们共同协作,才能让骨架屏既美观又高效。

一个非常重要的属性是

overflow: hidden
。在我们的示例中,我把它放在了
.skeleton-wrapper
上。它的作用是确保
linear-gradient
背景在移动时,不会溢出到骨架屏的边界之外。如果缺少这个属性,你可能会看到渐变“光束”在骨架屏的边缘被裁剪得很难看,或者干脆跑到页面其他地方去了。这就像给你的画框加上了边框,让画只在框内显示。

然后是

position: relative
position: absolute
的组合。在示例中,我给
.skeleton-wrapper
设置了
position: relative
,然后给伪元素
::before
设置了
position: absolute
。这种父子定位关系是Web布局中非常常见且强大的模式,它让伪元素可以精确地覆盖在父元素之上,并且其位置计算是相对于父元素进行的。这对于确保渐变动画能够准确地在骨架屏区域内进行至关重要。

ImgGood
ImgGood

免费在线AI照片编辑器

下载

background-size
background-position
这对搭档更是核心。
background-size: 200% 100%
(或其他大于100%的值)定义了渐变背景的实际尺寸,使其比容器更宽,这样才有了“移动”的空间。而
background-position
则控制着背景的起始位置,通过
@keyframes
动画来改变它,实现了渐变的滑动效果。没有它们,
linear-gradient
就只是一个静态的背景。

此外,

animation-timing-function
也值得一提。在我们的例子中,我用了
linear
,这意味着动画速度是恒定的。但你也可以尝试
ease-in-out
,让动画在开始和结束时更平滑,这有时能带来更自然的视觉感受。根据你想要的“光束”效果,选择合适的缓动函数能让动画更具表现力。

最后,别忘了

border-radius
。虽然它不直接参与动画,但它决定了骨架屏各个元素的圆角程度。一个合适的圆角能让骨架屏看起来更柔和,更像真实内容的占位符,而不是生硬的方块。这种细节处理,往往能提升整体的视觉舒适度。

在实际项目中,如何优化骨架屏的性能和可访问性?

在实际项目中,骨架屏的性能和可访问性是不可忽视的环节。毕竟,我们引入骨架屏是为了提升用户体验,如果它本身成为性能瓶颈或带来可访问性问题,那就得不偿失了。

性能优化方面:

首先,CSS的简洁性是王道。骨架屏的CSS应该尽量轻量化,避免复杂的选择器和过多的层级。我们前面提到的渐变动画,如果能用一个伪元素搞定,就尽量不要创建额外的DOM元素。CSS动画通常比JavaScript动画在性能上更优,因为它可以在主线程之外运行。

其次,避免过度渲染。骨架屏的元素数量应该尽可能少,只保留关键的布局占位符。如果你的骨架屏过于复杂,包含了大量的DOM节点,那么在加载和渲染骨架屏本身时,也可能消耗不必要的资源。我个人倾向于只模拟最主要的布局结构,而不是每个细节都做出来。

再者,合理使用动画。动画虽然能提升体验,但如果动画帧率过低或者动画计算量过大,反而会造成卡顿。确保

@keyframes
动画的属性是可合成的(如
transform
opacity
),而不是会触发重排或重绘的属性(如
width
height
margin
)。我们这里用的
background-position
动画,在现代浏览器中通常表现良好,但也要注意不要设置过于频繁的帧数。

最后,及时移除骨架屏。当真实内容加载完成后,骨架屏应该立即被移除或隐藏。这可以通过JavaScript来控制,比如在数据请求成功后,添加一个CSS类来隐藏骨架屏并显示真实内容。确保这个切换过程是平滑的,避免内容突然“闪现”出来。

可访问性方面:

可访问性常常被忽视,但对所有用户都非常重要。

第一,语义化HTML。即使是骨架屏,也要尽可能使用语义化的HTML结构。例如,如果你的骨架屏模拟的是一个文章列表,那么可以使用

<ul>
<li>
,而不是一堆
<div>
。虽然骨架屏只是临时占位,但良好的结构有助于屏幕阅读器理解页面大致布局。

第二,为屏幕阅读器提供替代文本。由于骨架屏是视觉上的占位,屏幕阅读器用户可能无法理解其含义。你可以考虑在骨架屏容器上添加

aria-hidden="true"
,告诉屏幕阅读器跳过这部分内容,因为它只是视觉上的加载指示。当真实内容加载后,再确保新内容是可访问的。或者,如果你想提供一些提示,可以在骨架屏容器内放置一个
aria-live="polite"
的隐藏元素,其中包含文本“内容正在加载中...”,当内容加载完成后再移除。

第三,考虑用户的偏好。有些用户可能不喜欢动画,或者有运动障碍。CSS的

@media (prefers-reduced-motion)
查询就派上用场了。你可以利用这个媒体查询,为那些在操作系统层面设置了“减少动态效果”的用户,提供一个静态的骨架屏版本,或者减少动画的复杂性。这体现了对用户个性化需求的尊重。

@media (prefers-reduced-motion: reduce) {
  .skeleton-wrapper::before {
    animation: none; /* 禁用动画 */
    background-image: none; /* 或者设置为纯色背景 */
  }
}

在实际项目中,性能和可访问性是产品质量的重要组成部分。一个漂亮的骨架屏固然吸引眼球,但一个高效且对所有人都友好的骨架屏,才能真正提升用户体验。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

448

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

606

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

766

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

766

2023.08.10

function是什么
function是什么

function是函数的意思,是一段具有特定功能的可重复使用的代码块,是程序的基本组成单元之一,可以接受输入参数,执行特定的操作,并返回结果。本专题为大家提供function是什么的相关的文章、下载、课程内容,供大家免费下载体验。

500

2023.08.04

js函数function用法
js函数function用法

js函数function用法有:1、声明函数;2、调用函数;3、函数参数;4、函数返回值;5、匿名函数;6、函数作为参数;7、函数作用域;8、递归函数。本专题提供js函数function用法的相关文章内容,大家可以免费阅读。

166

2023.10.07

DOM是什么意思
DOM是什么意思

dom的英文全称是documentobjectmodel,表示文件对象模型,是w3c组织推荐的处理可扩展置标语言的标准编程接口;dom是html文档的内存中对象表示,它提供了使用javascript与网页交互的方式。想了解更多的相关内容,可以阅读本专题下面的文章。

4356

2024.08.14

CSS position定位有几种方式
CSS position定位有几种方式

有4种,分别是静态定位、相对定位、绝对定位和固定定位。更多关于CSS position定位有几种方式的内容,可以访问下面的文章。

83

2023.11.23

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

49

2026.03.13

热门下载

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

精品课程

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

共14课时 | 0.9万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

CSS教程
CSS教程

共754课时 | 43.4万人学习

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

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