You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Flutter中实现如图所示的滑块组件?

定制滑块组件实现方案

根据你提供的滑块样式(带自定义圆形手柄、已选区间填充色、支持数值显示),以下两种方案可以实现需求:

方案一:基于React生态定制(react-slider)

如果用React开发,react-slider支持高度样式定制,适配性强:

  1. 安装依赖
npm install react-slider
  1. 组件代码示例
import React, { useState } from 'react';
import Slider from 'react-slider';
import './CustomSlider.css';

const CustomSlider = () => {
  const [currentValue, setCurrentValue] = useState(30);

  return (
    <div className="slider-box">
      <Slider
        value={currentValue}
        onChange={setCurrentValue}
        min={0}
        max={100}
        className="base-slider"
        thumbClassName="slider-handle"
        trackClassName="filled-track"
        railClassName="empty-rail"
      />
      <span className="value-label">{currentValue}%</span>
    </div>
  );
};

export default CustomSlider;
  1. 样式文件(CustomSlider.css)
.slider-box {
  width: 80%;
  margin: 2rem auto;
  display: flex;
  flex-direction: column;
  align-items: center;
}

.base-slider {
  width: 100%;
  height: 6px;
}

.empty-rail {
  height: 100%;
  background: #e5e7eb;
  border-radius: 3px;
}

.filled-track {
  height: 100%;
  background: #3b82f6;
  border-radius: 3px;
}

.slider-handle {
  width: 20px;
  height: 20px;
  border-radius: 50%;
  background: #fff;
  border: 2px solid #3b82f6;
  cursor: pointer;
  top: -7px;
}

.value-label {
  margin-top: 10px;
  font-size: 0.875rem;
  color: #374151;
}

方案二:原生JS手写实现

不想依赖第三方库的话,原生代码也能快速实现:

  1. HTML结构
<div class="slider-container">
  <div class="slider">
    <div class="filled-part"></div>
    <div class="slider-dot"></div>
  </div>
  <div class="value-text">30%</div>
</div>
  1. CSS样式
.slider-container {
  width: 80%;
  margin: 2rem auto;
}

.slider {
  position: relative;
  width: 100%;
  height: 6px;
  background: #e5e7eb;
  border-radius: 3px;
  cursor: pointer;
}

.filled-part {
  position: absolute;
  height: 100%;
  background: #3b82f6;
  border-radius: 3px;
  width: 30%;
}

.slider-dot {
  position: absolute;
  top: 50%;
  left: 30%;
  transform: translate(-50%, -50%);
  width: 20px;
  height: 20px;
  border-radius: 50%;
  background: #fff;
  border: 2px solid #3b82f6;
  cursor: grab;
}

.slider-dot:active {
  cursor: grabbing;
}

.value-text {
  text-align: center;
  margin-top: 10px;
  font-size: 0.875rem;
  color: #374151;
}
  1. JS交互逻辑
const slider = document.querySelector('.slider');
const filledPart = document.querySelector('.filled-part');
const sliderDot = document.querySelector('.slider-dot');
const valueText = document.querySelector('.value-text');

function updateSliderPosition(e) {
  const sliderRect = slider.getBoundingClientRect();
  const ratio = Math.max(0, Math.min(1, (e.clientX - sliderRect.left) / sliderRect.width));
  const currentValue = Math.round(ratio * 100);

  filledPart.style.width = `${ratio * 100}%`;
  sliderDot.style.left = `${ratio * 100}%`;
  valueText.textContent = `${currentValue}%`;
}

// 点击滑块触发
slider.addEventListener('mousedown', (e) => {
  updateSliderPosition(e);
  window.addEventListener('mousemove', updateSliderPosition);
  window.addEventListener('mouseup', () => window.removeEventListener('mousemove', updateSliderPosition));
});

// 拖拽手柄触发
sliderDot.addEventListener('mousedown', (e) => {
  e.stopPropagation();
  window.addEventListener('mousemove', updateSliderPosition);
  window.addEventListener('mouseup', () => window.removeEventListener('mousemove', updateSliderPosition));
});

补充:添加刻度标记

如果需要图中的刻度线,在容器内添加刻度元素即可:

<div class="slider-container">
  <div class="slider-ticks">
    <span class="tick"></span>
    <span class="tick"></span>
    <span class="tick"></span>
    <span class="tick"></span>
    <span class="tick"></span>
  </div>
  <!-- 原滑块结构 -->
</div>

对应CSS:

.slider-ticks {
  display: flex;
  justify-content: space-between;
  padding: 0 10px;
  margin-bottom: 6px;
}

.tick {
  width: 2px;
  height: 8px;
  background: #d1d5db;
}

内容的提问来源于stack exchange,提问作者code box

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 02:40:41