vue3 vite element根据自定义数据实现离散滑块

版本:

js 复制代码
"element-plus": "^2.11.9",
 "vue": "^3.5.13"
 "@vitejs/plugin-vue": "^5.2.1",
 "vite": "^6.0.11",
 "vite-plugin-vue-devtools": "^7.7.1"

main.js中的内容:

js 复制代码
import './assets/main.css'

import { createApp } from 'vue'
import App from './App.vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'

const app = createApp(App)

app.use(ElementPlus)
app.mount('#app')

app.vue中的内容如下:

js 复制代码
<template>
  <div class="discrete-slider-container">
    <div class="slider-section">
      <div class="slider-wrapper">
        <div class="vertical-layout">
          <!-- 标签区域 - 反转显示 -->
          <div class="discrete-labels">
            <div
                v-for="(value, index) in reversedValues"
                :key="index"
                class="discrete-label"
                :class="{ active: sliderIndex === (discreteValues.length - 1 - index) }"
                @click="handleLabelClick(discreteValues.length - 1 - index)"
            >
              {{ value }}
            </div>
          </div>

          <!-- 滑块区域 -->
          <div class="slider-area">
            <el-slider
                v-model="sliderIndex"
                :min="0"
                :max="discreteValues.length - 1"
                :step="1"
                :show-stops="true"
                :marks="sliderMarks"
                :show-tooltip="true"
                :format-tooltip="formatTooltip"
                @change="handleSliderChange"
                vertical
                height="300px"
            />
          </div>
        </div>
      </div>
    </div>
  </div>
</template>

<script setup>
import { ref, computed, onMounted } from 'vue'
import { ElSlider } from 'element-plus'

// 离散值数组
const discreteValues = [10, 30, 100, 150, 400]

// 当前滑块索引
const sliderIndex = ref(0)

// 反转后的值数组(用于显示)
const reversedValues = computed(() => {
  return [...discreteValues].reverse()
})

// 滑块刻度配置
const sliderMarks = computed(() => {
  const marks = {}
  discreteValues.forEach((value, index) => {
    marks[index] = {
      style: {
        color: '#409EFF',
        fontSize: '12px',
        marginLeft: '8px'
      },
      label: value
    }
  })
  return marks
})

// 格式化工具提示
const formatTooltip = (val) => {
  return discreteValues[val]
}

// 处理滑块变化
const handleSliderChange = (value) => {
  console.log('滑块值变化:', discreteValues[value])
}

// 处理标签点击
const handleLabelClick = (index) => {
  sliderIndex.value = index
}

// 组件挂载时初始化
onMounted(() => {
  console.log('离散滑块组件已加载,可用值:', discreteValues)
})
</script>

<style scoped>
.discrete-slider-container {
  max-width: 800px;
  margin: 0 auto;
  padding: 20px;
  font-family: 'Helvetica Neue', Arial, sans-serif;
}

.slider-section {
  background: white;
  padding: 30px;
  border-radius: 12px;
  box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
  margin-bottom: 20px;
}

.slider-wrapper {
  position: relative;
}

.vertical-layout {
  display: flex;
  align-items: center;
  gap: 40px;
  justify-content: center;
}

.discrete-labels {
  display: flex;
  flex-direction: column;
  gap: 10px;
}

.discrete-label {
  padding: 12px 20px;
  border-radius: 8px;
  cursor: pointer;
  transition: all 0.3s ease;
  font-size: 14px;
  font-weight: 500;
  color: #666;
  border: 1px solid transparent;
  text-align: center;
  min-width: 80px;
}

.discrete-label:hover {
  background-color: #f0f9ff;
  color: #409EFF;
  border-color: #409EFF;
}

.discrete-label.active {
  background-color: #409EFF;
  color: white;
  transform: scale(1.05);
}

.slider-area {
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 20px 0;
}

/* 调整 Element Plus 垂直滑块样式 */
:deep(.el-slider--vertical) {
  height: 300px;
}

:deep(.el-slider__marks-text) {
  margin-left: 12px;
}
</style>

运行后的效果如下:


相关推荐
专业程序开发源9 分钟前
springboot生命故事书制作小程序65290-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·mysql·小程序·课程设计
鬓戈12 分钟前
Claude Code frontend-design 插件调研 与 Vue 旧系统风格一致性方案
前端·vue.js·人工智能
开开心心就好18 分钟前
以图搜图找重复图片,本地工具离线就能用
javascript·智能手机·ffmpeg·c#·ocr·word·音视频
vx_Biye_Design25 分钟前
springboot角色扮演服务平台65161-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·python·spring·课程设计
企业数字化笔记27 分钟前
视频局部合成怎么做得自然?掩膜修复、边缘羽化、时序稳定与背景替换
java·javascript·音视频
vx_Biye_Design36 分钟前
springboot咖啡厅顾客点单管理系统12080-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·spring·课程设计·express
vx_Biye_Design1 小时前
springbootNBA数据分析系统平台42434-计算机课程设计、毕业设计
java·vue.js·spring boot·python·django·课程设计·express
liangshanbo12153 小时前
JavaScript 面试题:Object.keys() 的返回顺序是无序的吗?
开发语言·javascript·ecmascript
默_笙15 小时前
🚦 请三个 AI 考官给 RAG 打分:量化评估实战(下)
前端·javascript
阿坨15 小时前
灵感闪存卡:一款 Tampermonkey用户脚本
javascript·tampermonkey