小DEMO:在vue中自定义range组件

news2024/10/7 0:10:03

1、组件样式

2、使用

import cSlider from '@/components/c-slider/c-slider.vue'

<div class="range">
	<cSlider v-model="cScale" @change="cScaleChange" :min="1" :max="10"/>
</div>

3、组件代码

<template>
  <div 
    class="slider-box" 
    data-id="1"
    ref="sliderBox" 
    @mousedown.stop.prevent="onMousedown($event)"
    @mouseup.stop.prevent="onMouseup"
    @mouseleave.stop.prevent="onMouseup"
    @mousemove.stop.prevent="onMousemove($event)"
    >
    <div class="slider-wrap">
      <div 
        class="slider-bar"
        data-id="1"
        :style="{
          width: ((modelValue - min)*stepWidth)+'px'
        }">
        <span
          class="slider-btn"
          :class="{
            active: sliderActive
          }"
          data-id="1"
          @mousedown.stop.prevent="onMousedown($event, true)"
          :style="{
            left: ((modelValue - min)*stepWidth)+'px'
          }">
          <b>{{ modelValue }}</b>
        </span>

      </div>
    </div>
    
  </div>
</template>

<script>

export default {

  model: {
    prop: 'modelValue',
    event: 'change'
  },

  props: {
		modelValue: {
      type: Number,
      default: 0
    },

    min: {
      type: Number,
      default: 0
    },

    max: {
      type: Number,
      default: 10
    },

    step: {
      type: Number,
      default: 1
    }
	},

  data() {
    return {
      rangeValue: 0,
      stepWidth: 0,
      sliderBox: null,
      moveAbled: false,
      mousePoint: null,
      sliderActive: false
    }
  },

  mounted() {
    // document.addEventListener('mouseup', this.onMouseup)
    // document.addEventListener('mouseleave', this.onMouseup)
    
    // this.$nextTick(() => {

      let _sliderBox = this.$refs['sliderBox'].getBoundingClientRect()
      
      this.sliderBox = {
        width: _sliderBox.width,
        height: _sliderBox.height,
        top: _sliderBox.top + document.documentElement.scrollTop,
        left: _sliderBox.left + document.documentElement.scrollLeft
      }
      this.stepWidth = this.sliderBox.width/(this.max-this.min)
      // console.log('xxx', _sliderBox, this.sliderBox)
    // })
  },

  beforeMount() {
    // document.removeEventListener('mouseup', this.onMouseup)
    // document.removeEventListener('mouseleave', this.onMouseup)
  },

  methods: {

    onMousemove(e) {
      if(this.moveAbled) {
        this.sliderActive = true
        
        let d = e.pageX - this.mousePoint.pageX

        let _val = Math.round(this.modelValue + d/this.stepWidth)

        if(_val < this.min) {
          _val = this.min
        } else if(_val > this.max) {
          _val = this.max
        }

        if(_val !== this.modelValue) {
          this.mousePoint = e
        }
        
        this.$emit('update:modelValue', _val)
        this.$emit('change')

        console.log('onMousemove', _val)
      }
    },

    onMouseup() {
      // console.log('onMouseup')
      this.moveAbled = false
      this.sliderActive = false
    },

    onMousedown(e, moveAbled) {
      console.log('onMousedown', this.stepWidth)

      if(moveAbled) {
        this.moveAbled = moveAbled
        this.mousePoint = e
      } else {
        let d = e.pageX - this.sliderBox.left

        let _val = Math.round(this.min + d/this.stepWidth)

        if(_val < this.min) {
          _val = this.min
        } else if(_val > this.max) {
          _val = this.max
        }
        
        this.$emit('update:modelValue', _val)
        this.$emit('change')
        
      }
    },

  }
}

</script>

<style lang="scss" scoped>
  .slider-box {
    width: 100%;
    height: 100%;
    display: flex;
    align-items: center;
    .range {
      position: absolute;
      top: 50%;
      left: 50%;
      width: 100%;
      transform: translate(-50%, -50%);
      opacity: 0.3;
    }
    .slider-wrap {
      position: relative;
      width: 100%;
      height: 3px;
      border-radius: 2px;
      background: #D9D9D9;
      cursor: pointer;
      .slider-bar {
      border-radius: 2px;
      height: 100%;
      background: #0256FF;
      
      .slider-btn {
        cursor: grab;
        position: absolute;
        top: 50%;
        left: 0;
        transform: translate(-50%, -50%);
        width: 10px;
        height: 10px;
        background: white;
        border-radius: 100%;
        box-shadow: 0 0 2px 2px #D6D6D6;
        &:hover, &.active {
          width: 15px;
          height: 15px;
          b {
            display: block;
          }
        }
        &::after {
          position: absolute;
          top: 50%;
          left: 50%;
          transform: translate(-50%, -50%);
          content: '';
          width: 4px;
          height: 4px;
          background: #0256FF;
          border-radius: 100%;
        }
        b {
          display: none;
          position: absolute;
          top: -10px;
          left: 50%;
          background: rgba(0, 0, 0, 0.3);
          color: white;
          font-size: 12px;
          padding: 0 5px;
          border-radius: 5px;
          transform: translate(-50%, -100%);
          &::after {
            position: absolute;
            bottom: 0px;
            left: 50%;
            transform: translate(-50%, 100%);
            content: '';
            width: 0;
            height: 0;
            border-top: 4px solid rgba(0, 0, 0, 0.3);
            border-left: 4px solid transparent;
            border-right: 4px solid transparent;
            border-right: 4px solid transparent;
            
          }
        }
      }
    }
    }
    
  }
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1211604.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

VS2022配置wxWidgets 3.0.5

Downloads - wxWidgets下载Windows ZIP 解压进入E:\SoftWare\wxWidgets-3.0.5\build\msw&#xff0c;用VS2022打开wx_vc12.sln&#xff0c;选择生成——批生成&#xff0c;最终生成一些文件 打开VS2022&#xff0c;新建属性表&#xff0c;在属性表里设置&#xff1a; c——常规…

百度搜索智能化算力调控分配方法

作者 | 泰来 导读 随着近年深度学习技术的发展&#xff0c;搜索算法复杂度不断上升&#xff0c;算力供给需求出现了爆发式的增长。伴随着AI技术逐步走到深水区&#xff0c;算法红利在逐步消失&#xff0c;边际效应日益显著&#xff0c;算力效能的提升尤为重要&#xff0c;同时随…

海报设计必备!五个免费网站分享,让你的创意得以充分展现!

海报作为一种重要的宣传工具&#xff0c;在各种场合得到了广泛的应用。然而&#xff0c;对许多人来说&#xff0c;制作一张漂亮的海报并不容易。幸运的是&#xff0c;有许多免费的海报制作网站可以帮助人们轻松地制作出漂亮的海报。本文将分享五个优秀的免费海报制作网站。 1.…

天津专升本新版报名系统网上报名、填志愿、缴费、审核等操作步骤

天津高职升本网上报名、填报志愿新版专升本报名系统 ▏报名入口&#xff1a;www.zhaokao.net▏注意&#xff1a;一定要在截止时间内完成报名、填报志愿、缴费、审核、下载《报名信息表》等4步骤▏可报考院校及专业请参考招生院校发布的通知&#xff08;招生简章、报考须知&…

实时level2访问与策略研发

本周四下午4点&#xff0c;天软会聚焦“实时&level2访问与策略研发”开展我们的天软高频时序数仓会议&#xff0c;本次会议的报名客户&#xff0c;可以申请试用LEVEL-2数据测试账号哦~

jeesite 按部门过滤数据权限(保姆级图文教程)

文章目录 前言一、数据库表添加机构字段二、修改实体3.修改服务层总结前言 在项目开发过程中,数据需要按照部门、公司进行权限过滤,本篇文章记录下如何修改按部门进行权限过滤的详细图文教程。 一、数据库表添加机构字段 要进行权限过滤的表中添加机构字段 二、修改实体 添…

考研分享第3期 | 211本378分上岸大连理工电子信息经验贴

考研分享第3期 | 211本378分上岸大连理工电子信息经验贴 一、个人信息 姓名&#xff1a;Ming 本科院校&#xff1a;某211学校电子信息工程学院 电子科学与技术专业 上岸院校&#xff1a;大连理工大学 电子信息与电气工程学部 电子信息&#xff08;0854&#xff09; 择校意…

【案例】由coredump引起的思考:程序的加载流程

背景 小米项目的同事&#xff0c;最近遇到了一个crash问题&#xff0c;困扰较久&#xff0c;向我请求帮助。&#xff08;其实是客户指定要求我来分析这个问题&#xff0c;该项目之前是由我负责的&#xff0c;帮客户解决很多较多crash问题。估计是实力得到了客户认可吧&#xff…

数据中心:精密空调监控,这招太高效了!

在当今日益复杂的工业环境中&#xff0c;精密空调系统的监控和管理变得至关重要。随着科技的迅猛发展&#xff0c;各行各业对温度、湿度和空气质量等参数的高度控制需求不断增加。 精密空调监控系统通过实时数据采集、分析和反馈&#xff0c;为企业提供了可靠的手段来确保生产环…

如何借助测评系统实现速卖通店铺补单,吸引更多消费者?

在速卖通平台上&#xff0c;为店铺增加权重和排名是吸引更多买家和提升销售的关键。以下是一些有效的方法&#xff0c;帮助你提升速卖通店铺的权重和排名&#xff1a; 1. 优化商品信息&#xff1a;确保商品标题简洁明了、描述准确详细、图片清晰精美。使用关键词描述&#xff…

FPGA电平标准的介绍

对FPGA的管脚进行约束的时候&#xff0c;常常看到这样的电平标准&#xff0c;例如LVCOM18&#xff0c;LVCOS25&#xff0c;LVDS&#xff0c;LVDS25等等&#xff0c;其实这些都是一系列的电平标准。 针对数字电路而言&#xff0c;数字电路表示电平的只有1和0两个状态&#xff0c…

双十一买高画质投影仪,当贝F6还是极米H6?

如果你想购买一台4K画质的投影仪,那么在各大平台搜索“双十一最值得买的4K投影仪”时,一定会注意到当贝F6和极米H6这两个型号投影仪。个人认为当贝F6和极米H6都分别是当贝和极米两个品牌非常具有性价比的4K投影仪。那么到底哪一台更适合你。 首先放一张参数对比图,方便参数控研…

人力物力和时间资源有限?守住1个原则,精准覆盖所有兼容性测试!

随着 APP 应用范围越来越广&#xff0c;用户群体越来越大&#xff0c;终端设备的型号也越来越多&#xff0c;移动终端碎片化加剧&#xff0c;使得 APP 兼容性测试成为测试质量保障必须要考虑的环节。 APP 兼容性测试通常会考虑&#xff1a;操作系统、厂家 ROM、屏幕分辨率、网…

全方位移动机器人 Stanley 轨迹跟踪 Gazebo 仿真

全方位移动机器人 Stanley 轨迹跟踪 Gazebo 仿真 本来打算今天出去跑一下 GPS&#xff0c;但是下雨&#xff0c;作罢 添加参考轨迹信息 以下三个功能包不需要修改&#xff1a; mrobot&#xff1a;在 Rviz 和 Gazebo 中仿真机器人cmd_to_mrobot&#xff1a;运动学解算&#…

【C++ std::max_element std::min_element std::minmax_element】

一 、std::max_element 寻找范围 [first, last) 中的最大元素。 (1) 用 operator< 比较元素。 (3) 用给定的二元比较函数 comp 比较元素。 (2),(4) 同 (1,3) &#xff0c;但按照 policy 执行。这些重载仅若 std::is_execution_policy_v<std::decay_t > (C20 前)std:…

Alter database open fails with ORA-00600 kcratr_nab_less_than_odr

Alter database open fails with ORA-00600 kcratr_nab_less_than_odr (Doc ID 1296264.1)​编辑To Bottom APPLIES TO: Oracle Database - Enterprise Edition - Version 11.2.0.1 to 11.2.0.1 [Release 11.2] Oracle Database - Enterprise Edition - Version 12.1.0.1 to …

【精彩回顾】 用sCrypt在Bitcoin上构建智能合约(1)

2023年3月24日&#xff0c;sCrypt在英国Exeter大学举办了关于智能合约的大学讲学。sCrypt首席执行官刘晓晖做了题为“用sCrypt在Bitcoin上构建智能合约”的演讲&#xff0c;并与到场的老师、学生进行了深入交流、互动。这次课程着重讲解了 BSV 智能合约的基础概念&#xff0c;以…

Java学习笔记(七)——面向对象编程(中级)

一、IDEA &#xff08;一&#xff09;常用的快捷键 &#xff08;二&#xff09;模版/自定义模版 二、包 &#xff08;一&#xff09;包的命名 &#xff08;二&#xff09;常用的包 &#xff08;三&#xff09;如何引入&#xff08;导入&#xff09;包 &#xff08;四&am…

挑战字节软件测试岗,原来这么轻松...

当前就业环境&#xff0c;裁员、失业消息满天飞&#xff0c;好像有一份工作就不错了&#xff0c;更别说高薪了。其实这只是一方面&#xff0c;而另一方面&#xff0c;各大企业依然求贤若渴&#xff0c;高技术人才依然紧缺&#xff0c;只要你技术过硬&#xff0c;拿个年薪50w不是…

算法萌新闯力扣:同构字符串

力扣题&#xff1a;同构字符串 开篇 对于字符串相关的题目&#xff0c;哈希表经常会使用到&#xff0c;这道题更是如此&#xff0c;还用到了两个哈希表。拿下它&#xff0c;你对字符串题目的理解就会更上一层楼。 题目链接:205.同构字符串 题目描述 代码思路 看完题目后&a…