index.less 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. @import '../../style/themes/index';
  2. @import '../../style/mixins/index';
  3. @skeleton-prefix-cls: ~'@{ant-prefix}-skeleton';
  4. @skeleton-avatar-prefix-cls: ~'@{skeleton-prefix-cls}-avatar';
  5. @skeleton-title-prefix-cls: ~'@{skeleton-prefix-cls}-title';
  6. @skeleton-paragraph-prefix-cls: ~'@{skeleton-prefix-cls}-paragraph';
  7. @skeleton-button-prefix-cls: ~'@{skeleton-prefix-cls}-button';
  8. @skeleton-input-prefix-cls: ~'@{skeleton-prefix-cls}-input';
  9. @skeleton-image-prefix-cls: ~'@{skeleton-prefix-cls}-image';
  10. @skeleton-block-radius: @border-radius-base;
  11. .@{skeleton-prefix-cls} {
  12. display: table;
  13. width: 100%;
  14. &-header {
  15. display: table-cell;
  16. padding-right: @padding-md;
  17. vertical-align: top;
  18. // Avatar
  19. .@{skeleton-avatar-prefix-cls} {
  20. .skeleton-element-avatar();
  21. }
  22. }
  23. &-content {
  24. display: table-cell;
  25. width: 100%;
  26. vertical-align: top;
  27. // Title
  28. .@{skeleton-title-prefix-cls} {
  29. width: 100%;
  30. height: @skeleton-title-height;
  31. background: @skeleton-color;
  32. border-radius: @skeleton-block-radius;
  33. + .@{skeleton-paragraph-prefix-cls} {
  34. margin-top: @skeleton-title-paragraph-margin-top;
  35. }
  36. }
  37. // paragraph
  38. .@{skeleton-paragraph-prefix-cls} {
  39. padding: 0;
  40. > li {
  41. width: 100%;
  42. height: @skeleton-paragraph-li-height;
  43. list-style: none;
  44. background: @skeleton-color;
  45. border-radius: @skeleton-block-radius;
  46. &:last-child:not(:first-child):not(:nth-child(2)) {
  47. width: 61%;
  48. }
  49. + li {
  50. margin-top: @skeleton-paragraph-li-margin-top;
  51. }
  52. }
  53. }
  54. }
  55. &-with-avatar &-content {
  56. // Title
  57. .@{skeleton-title-prefix-cls} {
  58. margin-top: @margin-sm;
  59. + .@{skeleton-paragraph-prefix-cls} {
  60. margin-top: @skeleton-paragraph-margin-top;
  61. }
  62. }
  63. }
  64. &-round &-content {
  65. .@{skeleton-title-prefix-cls},
  66. .@{skeleton-paragraph-prefix-cls} > li {
  67. border-radius: 100px;
  68. }
  69. }
  70. // With active animation
  71. &-active {
  72. .@{skeleton-title-prefix-cls},
  73. .@{skeleton-paragraph-prefix-cls} > li,
  74. .@{skeleton-avatar-prefix-cls},
  75. .@{skeleton-button-prefix-cls},
  76. .@{skeleton-input-prefix-cls},
  77. .@{skeleton-image-prefix-cls} {
  78. .skeleton-color();
  79. }
  80. }
  81. // Skeleton Block Button, Input
  82. &.@{skeleton-prefix-cls}-block {
  83. width: 100%;
  84. .@{skeleton-button-prefix-cls} {
  85. width: 100%;
  86. }
  87. .@{skeleton-input-prefix-cls} {
  88. width: 100%;
  89. }
  90. }
  91. // Skeleton element
  92. &-element {
  93. display: inline-block;
  94. width: auto;
  95. .@{skeleton-button-prefix-cls} {
  96. .skeleton-element-button();
  97. }
  98. .@{skeleton-avatar-prefix-cls} {
  99. .skeleton-element-avatar();
  100. }
  101. .@{skeleton-input-prefix-cls} {
  102. .skeleton-element-input();
  103. }
  104. .@{skeleton-image-prefix-cls} {
  105. .skeleton-element-image();
  106. }
  107. }
  108. }
  109. // Button
  110. .skeleton-element-button() {
  111. display: inline-block;
  112. vertical-align: top;
  113. background: @skeleton-color;
  114. border-radius: @border-radius-base;
  115. .skeleton-element-button-size(@btn-height-base);
  116. &-lg {
  117. .skeleton-element-button-size(@btn-height-lg);
  118. }
  119. &-sm {
  120. .skeleton-element-button-size(@btn-height-sm);
  121. }
  122. }
  123. // Avatar
  124. .skeleton-element-avatar() {
  125. display: inline-block;
  126. vertical-align: top;
  127. background: @skeleton-color;
  128. .skeleton-element-avatar-size(@avatar-size-base);
  129. &-lg {
  130. .skeleton-element-avatar-size(@avatar-size-lg);
  131. }
  132. &-sm {
  133. .skeleton-element-avatar-size(@avatar-size-sm);
  134. }
  135. }
  136. // Input
  137. .skeleton-element-input() {
  138. display: inline-block;
  139. vertical-align: top;
  140. background: @skeleton-color;
  141. .skeleton-element-input-size(@input-height-base);
  142. &-lg {
  143. .skeleton-element-input-size(@input-height-lg);
  144. }
  145. &-sm {
  146. .skeleton-element-input-size(@input-height-sm);
  147. }
  148. }
  149. // Image
  150. .skeleton-element-image() {
  151. display: flex;
  152. align-items: center;
  153. justify-content: center;
  154. vertical-align: top;
  155. background: @skeleton-color;
  156. .skeleton-element-image-size(@image-size-base*2);
  157. &-path {
  158. fill: #bfbfbf;
  159. }
  160. &-svg {
  161. .skeleton-element-image-size(@image-size-base);
  162. max-width: @image-size-base * 4;
  163. max-height: @image-size-base * 4;
  164. }
  165. }
  166. .skeleton-element-avatar-size(@size) {
  167. width: @size;
  168. .skeleton-element-common-size(@size);
  169. &.@{skeleton-avatar-prefix-cls}-circle {
  170. border-radius: 50%;
  171. }
  172. }
  173. .skeleton-element-button-size(@size) {
  174. width: @size * 2;
  175. min-width: @size * 2;
  176. .skeleton-element-common-size(@size);
  177. &.@{skeleton-button-prefix-cls}-square {
  178. width: @size;
  179. min-width: @size;
  180. }
  181. &.@{skeleton-button-prefix-cls}-circle {
  182. width: @size;
  183. min-width: @size;
  184. border-radius: 50%;
  185. }
  186. &.@{skeleton-button-prefix-cls}-round {
  187. border-radius: @size;
  188. }
  189. }
  190. .skeleton-element-input-size(@size) {
  191. width: @size * 5;
  192. min-width: @size * 5;
  193. .skeleton-element-common-size(@size);
  194. }
  195. .skeleton-element-image-size(@size) {
  196. width: @size;
  197. .skeleton-element-common-size(@size);
  198. &.@{skeleton-image-prefix-cls}-circle {
  199. border-radius: 50%;
  200. }
  201. }
  202. .skeleton-element-common-size(@size) {
  203. height: @size;
  204. line-height: @size;
  205. }
  206. .skeleton-color() {
  207. position: relative;
  208. // fix https://github.com/ant-design/ant-design/issues/36444
  209. // https://monshin.github.io/202109/css/safari-border-radius-overflow-hidden/
  210. /* stylelint-disable-next-line property-no-vendor-prefix,value-no-vendor-prefix */
  211. z-index: 0;
  212. overflow: hidden;
  213. background: transparent;
  214. &::after {
  215. position: absolute;
  216. top: 0;
  217. right: -150%;
  218. bottom: 0;
  219. left: -150%;
  220. background: linear-gradient(
  221. 90deg,
  222. @skeleton-color 25%,
  223. @skeleton-to-color 37%,
  224. @skeleton-color 63%
  225. );
  226. animation: ~'@{skeleton-prefix-cls}-loading' 1.4s ease infinite;
  227. content: '';
  228. }
  229. }
  230. @keyframes ~"@{skeleton-prefix-cls}-loading" {
  231. 0% {
  232. transform: translateX(-37.5%);
  233. }
  234. 100% {
  235. transform: translateX(37.5%);
  236. }
  237. }
  238. @import './rtl';