引言

在页面加载数据时,通常使用占位元素来代替未请求回来数据的元素,用以提升用户体验。而卡片式的占位元素通常称为 Skeleton 即骨架屏。

代码

  1. <div class="card loading">
  2. <div class="image"></div>
  3. <div class="content">
  4. <h4></h4>
  5. <div class="description"></div>
  6. </div>
  7. </div>
  1. :root {
  2. --loading-grey: #eee;
  3. }
  4. /* 卡片基础样式 */
  5. .card {
  6. width: 320px;
  7. background-color: #fff;
  8. overflow: hidden;
  9. border-radius: 6px;
  10. box-shadow: 0px 4px 6px rgba(0, 0, 0, .12);
  11. }
  12. .card .image {
  13. height: 200px;
  14. }
  15. .card .content {
  16. padding: 2rem 1.8rem;
  17. }
  18. .card .content h4 {
  19. margin: 0 0 1rem;
  20. }
  21. /* 卡片 loading 样式 */
  22. .card.loading .content h4 {
  23. min-height: 1.6rem;
  24. border-radius: 4px;
  25. animation-delay: .05s;
  26. }
  27. .card.loading .content .description {
  28. min-height: 4rem;
  29. border-radius: 4px;
  30. animation-delay: .06s;
  31. }
  32. @keyframes loading {
  33. to {
  34. background-position-x: -20%;
  35. }
  36. }
  37. .card.loading .image,
  38. .card.loading .content h4,
  39. .card.loading .content .description {
  40. background-color: var(--loading-grey);
  41. background: linear-gradient(100deg, rgba(255, 255, 255, 0) 40%, rgba(255, 255, 255, .5) 50%, rgba(255, 255, 255, 0) 60%) var(--loading-grey);
  42. background-size: 200% 100%;
  43. background-position-x: 180%;
  44. animation: 1s loading ease-in-out infinite;
  45. }

效果

Skeleton 骨架屏.gif

参考资料