使用CSS自定义属性构建骨架屏

栏目: CSS · 发布时间: 6年前

内容简介:随着我们对移动体验的期望发生变化,我们对性能的理解也在变化。我们期望网络应用程序感觉像本机应用程序一样快速响应,无论其当前的网络覆盖范围如何。对于Web应用程序,这个概念可能包括显示文本,图像或其他内容元素的“模型” - 称为

写在前面

几天前看到薄荷前端团队分享的《 前端骨架屏方案小结 》,突然想起一年前看到的max bock写的《 Building Skeleton Screens with CSS Custom Properties 》,翻译整理写下出此文,分享一下使用CSS自定义属性构建骨架屏的技巧,先看骨架屏demo效果吧

使用CSS自定义属性构建骨架屏

设计Web上的加载状态常常被忽略或被认为是事后考虑。性能不仅是前端开发人员的职责,构建与慢速连接一起工作的体验也是设计挑战。 虽然前端开发人员需要注意一些事情,比如压缩和缓存,但是设计人员必须考虑UI处于“加载”或“离线”状态时的外观和行为。

速度幻觉

随着我们对移动体验的期望发生变化,我们对性能的理解也在变化。我们期望网络应用程序感觉像本机应用程序一样快速响应,无论其当前的网络覆盖范围如何。

感知性能 是衡量用户感觉速度的尺度。这个想法是用户更有耐心,并且如果他们知道正在发生什么,并且在内容实际存在之前能够预测内容,那么他们会认为系统更快。这在很大程度上与管理期望和保持用户知情有关。

对于Web应用程序,这个概念可能包括显示文本,图像或其他内容元素的“模型” - 称为

骨架屏 :skull:。可以在网上可以看到,Facebook,Google,Slack等公司使用:

使用CSS自定义属性构建骨架屏 (Facebook的骨架屏)

使用CSS自定义属性构建骨架屏

(Slack的骨架屏)

例子

假设你正在构建一个Web应用程序,这是一种旅行建议类型的东西,人们可以分享他们的旅行和推荐地点,所以你的主要内容可能看起来像这样:

使用CSS自定义属性构建骨架屏

您可以将该卡片缩小到其基本视觉形状(UI组件的骨架)

使用CSS自定义属性构建骨架屏

每当有人从服务器请求新内容时,您可以立即开始显示骨架,同时在后台加载数据。内容准备就绪后,只需将骨架换成实际卡即可。这可以使用普通的JavaScript或使用像Vue/React这样的库来完成。

现在我们可以使用图像来显示骨架,但这会引入额外的请求和数据开销。我们已经在这里加载了东西,所以等待另一个图像首先加载并不是一个好方式。此外,它没有响应,如果我们决定调整一些内容卡的样式,我们将不得不复制骨架图像的更改,以便它们再次匹配。:unamused:

一个更好的解决方案是只用CSS创建整个东西 。没有额外的请求,最小的开销,甚至没有任何额外的标记。我们可以用下面的方式来构建它,使以后更改设计变得更容易。

通过CSS绘制骨架

首先,我们需要绘制构成卡片骨架的基本形状。我们可以通过background-image属性添加不同的渐变来实现这一点。默认情况下,线性渐变从上到下运行,有不同的颜色停止过渡。如果我们只定义一个颜色停止,并使其余颜色保持透明,我们可以绘制形状。

请记住,在这块,多个背景图像堆叠在一起,因此顺序非常重要。最后一个渐变定义在后面,第一个位于前面。

.skeleton {
  background-repeat: no-repeat;
  background-image:
    radial-gradient(circle 16px, white 99%, transparent 0), /* 第3层 头像 */
    linear-gradient(white 40px, transparent 0), /* 第2层 标题 */
    linear-gradient(gray 100%, transparent 0); /* 第1层 卡片背景 */
}
复制代码

这些形状拉伸来填充整个空间,就像常规的块级元素一样。如果我们想要改变它,我们必须为它们定义明确的尺寸。 background-size 的值来设置每个图层的宽度和高度,保持我们使用的相同顺序 background-image

.skeleton {
  background-size:
    32px 32px,  /* 头像 */
    200px 40px,  /* 标题 */
    100% 100%; /* 卡片背景 */
}
复制代码

最后一步是将元素放在卡片上。这与position:absolute类似,表示left和top属性的值一样。例如,例如:我们可以给头像和标题 模拟24px的填充,以匹配真实内容卡的外观。

.skeleton {
  background-position:
    24px 24px,  /* 头像 */
    24px 200px, /* 标题 */
    0 0;        /* 卡片背景 */
}
复制代码

使用自定义属性将其分解

这在一个简单的例子中效果很好, 但是如果我们想要构建一些稍微复杂的东西,那么CSS会很快变得混乱并且很难阅读。如果代码交接给另外一个前端开发人员,他们就不知道所有这些神奇的数字来是从哪里来的,显然这是不易难维护的。

于是乎,这里提出用自定义CSS属性,以更加简洁,更有利于前端开发人员的方式编写骨架样式 ,甚至可以考虑不同值之间的关系:

.skeleton {
  /*
    定义单独的属性
  */
  --card-height: 340px;
  --card-padding:24px;
  --card-skeleton: linear-gradient(gray var(--card-height), transparent 0);

  --title-height: 32px;
  --title-width: 200px;
  --title-position: var(--card-padding) 180px;
  --title-skeleton: linear-gradient(white var(--title-height), transparent 0);

  --avatar-size: 32px;
  --avatar-position: var(--card-padding) var(--card-padding);
  --avatar-skeleton: radial-gradient(
    circle calc(var(--avatar-size) / 2), 
    white 99%, 
    transparent 0
  );

  /* 
    现在我们可以把背景分解成单独的形状
  */
  background-image: 
    var(--avatar-skeleton),
    var(--title-skeleton),
    var(--card-skeleton);

  background-size:
    var(--avatar-size),
    var(--title-width) var(--title-height),
    100% 100%;

  background-position:
    var(--avatar-position),
    var(--title-position),
    0 0;
}
复制代码

这不仅可读性更好,而且以后更改一些值也更容易。另外,我们还可以使用一些变量(比如头像大小、卡片填充)来定义实际卡片的样式,并始终使其与骨架版本保持同步。添加一个媒体查询来调整不同断点的骨架部分现在也非常简单:

@media screen and (min-width: 47em) {
  :root {
    --card-padding: 32px;
    --card-height: 360px;
  }
}
复制代码

ps:浏览器对自定义属性的支持很好,但不是100%。基本上,所有现代浏览器都有支持,IE / Edge有点晚了。对于这个特定用例,使用Sass变量很容易添加回退。

添加动画

为了使这更好,我们可以为我们的骨架设置动画,并使其看起来更像是一个加载指示器。

我们需要做的就是在顶层放置一个新的渐变,然后使用它来设置其位置的动画 @keyframes

以下是成品骨架卡外观的完整 骨架屏-demo

使用CSS自定义属性构建骨架屏

当然你可以使用:empty选择器和伪元素来绘制骨架,因此它只适用于空卡片元素。一旦注入了内容,框架屏幕就会自动消失。

最后,感兴趣的同学可去我github下载这个 骨架屏-demo源码传送门


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Parsing Techniques

Parsing Techniques

Dick Grune、Ceriel J.H. Jacobs / Springer / 2010-2-12 / USD 109.00

This second edition of Grune and Jacobs' brilliant work presents new developments and discoveries that have been made in the field. Parsing, also referred to as syntax analysis, has been and continues......一起来看看 《Parsing Techniques》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

随机密码生成器
随机密码生成器

多种字符组合密码

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换