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

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>

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

5+单基因+免疫浸润,这篇肿瘤预后文章你值得拥有

今天给同学们分享一篇生信文章“Systematic analysis of the role of SLC52A2 in multiple human cancers”&#xff0c;这篇文章发表在Cancer Cell Int期刊上&#xff0c;影响因子为5.8。 结果解读&#xff1a; 多种人类癌症中SLC52A2的mRNA表达 首先&#xff0c;作者使用GT…

virtualbox基本配置

全屏模式调出热键 右边的 ctrl home 键 安装增强功能 注意&#xff1a;virtualbox 自带那个安装增强功能点击后是没有效果的 1、启动虚拟机 2、设备 3、分配虚拟光驱 4、选择虚拟盘 5、选择对应iso文件&#xff0c;文件下载路径 6、双击对应文件安装&#xff0c;默认配置…

多区域OSPF配置

配置命令步骤&#xff1a; 1.使用router ospf 进程ID编号 启用OSPF路由 2.使用network 直连网络地址 反掩码 area 区域号 将其归于对应区域 注意&#xff1a; 1.进程ID编号可任意&#xff08;1-65535&#xff09; 2.反掩码用4个255相减得到 3.area 0 为主干区域 4.连接不…

虚拟机第一次如何打开

1、将别人的虚拟机拷贝到自己的电脑盘里&#xff1b; 2、打开VMware&#xff0c;选择“打开虚拟机”&#xff1b; 3、选择拷贝的虚拟机里的.vmx文件&#xff1b; 4、选择“播放虚拟机”&#xff1b; 5、如果出现一个选择框&#xff0c;选“我已复制改虚拟机”即可。

Python 中的 tqdm() 方法

tqdm&#xff08;阿拉伯语"taqaddum"的缩写&#xff0c;意为"进展"&#xff09;是Python中一个用于在循环中显示进度条的库。它提供了一种简单而又灵活的方式来监测代码执行的进度&#xff0c;特别是在处理大量数据或耗时较长的任务时非常有用。 1、安装 …

golang 解析oracle 数据文件头

package mainimport ("encoding/binary""fmt""io""os" ) // Powered by 黄林杰 15658655447 // Usered for parser oracle datafile header block 1 .... // oracle 数据文件头块解析 // KCBlockStruct represents the structure of t…

什么是美颜SDK?美颜SDK对比评测

美颜SDK在视频直播中发挥着越来越重要的作用。为了实现实时、高质量的美颜效果&#xff0c;各种视频直播美颜SDK应运而生。本文将对这些技术进行深入解析与比较。 一、技术原理解析 深度学习技术通过大量的训练数据学习人脸特征&#xff0c;从而实现更为自然的美颜效果。传统…

干货分享:如何提高商城系统网页访问速度?

如今&#xff0c;商城系统网页的访问速度对于用户体验和销售业绩至关重要。用户对于网页的加载速度要求越来越高&#xff0c;一旦加载速度过慢&#xff0c;用户可能会选择离开&#xff0c;甚至转向竞争对手的网站。因此&#xff0c;提高商城系统网页的打开速度是每个电商运营者…

2023年【N1叉车司机】找解析及N1叉车司机复审模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2023年N1叉车司机找解析为正在备考N1叉车司机操作证的学员准备的理论考试专题&#xff0c;每个月更新的N1叉车司机复审模拟考试祝您顺利通过N1叉车司机考试。 1、【多选题】《中华人民共和国特种设备安全法》第八十三…

ROS1 学习11 坐标系tf 管理系统 简介及demo示例

坐标系是我们非常熟悉的一个概念&#xff0c;也是机器人学中的重要基础&#xff0c;在一个完整的机器人系统中&#xff0c;会存在很多坐标系&#xff0c;这些坐标系之间的位置关系该如何管理&#xff1f; ROS给我们提供了一个坐标系的管理神器——TF。 比如在机械臂形态的机器…

ubuntu 20.04+ORB_SLAM3 安装配库教程

目录 安装ros(如果只是运行ORB-SLAM3&#xff0c;可以跳过安装)0. ros 安装教程1. 安装opencv2. 安装Pangolin3. 安装Eigen34.安装Python & libssl-dev5.安装boost库6.安装ceres库&#xff08;不必须&#xff09;7.安装Sophus库&#xff08;不必须&#xff09;8. 安装g20库…

多线程概述及创建

什么是线程&#xff1f; 线程(thread)是一个程序内部的一条执行路径。 我们之前启动程序执行后&#xff0c;main方法的执行其实就是一条单独的执行路径。 程序中如果只有一条执行路径&#xff0c;那么这个程序就是单线程的程序。 多线程是什么&#xff1f; 多线程是指从软…

Linux 读写权限的配置

文章目录 Linux文件权限详解 一、文件权限二、修改文件访问权限的方法三、UMASK值四、三种特殊权限suid、sgid、sticky&#xff08;sticky权限工作环境中相对常用&#xff09;五、ACL访问控制列表六、文件权限操作的常用命令 Linux文件权限详解 Linux系统中不仅是对用户与组根…

Cesium 实战 - 加载水经微图下载资源问题 - 地球南北极有蓝圈,南北极空洞

Cesium 实战 - 加载水经微图下载资源问题 - 地球南北极有蓝圈 错误展示排错过程解决问题完整代码在线示例 在某个项目中&#xff0c;客户提到一个问题&#xff0c;即地球南北极会有一个蓝色的洞&#xff0c;经复现&#xff0c;确实有这个问题。见下图。 经过排查&#xff0c;最…

高难度工业废水处理有哪些注意事项

高难度工业废水处理的注意事项包括&#xff1a; 预处理&#xff1a;在将废水输送至污水处理系统前&#xff0c;应进行预处理&#xff0c;以减轻处理设备的负荷&#xff0c;提高处理效率。预处理可以包括去除废水中的悬浮物、沉淀物以及防止化学物质的沉积等。针对不同废水选择…

nestJs(三) 数据库

真正的服务往往包括数据存储。 本篇将介绍如何建立 NestJs 的数据库连接、并使用数据库联表查询。这样就就是完整的后台服务了。 开发准备 下载并安装 Mysql创建 school 库 create database school;3.安装 nestjs/typeorm typeorm mysql2 npm install --save nestjs/typeor…

浅了解下:运营商大数据如何挖掘电销同行网站,APP,精准获客 ?

今天我们要讲的是运营商精准大数据营销。运营商精准大数据营销只是精准营销的一种&#xff0c;精准营销筛选包含了电话营销这个词。那么电话营销如何通过运营商大数据找到精准的客户&#xff1f;电销如何通过大数据找到准确的客户来源&#xff1f; 在全网时代&#xff0c;大数…

echarts:graph图表拖拽节点

需求&#xff1a;实现一个可视化编辑器&#xff0c;用户可以添加节点&#xff0c;并对节点进行拖拽编辑等 实现期间碰到很多问题&#xff0c;特意记录下来&#xff0c;留待将来碰到这些问题的同学&#xff0c;省去些解决问题的时间 问题1&#xff1a;节点的data如下&#xff0…

无需管理底层基础设施,亚马逊云科技向量数据库轻松创建ML增强的搜索体验和应用程序

当我们进入一家图书馆时&#xff0c;图书馆的入口处会有几台电脑供你检索相关的书籍&#xff0c;你可以检索你想要的书籍的名字例如&#xff1a;《百年孤独》、《悲惨世界》等等&#xff0c;你也可以检索作者例如&#xff1a;川端康成、鲁迅、加缪等等&#xff0c;当然你也可以…

读书充电,温暖你的冬日,本期为大家送出几本架构师成长和软件架构技术相关的好书,助你度过这个不太景气的寒冬!

目图书录 ⭐️《高并发架构实战&#xff1a;从需求分析到系统设计》⭐️《架构师的自我修炼&#xff1a;技术、架构和未来》⭐️《中台架构与实现&#xff1a;基于DDD和微服务》⭐️《分布式系统架构&#xff1a;架构策略与难题求解》⭐️《流程自动化实战&#xff1a;系统架构…