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结构来代表你的内容块,比如:

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

接着是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布局中非常常见且强大的模式,它让伪元素可以精确地覆盖在父元素之上,并且其位置计算是相对于父元素进行的。这对于确保渐变动画能够准确地在骨架屏区域内进行至关重要。

Linfo.ai
Linfo.ai

Linfo AI 是一款AI驱动的 Chrome 扩展程序,可以将网页文章、行业报告、YouTube 视频和 PDF 文档转换为结构化摘要。

下载

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结构。例如,如果你的骨架屏模拟的是一个文章列表,那么可以使用

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

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

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

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

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

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

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

    相关专题

    更多
    js获取数组长度的方法
    js获取数组长度的方法

    在js中,可以利用array对象的length属性来获取数组长度,该属性可设置或返回数组中元素的数目,只需要使用“array.length”语句即可返回表示数组对象的元素个数的数值,也就是长度值。php中文网还提供JavaScript数组的相关下载、相关课程等内容,供大家免费下载使用。

    552

    2023.06.20

    js刷新当前页面
    js刷新当前页面

    js刷新当前页面的方法:1、reload方法,该方法强迫浏览器刷新当前页面,语法为“location.reload([bForceGet]) ”;2、replace方法,该方法通过指定URL替换当前缓存在历史里(客户端)的项目,因此当使用replace方法之后,不能通过“前进”和“后退”来访问已经被替换的URL,语法为“location.replace(URL) ”。php中文网为大家带来了js刷新当前页面的相关知识、以及相关文章等内容

    374

    2023.07.04

    js四舍五入
    js四舍五入

    js四舍五入的方法:1、tofixed方法,可把 Number 四舍五入为指定小数位数的数字;2、round() 方法,可把一个数字舍入为最接近的整数。php中文网为大家带来了js四舍五入的相关知识、以及相关文章等内容

    731

    2023.07.04

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

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

    476

    2023.09.01

    JavaScript转义字符
    JavaScript转义字符

    JavaScript中的转义字符是反斜杠和引号,可以在字符串中表示特殊字符或改变字符的含义。本专题为大家提供转义字符相关的文章、下载、课程内容,供大家免费下载体验。

    394

    2023.09.04

    js生成随机数的方法
    js生成随机数的方法

    js生成随机数的方法有:1、使用random函数生成0-1之间的随机数;2、使用random函数和特定范围来生成随机整数;3、使用random函数和round函数生成0-99之间的随机整数;4、使用random函数和其他函数生成更复杂的随机数;5、使用random函数和其他函数生成范围内的随机小数;6、使用random函数和其他函数生成范围内的随机整数或小数。

    990

    2023.09.04

    如何启用JavaScript
    如何启用JavaScript

    JavaScript启用方法有内联脚本、内部脚本、外部脚本和异步加载。详细介绍:1、内联脚本是将JavaScript代码直接嵌入到HTML标签中;2、内部脚本是将JavaScript代码放置在HTML文件的`<script>`标签中;3、外部脚本是将JavaScript代码放置在一个独立的文件;4、外部脚本是将JavaScript代码放置在一个独立的文件。

    656

    2023.09.12

    Js中Symbol类详解
    Js中Symbol类详解

    javascript中的Symbol数据类型是一种基本数据类型,用于表示独一无二的值。Symbol的特点:1、独一无二,每个Symbol值都是唯一的,不会与其他任何值相等;2、不可变性,Symbol值一旦创建,就不能修改或者重新赋值;3、隐藏性,Symbol值不会被隐式转换为其他类型;4、无法枚举,Symbol值作为对象的属性名时,默认是不可枚举的。

    551

    2023.09.20

    php与html混编教程大全
    php与html混编教程大全

    本专题整合了php和html混编相关教程,阅读专题下面的文章了解更多详细内容。

    3

    2026.01.13

    热门下载

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

    精品课程

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

    共14课时 | 0.8万人学习

    Bootstrap 5教程
    Bootstrap 5教程

    共46课时 | 2.9万人学习

    CSS教程
    CSS教程

    共754课时 | 18.7万人学习

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

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