几天前看到薄荷前端团队分享的《前端骨架屏方案小结》,忽然回想起一年前看到的max bock写的《Building Skeleton Screens with CSS Custom Properties》,翻译整理写下出此文,分享一下使用CSS自定义属性构建骨架屏的技巧,先看骨架屏demo效果吧css
设计Web上的加载状态经常被忽略或被认为是过后考虑。性能不只是前端开发人员的职责,构建与慢速链接一块儿工做的体验也是设计挑战。 虽然前端开发人员须要注意一些事情,好比压缩和缓存,可是设计人员必须考虑UI处于“加载”或“离线”状态时的外观和行为。前端
感知性能是衡量用户感受速度的尺度。这个想法是用户更有耐心,而且若是他们知道正在发生什么,而且在内容实际存在以前可以预测内容,那么他们会认为系统更快。这在很大程度上与管理指望和保持用户知情有关。
git
(Facebook的骨架屏)
github
(Slack的骨架屏)浏览器
.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层 卡片背景 */ }
.skeleton { background-size: 32px 32px, /* 头像 */ 200px 40px, /* 标题 */ 100% 100%; /* 卡片背景 */ }
最后一步是将元素放在卡片上。这与position:absolute相似,表示left和top属性的值同样。例如,例如:咱们能够给头像和标题 模拟24px的填充,以匹配真实内容卡的外观。
缓存
.skeleton { background-position: 24px 24px, /* 头像 */ 24px 200px, /* 标题 */ 0 0; /* 卡片背景 */ }
.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; }
这不只可读性更好,并且之后更改一些值也更容易。另外,咱们还可使用一些变量(好比头像大小、卡片填充)来定义实际卡片的样式,并始终使其与骨架版本保持同步。添加一个媒体查询来调整不一样断点的骨架部分如今也很是简单:bash
@media screen and (min-width: 47em) { :root { --card-padding: 32px; --card-height: 360px; } }
ps:浏览器对自定义属性的支持很好,但不是100%。基本上,全部现代浏览器都有支持,IE / Edge有点晚了。对于这个特定用例,使用Sass变量很容易添加回退。服务器
固然你可使用:empty选择器和伪元素来绘制骨架,所以它只适用于空卡片元素,一旦注入了内容,框架屏幕就会自动消失。
网络
最后,感兴趣的同窗可去我github下载这个骨架屏-demo源码传送门框架