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:
|
<<: How to install mysql database in deepin 2014 system
>>: Three ways to configure Nginx virtual hosts (based on domain names)
html,address, blockquote, body,dd,div, dl,dt,fiel...
The <canvas> element is designed for client...
Enable remote access rights for mysql By default,...
1. When to execute setUp We all know that vue3 ca...
As a programmer who has just learned Tomcat, this...
This article records the installation and configu...
This post introduces a set of free Photoshop wire...
The computer system is: win7 This article is main...
Table of contents 1. Introduction 2. On-demand at...
As shown above, the navigation is fixed at the to...
This article uses examples to explain the basic k...
Table of contents Preface 1. Prepare new partitio...
Table of contents 1. Insert the queried results 2...
In some scenarios, we need to modify our varchar ...
When it comes to understanding web design, many p...