网易首页 > 网易号 > 正文 申请入驻

web前端培训如何使用CSS自定义属性实现骨架屏

0
分享至

项目要不要加载loading状态通常是在项目完成后才考虑的事情,当然,有时候直接就不考虑了。

开发人员的职责不只是提高性能,同时优化网络差时,请求接口缓慢导致的页面的慢渲染也是非常重要的。

速度的错觉

随着我们对移动体验的期望的变化,我们对性能的理解也在变化。我们期望,无论当前的网络如何,web页面都能像原生应用程序一样顺滑,一样快速响应。

骨架屏的出现。这个想法使得用户更有耐心,因为他们知道正在发生什么,并且在内容实际存在之前能够预测内容,那么他们会认为系统更快。这在很大程度上保持了用户等待的热情。

骨架屏

这个概念可能包括显示文本,图像或其他内容元。可以在网上可以看到骨架屏的使用已经非常广泛,Facebook,Google,Slack等公司都在使用。

每当有人从服务器请求新内容时,您可以立即开始显示骨架,同时在后台加载数据。内容准备就绪后,只需将骨架换成实际卡即可。

您可以使用图像来显示骨架,但这会引入额外的请求和数据开销。我们本身已经在这里加载了东西,【关注尚硅谷,轻松学IT】所以还要去等待另一个图像先加载,这可不是一个好主意。另外图片不是响应式的,如果我们决定调整卡片的样式,我们将不得不更改骨架图像,以便它们再次匹配。

一个更好的解决方案是只用 CSS 创建骨架屏。没有额外的请求,最小的开销。而且以后修改更加的方便快捷。

CSS 中绘制骨架

首先,我们需要绘制构成卡片骨架的基本形状。

我们可以通过向background-image属性添加不同的渐变来做到这一点。默认情况下,线性渐变从上到下运行,具有不同的颜色过渡。如果我们只定义一个色标,其余的保持透明,我们就可以绘制形状。

请记住,多个背景图像在这里堆叠在一起,因此顺序很重要。最后一个渐变定义将展示在后面,最先定义的展示在前面。

.skeleton {

background-repeat: no-repeat;

background-image:

/* layer 2: avatar */

/* white circle with 16px radius */

radial-gradient(circle 16px, white 99%, transparent 0),

/* layer 1: title */

/* white rectangle with 40px height */

linear-gradient(white 40px, transparent 0),

/* layer 0: card bg */

/* gray rectangle that covers whole element */

linear-gradient(gray 100%, transparent 0);

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

.skeleton {

background-size:

32px 32px, /* 头像 */

200px 40px, /* 标题 */

100% 100%; /* 卡片背景 */

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

.skeleton {

background-position:

24px 24px, /* 头像 */

24px 200px, /* 标题 */

0 0; /* 卡片背景 */

使用自定义属性

如果我们想构建一些稍微复杂一点的东西,CSS 很快就会变得混乱并且很难阅读。如果将代码交给其他开发人员,他们将不知道所有这些神奇数字的来源。维护它肯定会很糟糕。

值得庆幸的是,我们现在可以使用CSS 自定义属性,以更简洁、对开发人员更友好的方式来编写骨架样式。

.skeleton {

define as separate properties

--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

now we can break the background up

into individual shapes

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;

这不仅更具可读性,而且以后更改一些值也更容易。另外,我们可以使用一些变量(像 --avatar-size、--card-padding等)来定义实际卡片的样式,并始终使其与骨架版本保持同步。

添加一个媒体查询来调整不同断点的部分骨架现在也很简单:

@media screen and (min-width: 47em) {

:root {

--card-padding: 32px;

--card-height: 360px;

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

添加动画

为了使它更好,我们可以为www.atguigu.com我们的骨架设置动画,让它看起来更像一个加载指示器。我们需要做的就是在顶层放置一个新的渐变,然后用@keyframes.

这是完成骨架卡外观的完整示例:

可以查看预览:https://codepen.io/mxbck/pen/EvmLVp

* Variables

:root {

--card-padding: 24px;

--card-height: 340px;

--card-skeleton: linear-gradient(lightgrey var(--card-height), transparent 0);

--avatar-size: 32px;

--avatar-position: var(--card-padding) var(--card-padding);

--avatar-skeleton: radial-gradient(circle 16px at center, white 99%, transparent 0

--title-height: 32px;

--title-width: 200px;

--title-position: var(--card-padding) 180px;

--title-skeleton: linear-gradient(white var(--title-height), transparent 0);

--desc-line-height: 16px;

--desc-line-skeleton: linear-gradient(white var(--desc-line-height), transparent 0);

--desc-line-1-width:230px;

--desc-line-1-position: var(--card-padding) 242px;

--desc-line-2-width:180px;

--desc-line-2-position: var(--card-padding) 265px;

--footer-height: 40px;

--footer-position: 0 calc(var(--card-height) - var(--footer-height));

--footer-skeleton: linear-gradient(white var(--footer-height), transparent 0);

--blur-width: 200px;

--blur-size: var(--blur-width) calc(var(--card-height) - var(--footer-height));

* Card Skeleton for Loading

.card {

width: 280px; //demo

height: var(--card-height);

&:empty::after {

content:"";

display:block;

width: 100%;

height: 100%;

border-radius:6px;

box-shadow: 0 10px 45px rgba(0,0,0, .1);

background-image:

linear-gradient(

90deg,

rgba(lightgrey, 0) 0,

rgba(lightgrey, .8) 50%,

rgba(lightgrey, 0) 100%

), //animation blur

var(--title-skeleton), //title

var(--desc-line-skeleton), //desc1

var(--desc-line-skeleton), //desc2

var(--avatar-skeleton), //avatar

var(--footer-skeleton), //footer bar

var(--card-skeleton) //card

background-size:

var(--blur-size),

var(--title-width) var(--title-height),

var(--desc-line-1-width) var(--desc-line-height),

var(--desc-line-2-width) var(--desc-line-height),

var(--avatar-size) var(--avatar-size),

100% var(--footer-height),

100% 100%

background-position:

-150% 0, //animation

var(--title-position), //title

var(--desc-line-1-position), //desc1

var(--desc-line-2-position), //desc2

var(--avatar-position), //avatar

var(--footer-position), //footer bar

0 0 //card

background-repeat: no-repeat;

animation: loading 1.5s infinite;

@keyframes loading {

to {

background-position:

350% 0,

var(--title-position),

var(--desc-line-1-position),

var(--desc-line-2-position),

var(--avatar-position),

var(--footer-position),

0 0

* Demo Stuff

body {

min-height:100vh;

background-color:#FFF;

display:flex;

justify-content:center;

align-items:center;

文章来源于程序员成长指北

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
10年0冠,6万人涌入球场,61岁穆帅签约费内巴切:从此你我一体!

10年0冠,6万人涌入球场,61岁穆帅签约费内巴切:从此你我一体!

风过乡
2024-06-03 07:12:44
36岁,社区打电话催生三胎,我答:没空生,对方一句话差点气死我

36岁,社区打电话催生三胎,我答:没空生,对方一句话差点气死我

婉秋聊育儿
2024-06-03 11:16:04
不可思议!网传某劳动仲裁大队多人被精简优化,集体申请劳动仲裁

不可思议!网传某劳动仲裁大队多人被精简优化,集体申请劳动仲裁

小萝卜丝
2024-06-03 10:43:02
比亚迪卖疯了!5月新能源车卖了超33万辆!赛力斯也发布了成绩单

比亚迪卖疯了!5月新能源车卖了超33万辆!赛力斯也发布了成绩单

每日经济新闻
2024-06-02 17:10:07
“铁头”涂鸦靖国神社后,在日华人第一时间报警,称警察很感谢我

“铁头”涂鸦靖国神社后,在日华人第一时间报警,称警察很感谢我

不掉线电波
2024-06-03 09:40:43
风波升级!日本人为了抓铁头,将悬赏金加到1000万,一些华人加入

风波升级!日本人为了抓铁头,将悬赏金加到1000万,一些华人加入

辣条小剧场
2024-06-03 08:00:12
队史最大错误!克罗斯要千万欧年薪,拜仁只给600万称其非世界级

队史最大错误!克罗斯要千万欧年薪,拜仁只给600万称其非世界级

直播吧
2024-06-02 23:59:04
周琦续约了没?朱芳雨:我还在努力

周琦续约了没?朱芳雨:我还在努力

直播吧
2024-06-03 08:10:10
突发跳水!大跌25%

突发跳水!大跌25%

中国基金报
2024-06-03 11:01:23
县城工资,重回“3000块”时代

县城工资,重回“3000块”时代

曹多鱼的财经世界
2024-06-03 09:31:28
没底线!漫展模仿科比遇难现场,球迷出离愤怒,Cos圈却不知悔改

没底线!漫展模仿科比遇难现场,球迷出离愤怒,Cos圈却不知悔改

末位侃球
2024-06-03 09:12:25
差点就信了!要不是直升机露馅,真能当“艾森豪威尔”号遇袭照

差点就信了!要不是直升机露馅,真能当“艾森豪威尔”号遇袭照

农村教育光哥
2024-06-03 11:17:21
恐怖!网传台州石人峡突发户外穿越事故,两人在众人面前被水冲走

恐怖!网传台州石人峡突发户外穿越事故,两人在众人面前被水冲走

火山诗话
2024-06-03 08:52:52
中国的土地,已经卖了50万亿了!土地卖完后,地方政府从哪里搞钱

中国的土地,已经卖了50万亿了!土地卖完后,地方政府从哪里搞钱

说故事的阿袭
2024-06-03 08:19:44
蜡笔小新导演鴫野彰去世,终年70岁

蜡笔小新导演鴫野彰去世,终年70岁

澎湃新闻
2024-06-03 13:16:37
噩耗!武汉派出所副所长因公殉职,被歹徒狂刺15刀,抓捕现场曝光

噩耗!武汉派出所副所长因公殉职,被歹徒狂刺15刀,抓捕现场曝光

六毛朵朵
2024-06-03 11:29:26
疫情后封闭至今?上海八旬老人无奈:去医院要多走一倍路!官方回应后,阿姨仍无法接受

疫情后封闭至今?上海八旬老人无奈:去医院要多走一倍路!官方回应后,阿姨仍无法接受

上观新闻
2024-06-03 10:23:03
突然决定不要了!广东队被迫放弃强力中锋,要价超1500万逼走宏远

突然决定不要了!广东队被迫放弃强力中锋,要价超1500万逼走宏远

绯雨儿
2024-06-03 11:59:12
网传某省立医院内,一座18层的楼,有7层都是干部病房

网传某省立医院内,一座18层的楼,有7层都是干部病房

小萝卜丝
2024-06-03 14:28:45
12个国家“授权”可以攻击俄罗斯本土!国防大学教授的灵魂拷问

12个国家“授权”可以攻击俄罗斯本土!国防大学教授的灵魂拷问

深度知局
2024-05-31 17:48:38
2024-06-03 16:16:49
IT爱好者小尚
IT爱好者小尚
分享IT教育类信息
630文章数 55关注度
往期回顾 全部

科技要闻

2万字演讲|黄仁勋剧透 未来3年新品有这些

头条要闻

白宫:拜登明白允许乌军使用美国武器打击俄领土的后果

头条要闻

白宫:拜登明白允许乌军使用美国武器打击俄领土的后果

体育要闻

万人空巷!皇马举行欧冠夺冠庆典

娱乐要闻

混战升级!编剧赵冬苓力挺王阳遭围攻

财经要闻

接班100天,宗馥莉急了

汽车要闻

搭载华为HiCAR 传祺M6 MAX售14.58万元

态度原创

游戏
艺术
教育
本地
公开课

暴雪宣布魔兽世界进入云时代!玩家表示非常爽,能用主机和手柄玩

艺术要闻

穿越时空的艺术:《马可·波罗》AI沉浸影片探索人类文明

教育要闻

我家小孩7岁能开汽车!家长发圈炫耀,该给玩心大的家长立法了!

本地新闻

食味印象|歙县限定!枇杷味儿的清甜初夏

公开课

近视只是视力差?小心并发症

无障碍浏览 进入关怀版