项目中UI给出了一种进度条按钮,进度百分比居中显示,颜色为蓝色,被进度覆盖过的颜色是白色,该如何实现呢?
    image.png

    点击查看【codepen】

    1. <template>
    2. <div id="app">
    3. <div class="progress-wrapper" @click="process">
    4. <div class="progress-outer">
    5. <div class="progress-inner" :style="{width: `${percentage}%`}">
    6. <span class="progress-text" v-if="!percentage">点击开始</span>
    7. <span class="progress-text" v-else>
    8. <span class="num">{{percentage}}</span>%
    9. </span>
    10. </div>
    11. <span class="progress-text" v-if="!percentage">点击开始</span>
    12. <span class="progress-text" v-else>
    13. <span class="num">{{percentage}}</span>%
    14. </span>
    15. </div>
    16. </div>
    17. </div>
    18. </template>
    19. <script>
    20. export default {
    21. data() {
    22. return {
    23. percentage: 0
    24. };
    25. },
    26. methods: {
    27. process() {
    28. var intervalFn = setInterval(()=>{
    29. if(this.percentage >= 100){
    30. this.percentage = 100;
    31. clearInterval(intervalFn)
    32. }else{
    33. this.percentage += 1;
    34. }
    35. },100)
    36. }
    37. }
    38. };
    39. </script>
    40. <style>
    41. #app {
    42. font-family: Avenir, Helvetica, Arial, sans-serif;
    43. text-align: center;
    44. color: #2c3e50;
    45. margin-top: 60px;
    46. }
    47. .progress-wrapper{
    48. width: 110px;
    49. height: 36px;
    50. padding: 4px;
    51. line-height:36px;
    52. box-sizing: border-box;
    53. border: 1px solid #4781ff;
    54. border-radius: 22px;
    55. cursor: pointer;
    56. }
    57. .progress-outer{
    58. width:100%;
    59. height:100%;
    60. border-radius: 22px;
    61. background:white;
    62. position: relative;
    63. overflow:hidden;
    64. color:#4781FF;
    65. }
    66. .progress-inner{
    67. position: absolute;
    68. width:0;
    69. height:100%;
    70. background: #4781FF;
    71. color: white;
    72. z-index:1;
    73. overflow: hidden;
    74. }
    75. .progress-text{
    76. position: absolute;
    77. top: 50%;
    78. left: 50px;
    79. transform: translate(-50%, -50%);
    80. white-space: nowrap;
    81. }
    82. </style>

    image.png

    • 利用absolute定位,同时设置inner的width为百分比,用来模拟进度。
    • 设置两个重叠的text,一个与inner平级,一个在inner内部,文字颜色分别继承他们父级设置的颜色。
    • 进度条走过的地方显示的其实是inner里面的text,没走过的地方显示的是与inner平级的text
    • 当进度到100%之后,inner的width也为100%,此时与inner同级的progress-text被inner覆盖。

      注意,progress-text的left值 不能设置成50%,因为他的位置同时也受progress-inner的宽度影响,我们需要的是文字始终居中。 所以需要写死宽度为progress-outer的总宽度px的一半,再利用transform: translate(-50%,-50%)偏移自身宽高的一半,实现上下左右居中。