CSS
2021-05-31-09-14-58-047493.gif
该动画效果就比较复杂了,用到的知识比较多,例如 「css伪元素 、元素自定义属性 、蒙版属性 、animation动画等等」

标签元素部分

  1. <body>
  2. <div class="txt" data-text="我是故障风格的文字">
  3. 我是故障风格的文字
  4. </div>
  5. </body>

这里使用了自定义属性,即 「data-」 加上自定义的属性名,将文字内容作为该属性的值,方便之后伪元素获取到对应的文字

@keyframes部分」

  1. @keyframes animation-before{
  2. 0% {
  3. clip-path: inset(0 0 0 0);
  4. }
  5. 5% {
  6. clip-path: inset(.8em 0 .4em 0);
  7. }
  8. 10% {
  9. clip-path: inset(.4em 0 .8em 0);
  10. }
  11. 15% {
  12. clip-path: inset(.1em 0 1em 0);
  13. }
  14. 20% {
  15. clip-path: inset(.3em 0 .6em 0);
  16. }
  17. 25% {
  18. clip-path: inset(.6em 0 .3em 0);
  19. }
  20. 30% {
  21. clip-path: inset(.8em 0 .5em 0);
  22. }
  23. 35% {
  24. clip-path: inset(1em 0 .1em 0);
  25. }
  26. 40% {
  27. clip-path: inset(.7em 0 .35em 0);
  28. }
  29. 45% {
  30. clip-path: inset(.5em 0 .2em 0);
  31. }
  32. 50% {
  33. clip-path: inset(.2em 0 .5em 0);
  34. }
  35. 55% {
  36. clip-path: inset(.35em 0 .7em 0);
  37. }
  38. 60% {
  39. clip-path: inset(.1em 0 .9em 0);
  40. }
  41. 65% {
  42. clip-path: inset(.8em 0 .46em 0);
  43. }
  44. 70% {
  45. clip-path: inset(.66em 0 .33em 0);
  46. }
  47. 75% {
  48. clip-path: inset(.48em 0 .23em 0);
  49. }
  50. 80% {
  51. clip-path: inset(.23em 0 .48em 0);
  52. }
  53. 85% {
  54. clip-path: inset(.39em 0 .79em 0);
  55. }
  56. 90% {
  57. clip-path: inset(.33em 0 .66em 0);
  58. }
  59. 95% {
  60. clip-path: inset(1em 0 .3em 0);
  61. }
  62. 100% {
  63. clip-path: inset(.62em 0 .29em 0);
  64. }
  65. }
  66. @keyframes animation-after{
  67. 0% {
  68. clip-path: inset(0 0 0 0);
  69. }
  70. 5% {
  71. clip-path: inset(.4em 0 .8em 0);
  72. }
  73. 10% {
  74. clip-path: inset(.8em 0 .4em 0);
  75. }
  76. 15% {
  77. clip-path: inset(1em 0 .1em 0);
  78. }
  79. 20% {
  80. clip-path: inset(.6em 0 .3em 0);
  81. }
  82. 25% {
  83. clip-path: inset(.3em 0 .6em 0);
  84. }
  85. 30% {
  86. clip-path: inset(.5em 0 .8em 0);
  87. }
  88. 35% {
  89. clip-path: inset(.1em 0 1em 0);
  90. }
  91. 40% {
  92. clip-path: inset(.35em 0 .7em 0);
  93. }
  94. 45% {
  95. clip-path: inset(.2em 0 .5em 0);
  96. }
  97. 50% {
  98. clip-path: inset(.5em 0 .2em 0);
  99. }
  100. 55% {
  101. clip-path: inset(.7em 0 .35em 0);
  102. }
  103. 60% {
  104. clip-path: inset(.9em 0 .1em 0);
  105. }
  106. 65% {
  107. clip-path: inset(.46em 0 .8em 0);
  108. }
  109. 70% {
  110. clip-path: inset(.3em 0 .66em 0);
  111. }
  112. 75% {
  113. clip-path: inset(.23em 0 .48em 0);
  114. }
  115. 80% {
  116. clip-path: inset(.48em 0 .23em 0);
  117. }
  118. 85% {
  119. clip-path: inset(.79em 0 .39em 0);
  120. }
  121. 90% {
  122. clip-path: inset(.66em 0 .33em 0);
  123. }
  124. 95% {
  125. clip-path: inset(.3em 0 1em 0);
  126. }
  127. 100% {
  128. clip-path: inset(.29em 0 .62em 0);
  129. }
  130. }

这里设置了两个keyframes,分别为 「animation-before」 、「animation-after」
想必已经很明显了,前者是准备给后面的伪元素 before 使用的 ;后者是给后面的伪元素 after 使用的
那么其中用到的 clip-path 是干什么用的呢?这个是css3的一个新属性,叫做「蒙版」,而其中的 inset() 值表示的是蒙版形状为矩形
来看一下它的用法
首先 inset() 接收四个长度参数,分别表示蒙版距离元素标签的「上侧」 、「右侧」 、「下侧」 、「左侧」的距离,从而决定了蒙版的大小
当设置为 inset(0 0 0 0)时,表示蒙版作用区域大小跟元素标签一样大,如下图所示(红色边框表示蒙版的作用区域)
2021-05-31-09-14-58-128392.png
此时文字是可以完全展示出来的,因为蒙版的作用区域就是标签元素的大小
然后再来看一下,如果设置为 inset(30px 0 0 0) ,则测试表示,蒙版的作用区域距离标签元素的上侧 30px,距离其它的边 0px,如图所示
2021-05-31-09-14-58-191273.png
图中蓝色边框的部分不是蒙版的作用区域,因此无法看到该区域的内容,真实情况如下图所示
2021-05-31-09-14-58-297995.png
在了解了蒙版的使用情况了以后,就通过 @keyframes 来设置逐帧动画,使蒙版的作用区域在垂直方向一直变化,实现上下抖动的效果,代码就如上所述

具体样式

  1. body{
  2. height: 100vh;
  3. display: flex;
  4. justify-content: center;
  5. align-items: center;
  6. background: black;
  7. }
  8. .txt{
  9. display: inline-block;
  10. font-size: 65px;
  11. font-weight: 600;
  12. padding: 0 4px;
  13. color: white;
  14. position: relative;
  15. }
  16. .txt::before{
  17. /* 获取文本 */
  18. content: attr(data-text);
  19. position: absolute;
  20. /* 向左侧移2px */
  21. left: -2px;
  22. width: 100%;
  23. /* 将背景色设为与主背景同样的颜色,用于遮挡标签元素 */
  24. background: black;
  25. /* 给before伪元素的文本添加左侧2px大小的红色文字阴影 */
  26. text-shadow:2px 0 red;
  27. /* 应用蒙版垂直变化动画,并一直循环 */
  28. animation: animation-before 3s infinite linear alternate-reverse;
  29. }
  30. .txt::after{
  31. /* 获取文本 */
  32. content: attr(data-text);
  33. position: absolute;
  34. /* 向左侧移2px */
  35. left: 2px;
  36. width: 100%;
  37. /* 将背景色设为与主背景同样的颜色,用于遮挡标签元素 */
  38. background: black;
  39. /* 给before伪元素的文本添加右侧2px大小的蓝色文字阴影 */
  40. text-shadow: -2px 0 blue;
  41. /* 应用蒙版垂直变化动画,并一直循环 */
  42. animation: animation-after 3s infinite linear alternate-reverse;
  43. }

这里,设置了两个伪元素 before 和 after,分别定位到跟父元素同样的位置,然后分别向左、右侧移一点点的距离,制作一个错位的效果,然后都将背景色设置为与父元素背景色一样的颜色,用于遮挡父元素。
然后设置了蒙版垂直变化动画以后,被蒙版遮挡的部分虽然看不到了,但是会露出下面一层的父元素内容,这样就可以实现了一个完美的故障风格的文字展示动画了。