当前位置: 首页 > article >正文

vue滑块组件设计与实现

vue滑块组件设计与实现

设计一个滑块组件的思想主要包括以下几个方面:用户交互、状态管理、样式设计和事件处理。以下是详细的设计思想:

1. 用户交互

滑块组件的核心是用户能够通过拖动滑块来选择一个值。因此,设计时需要考虑以下几点:

  • 拖动事件:需要处理鼠标和触摸事件,以便在不同设备上都能正常使用。
  • 实时反馈:用户拖动滑块时,滑块的位置和进度条的宽度应实时更新,提供即时的视觉反馈。

2. 状态管理

滑块组件需要管理其内部状态,包括滑块的位置和当前值:

  • 滑块位置:通常用一个百分比值来表示滑块在轨道上的位置。
  • 当前值:根据滑块的位置计算出当前值,并通过事件传递给父组件。

3. 样式设计

滑块组件的样式设计需要考虑以下几点:

  • 滑块容器:定义滑块的整体布局和背景。
  • 轨道:显示滑块的背景轨道。
  • 进度条:显示滑块左边的进度条,宽度根据滑块位置动态更新。
  • 滑块:显示滑块本身,通常是一个可拖动的圆形。

4. 事件处理

滑块组件需要处理一系列事件,以实现拖动功能:

  • 开始拖动:监听 mousedowntouchstart 事件,开始拖动滑块。
  • 拖动中:监听 mousemovetouchmove 事件,实时更新滑块位置和进度条宽度。
  • 停止拖动:监听 mouseuptouchend 事件,停止拖动并移除事件监听器。

具体实现

以下是具体实现的代码和设计思想的结合:

Slider.vue
<template><!-- 滑块容器 --><div class="slider-container" ref="slider" @mousedown="startDrag" @touchstart="startDrag"><!-- 滑块轨道 --><div class="slider-track"><!-- 进度条,宽度根据滑块位置动态更新 --><div class="slider-progress" :style="{ width: thumbPosition + '%' }"></div></div><!-- 滑块,位置根据 thumbPosition 动态更新 --><div class="slider-thumb" :style="{ left: thumbPosition + '%' }"></div></div>
</template><script setup>
import { ref, onMounted, onBeforeUnmount } from 'vue';// 定义可以触发的事件,用于向父组件传递滑块的值
const emit = defineEmits(['updateValue']);// 定义滑块的初始位置(百分比)和最大值
const thumbPosition = ref(0); // 滑块位置,范围为 0% 到 100%
const maxValue = 100; // 滑块的最大值// 获取滑块容器的 DOM 元素
const slider = ref(null);// 开始拖动滑块
const startDrag = (event) => {event.preventDefault(); // 阻止默认行为(例如文本选择)// 监听鼠标或触摸移动事件document.addEventListener('mousemove', onDrag);document.addEventListener('mouseup', stopDrag);document.addEventListener('touchmove', onDrag);document.addEventListener('touchend', stopDrag);
};// 拖动滑块时更新位置
const onDrag = (event) => {if (!slider.value) return; // 如果 slider 未定义,则直接返回const rect = slider.value.getBoundingClientRect(); // 获取滑块容器的位置信息const clientX = event.clientX || event.touches[0].clientX; // 获取鼠标或触摸的 X 坐标let newPosition = ((clientX - rect.left) / rect.width) * 100; // 计算滑块的新位置(百分比)newPosition = Math.max(0, Math.min(newPosition, 100)); // 限制滑块位置在 0% 到 100% 之间thumbPosition.value = newPosition; // 更新滑块位置emit('updateValue', Math.round((newPosition / 100) * maxValue)); // 向父组件发送滑块的值
};// 停止拖动滑块
const stopDrag = () => {// 移除鼠标或触摸事件监听器document.removeEventListener('mousemove', onDrag);document.removeEventListener('mouseup', stopDrag);document.removeEventListener('touchmove', onDrag);document.removeEventListener('touchend', stopDrag);
};// 组件挂载时添加事件监听器
onMounted(() => {document.addEventListener('mouseup', stopDrag);document.addEventListener('touchend', stopDrag);
});// 组件卸载时移除事件监听器
onBeforeUnmount(() => {document.removeEventListener('mouseup', stopDrag);document.removeEventListener('touchend', stopDrag);
});
</script><style scoped>
/* 滑块容器样式 */
.slider-container {position: relative; /* 相对定位,用于内部元素定位 */width: 100%; /* 容器宽度 */height: 20px; /* 容器高度 */background-color: #ddd; /* 背景颜色 */border-radius: 10px; /* 圆角 */cursor: pointer; /* 鼠标样式 */
}/* 滑块轨道样式 */
.slider-track {position: absolute; /* 绝对定位 */top: 50%; /* 垂直居中 */left: 0; /* 从左边开始 */width: 100%; /* 轨道宽度 */height: 4px; /* 轨道高度 */background-color: #aaa; /* 轨道背景颜色 */transform: translateY(-50%); /* 垂直居中调整 */
}/* 进度条样式 */
.slider-progress {position: absolute; /* 绝对定位 */top: 0; /* 从顶部开始 */left: 0; /* 从左边开始 */height: 100%; /* 高度与轨道一致 */background-color: #007bff; /* 进度条颜色 */border-radius: 10px 0 0 10px; /* 圆角,只对左边有效 */
}/* 滑块样式 */
.slider-thumb {position: absolute; /* 绝对定位 */top: 50%; /* 垂直居中 */width: 20px; /* 滑块宽度 */height: 20px; /* 滑块高度 */background-color: #007bff; /* 滑块颜色 */border-radius: 50%; /* 滑块为圆形 */transform: translate(-50%, -50%); /* 水平和垂直居中调整 */cursor: pointer; /* 鼠标样式 */
}
</style>
父组件:App.vue

接下来,我们在父组件 App.vue 中使用 Slider.vue 组件,并监听 updateValue 事件来获取当前的选择值。

<template><div><h1>Slider Component</h1><Slider @updateValue="handleUpdateValue" /><p>Selected Value: {{ selectedValue }}</p></div>
</template><script>
import { ref } from 'vue';
import Slider from './Slider.vue';export default {components: {Slider},setup() {// 定义一个状态来存储子组件传递的选择值const selectedValue = ref(0);// 处理子组件传递的选择值const handleUpdateValue = (value) => {selectedValue.value = value;};return {selectedValue,handleUpdateValue};}
};
</script>

在父组件中,通过 @updateValue="handleUpdateValue" 监听子组件的 updateValue 事件,并在 handleUpdateValue 方法中更新父组件的 selectedValue 状态。

设计思想总结

  1. 用户交互:通过监听鼠标和触摸事件,实现滑块的拖动功能,并提供实时的视觉反馈。
  2. 状态管理:使用 ref 管理滑块的位置和当前值,并通过事件将值传递给父组件。
  3. 样式设计:定义滑块容器、轨道、进度条和滑块的样式,确保组件外观美观且易于使用。
  4. 事件处理:处理开始拖动、拖动中和停止拖动的事件,确保滑块在用户交互时能够正确响应。

关键部分:

  • ref 定义滑块位置 (thumbPosition) 和滑块容器 (slider) 的引用。
  • startDrag 函数在用户按下鼠标或触摸屏幕时触发,阻止默认行为并添加 mousemovetouchmove 事件监听器,用于拖动滑块。
  • onDrag 函数在用户拖动滑块时触发,计算滑块的新位置并更新 thumbPosition,同时通过 emit 事件将滑块的值传递给父组件。
  • stopDrag 函数在用户松开鼠标或触摸屏幕时触发,移除 mousemovetouchmove 事件监听器,停止拖动。
  • 使用 onMountedonBeforeUnmount 确保在组件挂载和卸载时正确添加和移除事件监听器。

通过这些设计思想,滑块组件能够提供良好的用户体验,并且易于维护和扩展。

相关文章:

vue滑块组件设计与实现

vue滑块组件设计与实现 设计一个滑块组件的思想主要包括以下几个方面&#xff1a;用户交互、状态管理、样式设计和事件处理。以下是详细的设计思想&#xff1a; 1. 用户交互 滑块组件的核心是用户能够通过拖动滑块来选择一个值。因此&#xff0c;设计时需要考虑以下几点&…...

opencv函数展示4

一、形态学操作函数 1.基本形态学操作 &#xff08;1&#xff09;cv2.getStructuringElement() &#xff08;2&#xff09;cv2.erode() &#xff08;3&#xff09;cv2.dilate() 2.高级形态学操作 &#xff08;1&#xff09;cv2.morphologyEx() 二、直方图处理函数 1.直方图…...

附赠二张图,阐述我对大模型的生态发展、技术架构认识。

文章精炼&#xff0c;用两张图说明大模型发展业态方向&#xff0c;以及大模型主体技术架构。&#xff08;目前还需要进一步验证我的Thought && ideas&#xff0c;等待机会吧.........&#xff09; 图一&#xff1a;探究大模型三个层次应用方向&#xff0c;浅层次入门简…...

OpenCv高阶(九)——背景建模

目录 一、背景建模的核心目标与核心挑战 1. 核心目标 2. 核心挑战 ​二、背景建模模型 1、帧差法原理 2. 概率模型&#xff08;Parametric Models&#xff09; &#xff08;1&#xff09;高斯混合模型&#xff08;Gaussian Mixture Model, GMM&#xff09; &#xff08;…...

leetcode - 字符串

字符串 466. 统计重复个数 题目 定义 str [s, n] 表示 str 由 n 个字符串 s 连接构成。 例如&#xff0c;str ["abc", 3] "abcabcabc" 。 如果可以从 s2( )中删除某些字符使其变为 s1&#xff0c;则称字符串 s1( )可以从字符串 s2 获得。 例如&#xf…...

【基础IO上】复习C语言文件接口 | 学习系统文件接口 | 认识文件描述符 | Linux系统下,一切皆文件 | 重定向原理

1.关于文件的预备知识 1.1 文件的宏观理解 广义上理解&#xff0c;键盘、显示器等都是文件&#xff0c;因为我们说过“Linux下&#xff0c;一切皆文件”&#xff0c;当然我们现在对于这句话的理解是片面的&#xff1b;狭义上理解&#xff0c;文件在磁盘上&#xff0c;磁盘是一…...

Freertos--统计所有任务栈信息以及CPU占比和钩子函数

一、概念 在 FreeRTOS 中统计任务栈信息和 CPU 占比是为了分析栈使用情况防止溢出、优化性能识别高负载任务、合理分配资源避免内存浪费、调试系统排查阻塞或优先级问题&#xff0c;有助于提升效率、确保稳定性、快速定位问题并防止崩溃&#xff0c;比如在你的蜂鸣器任务中可以…...

京东商品详情API接口调用技术指南‌

本文基于京东宙斯开放平台&#xff08;JD Open API&#xff09;的 jingdong.ware.product.detail.search.get 接口&#xff0c;提供商品详情数据获取的完整技术方案&#xff0c;包含参数说明、代码实现及实战避坑指南。 一、接口功能与权限‌ 核心能力‌ 获取商品SKU的完整信…...

基于Java(JSP)+MySQL实现深度学习的音乐推荐系统

基于深度学习的音乐推荐系统简述 本文简要介绍我做的基于深度学习的音乐推荐系统。主要从需求分析与设计实现的角度来进行介绍。 需求分析 基于深度学习的音乐推荐系统旨在以个性化音乐推荐模型为基础&#xff0c;使用B/S架构的形式实现。个性化推荐模型使用了 随机梯度下降…...

Linux:进程间通信---匿名管道

文章目录 1. 进程间通信1.1 什么是进程间通信&#xff1f;1.2 为什么进程要进行进程间通信&#xff1f;1.3 怎么实现进程间通信&#xff1f; 2. 匿名管道2.1 匿名管道的原理2.2 匿名管道的系统接口2.3 匿名管道的使用2.4 匿名管道的运用场景 序&#xff1a;在上一篇文章中我们知…...

C++ 类及函数原型详解

一、引言 在C 编程中&#xff0c;类&#xff08;Class&#xff09;是面向对象编程的核心概念之一&#xff0c;它是一种用户自定义的数据类型&#xff0c;封装了数据和操作数据的函数&#xff08;成员函数&#xff09;。函数原型则为函数的声明提供了必要的信息&#xff0c;让编…...

深度学习小记(包括pytorch 还有一些神经网络架构)

这个是用来增加深度学习的知识面或者就是记录一些常用的命令,会不断的更新 import torchvision.transforms as transforms toPIL transforms.ToPILImage()#可以把tensor转换为Image类型的 imgtoPIL(img) #利用save就可以保存下来 img.save("/opt/data/private/stable_si…...

声音分离人声和配乐base,vocals,drums -从头设计数字生命第6课, demucs——仙盟创梦IDE

demucs -n htdemucs --two-stemsvocals 未来之窗.mp3 demucs -n htdemucs --shifts5 之.mp3demucs -n htdemucs --shifts5 -o wlzcoutspl 未来之窗.mp3 伴奏提取人声分离技术具有多方面的重大意义&#xff0c;主要体现在以下几个领域&#xff1a; 音乐创作与制作 创作便利…...

深度探索多模态数据:从声音到图像的奇妙世界

深度探索多模态数据&#xff1a;从声音到图像的奇妙世界 在多模态深度学习的旅程中&#xff0c;我们不仅要了解不同数据形式的融合策略&#xff0c;还需要熟悉各种数据类型的特性。今天&#xff0c;我们将探索两种常见但极具价值的模态&#xff1a;音频数据和医学CT扫描。 音…...

【数据可视化-32】全球住房市场分析(2015-2024 年)数据集可视化分析

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…...

JAVA---面向对象(下)

重生之我开始补知识第三集 1.标准 JavaBean 要求&#xff1a; 1&#xff09;类名需要见名知意 2&#xff09;成员变量使用private修饰 3&#xff09;至少提供两个构造方法 a.无参构造方法 b.带全部参数的构造方法 4&#xff09;成员方法 a.提供每一个成员变量对应的 …...

FPGA(现场可编程门阵列)笔记

*编程语言 - [Verilog]:硬件描述语言&#xff0c;语法风格类似于C语言&#xff0c;用于数字电路的设计。 - [SystemVerilog]:扩展自Verilog&#xff0c;增加了面向对象编程等特性&#xff0c;语法更接近于C&#xff0c;适用于复杂系统设计。 - [VHDL]:另一种硬件描述语言&…...

DAX Studio将PowerBI与EXCEL连接

DAX Studio将PowerBI与EXCEL连接 具体步骤如下&#xff1a; 第一步&#xff1a;先打开一个PowerBI的文件&#xff0c;在外部工具栏里打开DAXStudio&#xff0c;如图&#xff1a; 第二步&#xff1a;DAXStudio界面&#xff0c;点击Advanced选项卡-->Analyze in Excel&#…...

使用spring boot vue 上传mp4转码为dash并播放

1.前端实现 <template><div class"video-upload"><el-uploadclass"upload-demo"action"/api/upload":before-upload"beforeUpload":on-success"handleSuccess":on-error"handleError":show-file-…...

深入理解指针 (1)

1.内存和地址 1.1内存 1.1.1内存的使用和管理 &#xff08;1&#xff09;内存划分为一个个的内存单元&#xff0c;每个内存单元的大小是1个字节&#xff0c;一个内存单元可以存放8个bit。 &#xff08;2&#xff09;每个内存单元有一个编号&#xff0c;内存单元的编号在计…...

Leetcode98、230:二叉搜索树——递归学习

什么是二叉搜索树&#xff1a;右子树节点 > 根节点 > 左子树节点&#xff0c; 二叉搜索树中的搜索&#xff0c;返回给定值val所在的树节点 终止条件为传进来的节点为空、或者节点的值 val值&#xff0c;返回这个节点&#xff1b; 单程递归逻辑&#xff1a;定义一个resu…...

4/25 研0学习日志

Python学习 python 4个常用的数据容器 list dict tuple set list 列表中数据类型可以不一样 构造方式 mylist["xxx","xxxx"] 获取数据方式 mylist[1] mylist[:4] mylist[-1:] 添加数据 mylist.append() mylist.extern(["aaa","aaaa&…...

15. LangChain多模态应用开发:融合文本、图像与语音

引言&#xff1a;当AI学会"看听说想" 2025年某智慧医院的多模态问诊系统&#xff0c;通过同时分析患者CT影像、语音描述和电子病历&#xff0c;将误诊率降低42%。本文将基于LangChain多模态框架与Deepseek-R1&#xff0c;手把手构建能理解复合信息的智能系统。 一、…...

2022李宏毅老师机器学习课程笔记

机器学习笔记目录 1.绪论&#xff08;内容概述&#xff09;2.机器学习和深度学习的基本概念transformer 1.绪论&#xff08;内容概述&#xff09; 机器学习&#xff1a;让机器找一个函数&#xff0c;通过函数输出想要的结果。应用举例&#xff1a;语音识别&#xff0c;图像识别…...

笔试强训:Day2

一、字符串中找出连续最长的数字串(双指针) 字符串中找出连续最长的数字串_牛客题霸_牛客网 #include <iostream> #include <string> #include <cctype> using namespace std;int main() {//双指针string str;cin>>str;int nstr.size();int begin-1,l…...

linux合并命令(一行执行多个命令)的几种方式总结

背景&#xff1a; 最近安装配置机器&#xff0c;需要手打很多命令。又不能使用docker&#xff0c;所以就使用iTerm2连接多台服务器&#xff0c;然后move session到一个窗口中&#xff0c;shift command i使用XSHELL类似的撰写功能&#xff0c;就可以一次在多台服务器命令窗口…...

基于归纳共形预测的大型视觉-语言模型中预测集的**数据驱动校准**

摘要 本研究通过分离共形预测&#xff08;SCP&#xff09;框架&#xff0c;解决了大型视觉语言模型&#xff08;LVLMs&#xff09;在视觉问答&#xff08;VQA&#xff09;任务中幻觉缓解的关键挑战。虽然LVLMs在多模态推理方面表现出色&#xff0c;但它们的输出常常表现出具有…...

【器件专题1——IGBT第2讲】IGBT 基本工作原理:从结构到特性,一文解析 “电力电子心脏” 的核心机制

IGBT&#xff08;绝缘栅双极型晶体管&#xff0c;Insulated Gate Bipolar Transistor&#xff09;作为现代电力电子领域的核心器件&#xff0c;其工作原理融合了 MOSFET 的高效控制优势与 BJT 的大功率处理能力。本文从物理结构、导通 / 关断机制、核心特性等维度&#xff0c;深…...

【避坑指南】Spring拦截器中instanceof HandlerMethod失效的问题排查

问题背景 最近在使用Spring MVC开发项目时&#xff0c;我遇到了一个诡异的问题&#xff1a;在自定义拦截器的preHandle方法中&#xff0c;明明请求的是Controller层的方法&#xff0c;但handler instanceof HandlerMethod判断却总是返回false&#xff0c;导致拦截逻辑无法正常…...

青少年编程与数学 02-018 C++数据结构与算法 06课题、树

青少年编程与数学 02-018 C数据结构与算法 06课题、树 一、树(Tree)1. 树的定义2. 树的基本术语3. 常见的树类型4. 树的主要操作5. 树的应用 二、二叉树(Binary Tree)1. 二叉树的定义2. 二叉树的基本术语3. 二叉树的常见类型4. 二叉树的主要操作5. 二叉树的实现代码说明输出示例…...