• vue实现拖拽进度条,并封装复用


    组件代码

    <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">
    <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 进度条最小值
    * max 进度条最大值
    * v-model 对当前值进行双向绑定实时显示拖拽进度
    * */
    export default {
    props: ["min", "max", "value"],
    data() {
    return {
    slider: null, //滚动条DOM元素
    thunk: null, //拖拽DOM元素
    per: this.value, //当前值
    };
    },
    //渲染到页面的时候
    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
    // 当value变化的时候,会通过计算属性修改left,width
    // 拖拽的时候获取的新width
    var newWidth = e.clientX - disX + width;
    // 拖拽的时候得到新的百分比
    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: {
    // 设置一个百分比,提供计算slider进度宽度和trunk的left值
    // 对应公式为 当前值-最小值/最大值-最小值 = slider进度width / slider总width
    // trunk left = slider进度width + trunk宽度/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;
    80%;
    }
    .clear:after {
    content: "";
    display: block;
    clear: both;
    }
    .slider {
    user-select: none;
    position: relative;
    margin: 20px 0;
    400px;
    height: 10px;
    background: #e4e7ed;
    border-radius: 5px;
    cursor: pointer;
    }
    .slider .process {
    position: absolute;
    left: 0;
    top: 0;
    112px;
    height: 10px;
    border-radius: 5px;
    background: #81b159;
    }
    .slider .thunk {
    position: absolute;
    left: 100px;
    top: -7px;
    20px;
    height: 20px;
    }
    .slider .block {
    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- 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>

    调用组件

    <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>

  • 相关阅读:
    骆驼命名法,帕斯卡命名法和匈牙利命名法<转>
    海量数据库查询优化<转>
    备份数据库并生成Rar
    标准http状态码[英文注释版本]<转>
    IIS自动停止,iis自动关闭。应用程序池假死、自动重启以及iis权限等解决办法 <转>
    Flex/Silverlight的技术比较<转>
    .NET平台测试驱动开发模拟框架Moq简明教程(实例剖析)<转>
    VisualStudio用IE8调试时遇到的问题(转)
    English learning
    JS调用WebService示例
  • 原文地址:https://www.cnblogs.com/xiaoxiao95/p/16351424.html
Copyright © 2020-2023  润新知