Vue implements drag progress bar

Vue implements drag progress bar

This article example shares the specific code of Vue to realize the drag progress bar for your reference. The specific content is as follows

Component code:

<template>
 <div>
  <div class="slider" ref="slider">
   <div class="process" :style="{ width }"></div>
   <div class="thunk" ref="trunk" :style="{ left }">
    <div class="block"></div>
    <div class="tips">
     <!-- <span>{{scale*100}}</span> -->
     <i class="fas fa-caret-down"></i>
    </div>
   </div>
  </div>
  <div>
   <button
    @click="
     () => {
      this.per++;
     }
    "
   >
    +</button
   >{{ per }}%<button
    @click="
     () => {
      if (this.per > 0) {
       this.per--;
      }
     }
    "
   >
    -
   </button>
  </div>
 </div>
</template>
<script>
/*
 * min minimum value of progress bar* max maximum value of progress bar* v-model performs two-way binding on the current value to display the drag progress in real time* */
export default {
 props: ["min", "max", "value"],
 data() {
  return {
   slider: null, //Scroll bar DOM element thunk: null, //Drag DOM element per: this.value, //Current value};
 },
 //When rendering to the page mounted() {
  this.slider = this.$refs.slider;
  this.thunk = this.$refs.trunk;
  var _this = this;
  this.thunk.onmousedown = function (e) {
   var width = parseInt(_this.width);
   var disX = e.clientX;
   document.onmousemove = function (e) {
    // value, left, width
    // When the value changes, the left and width will be modified through the calculated properties

    // Get the new width when dragging
    var newWidth = e.clientX - disX + width;
    // Get the new percentage when dragging var scale = newWidth / _this.slider.offsetWidth;
    _this.per = Math.ceil((_this.max - _this.min) * scale + _this.min);
    _this.per = Math.max(_this.per, _this.min);
    _this.per = Math.min(_this.per, _this.max);
    _this.$emit("input", _this.per);
   };
   document.onmouseup = function () {
    document.onmousemove = document.onmouseup = null;
   };
   return false;
  };
 },
 computed: {
  // Set a percentage to calculate the slider progress width and the left value of the trunk // The corresponding formula is current value - minimum value / maximum value - minimum value = slider progress width / slider total width
  // trunk left = slider progress width + trunk width / 2
  scale() {
   return (this.per - this.min) / (this.max - this.min);
  },
  width() {
   if (this.slider) {
    return this.slider.offsetWidth * this.scale + "px";
   } else {
    return 0 + "px";
   }
  },
  left() {
   if (this.slider) {
    return (
     this.slider.offsetWidth * this.scale -
     this.thunk.offsetWidth / 2 +
     "px"
    );
   } else {
    return 0 + "px";
   }
  },
 },
};
</script>
<style>
.box {
 margin: 100px auto 0;
 width: 80%;
}
.clear:after {
 content: "";
 display: block;
 clear: both;
}
.slider {
 user-select: none;
 position: relative;
 margin: 20px 0;
 width: 400px;
 height: 10px;
 background: #e4e7ed;
 border-radius: 5px;
 cursor: pointer;
}
.slider .process {
 position: absolute;
 left: 0;
 top: 0;
 width: 112px;
 height: 10px;
 border-radius: 5px;
 background: #81b159;
}
.slider .thunk {
 position: absolute;
 left: 100px;
 top: -7px;
 width: 20px;
 height: 20px;
}
.slider .block {
 width: 20px;
 height: 20px;
 border-radius: 50%;
 border: 2px solid #409eff;
 background: rgba(255, 255, 255, 1);
 transition: 0.2s all;
}
.slider .tips {
 position: absolute;
 left: -7px;
 bottom: 30px;
 min-width: 15px;
 text-align: center;
 padding: 4px 8px;
 /* background: #000; */
 border-radius: 5px;
 height: 24px;
 color: #fff;
}
.slider .tips i {
 position: absolute;
 margin-left: -5px;
 left: 50%;
 bottom: -9px;
 font-size: 16px;
 color: #000;
}
.slider .block:hover {
 transform: scale(1.1);
 opacity: 0.6;
}
</style>

Call:

<template>
 <slider :min="0" :max="100" v-model="per"></slider>
</template>

<script>
import slider from "@/components/slider";
export default {
 data() {
  return {};
 },
 computed: {
  per:
   get() {
    return 0;
   },
   set(val) {
    console.log(val);
   },
  },
 },
 components: { slider },
 mounted() {},
 methods: {},
};
</script>

<style>
</style>

The above is the full content of this article. I hope it will be helpful for everyone’s study. I also hope that everyone will support 123WORDPRESS.COM.

You may also be interested in:
  • Example of implementing circular progress bar in Vue
  • vue.js+ElementUI realizes the effect of progress bar prompting password strength
  • Progress bar function when vue page is loading (example code)
  • Circular loading progress bar encapsulation (Vue plug-in version and native js version)
  • Vue configures nprogress to implement the progress bar at the top of the page
  • How to use NProgress progress bar in Vue
  • Vue project implements file download progress bar function

<<:  How to install mysql database in deepin 2014 system

>>:  Three ways to configure Nginx virtual hosts (based on domain names)

Recommend

XHTML language default CSS style

html,address, blockquote, body,dd,div, dl,dt,fiel...

jQuery uses the canvas tag to draw the verification code

The <canvas> element is designed for client...

How to modify mysql permissions to allow hosts to access

Enable remote access rights for mysql By default,...

Detailed explanation of the usage of setUp and reactive functions in vue3

1. When to execute setUp We all know that vue3 ca...

MySQL 8.0.22 installation and configuration method graphic tutorial

This article records the installation and configu...

How to create a web wireframe using Photoshop

This post introduces a set of free Photoshop wire...

A brief discussion on the lazy loading attribute pattern in JavaScript

Table of contents 1. Introduction 2. On-demand at...

Summary of basic knowledge and operations of MySQL database

This article uses examples to explain the basic k...

MySQL database aggregate query and union query operations

Table of contents 1. Insert the queried results 2...

When modifying a record in MySQL, the update operation field = field + string

In some scenarios, we need to modify our varchar ...

How to design a web page? How to create a web page?

When it comes to understanding web design, many p...