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)
1. Problem Multiple floating elements cannot expa...
1. Pull the redis image docker pull redis 2. Star...
1. First log in to the Alibaba Cloud website to r...
This article mainly introduces three methods of i...
Table of contents Create a new user Authorize new...
All prerequisites require root permissions 1. End...
Table of contents 1. Brief Introduction 2. setInt...
illustrate: Using mysqldump –all-databases will e...
Today, in the practice of vue3+vite project, when...
DML operations refer to operations on table recor...
The project requirements are: select date and tim...
Table of contents Why do we need partitions? Part...
Table of contents 1. Slow query configuration 1-1...
Apache Log4j2 reported a nuclear-level vulnerabil...
MySQL replication detailed explanation and simple...