68 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
			
		
		
	
	
			68 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Vue
		
	
	
	
	
	
| <template>
 | |
|   <div ref="progress" class="custom-progress-val" :style="{ background: inactiveBg }">
 | |
|     <div class="progress-warp" :style="{ height: height }">
 | |
|       <div class="progress" :style="{ height: height, width: pWidth + 'px', background: activateBg }"></div>
 | |
|     </div>
 | |
|     {{ width }}
 | |
|   </div>
 | |
| </template>
 | |
| <script setup>
 | |
| import { ref, onMounted, watch, reactive, computed } from 'vue';
 | |
| 
 | |
| const props = defineProps({
 | |
|   height: {
 | |
|     type: String,
 | |
|     default: '10px',
 | |
|   },
 | |
|   inactiveBg: {
 | |
|     type: String,
 | |
|     default: 'transparent',
 | |
|   },
 | |
|   activateBg: {
 | |
|     type: String,
 | |
|     default: 'linear-gradient(90deg, #45bfe9 0%, #01589c 100%)',
 | |
|   },
 | |
|   percent: {
 | |
|     type: Number,
 | |
|     default: 20,
 | |
|   },
 | |
|   width: {
 | |
|     type: String,
 | |
|     default: null,
 | |
|   },
 | |
| });
 | |
| 
 | |
| let progress = ref(null);
 | |
| let maxwidth = computed(() => {
 | |
|   return progress.value && progress.value.clientWidth;
 | |
| });
 | |
| let pWidth = computed(() => {
 | |
|   let num = 0;
 | |
|   num = Number(((maxwidth.value * props.percent) / 100).toFixed(0));
 | |
|   return num;
 | |
| });
 | |
| </script>
 | |
| <style lang="scss" scoped>
 | |
| .custom-progress-val {
 | |
|   width: calc(100%);
 | |
|   border-radius: 6px;
 | |
|   .progress-warp {
 | |
|     width: 100%;
 | |
|     .progress {
 | |
|       height: 100%;
 | |
|       border-radius: 6px;
 | |
|       animation: expandWidth 1s ease-in-out forwards;
 | |
|     }
 | |
| 
 | |
|     @keyframes expandWidth {
 | |
|       from {
 | |
|         width: 0;
 | |
|       }
 | |
|       to {
 | |
|         width: maxwidth + 'px';
 | |
|       }
 | |
|     }
 | |
|   }
 | |
| }
 | |
| </style>
 | 
