Skip to content
Back to skills

N Slider

ASecurity

A versatile slider component for selecting values within a range in Naive UI. Supports single value, range selection, marks, vertical mode, and custom handles.

  • 8 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added September 11, 2026
designvuenodeapi

Works with

  • api

Security analysis

A100/100

Scanned September 11, 2026

npx -y skills add jiaiyan/naive-ui-skills --skill n-slider --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of N Slider?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for N Slider
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/jiaiyan-n-slider/badge)](https://www.skillsdirectory.com/skills/jiaiyan-n-slider)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: n-slider
description: A versatile slider component for selecting values within a range in Naive UI. Supports single value, range selection, marks, vertical mode, and custom handles.
metadata:
  author: jiaiyan
  version: 1.0.0
---

# n-slider Component

The `n-slider` component allows users to select values by moving a handle along a track. It supports single value selection, range selection, custom marks, and both horizontal and vertical orientations.

## When to Use

Use `n-slider` when you need to:

- **Range Selection**: Allow users to select a value within a defined range
- **Volume/Brightness Control**: Adjust settings with continuous values
- **Price Filtering**: Set minimum and maximum price ranges
- **Progress Indication**: Display and adjust progress or position
- **Numeric Input**: Provide an intuitive way to input numeric values

## Basic Usage

### Basic Slider

A simple slider with step increments.

```vue
<template>
  <n-space vertical>
    <n-slider v-model:value="value" :step="10" />
    <n-input-number v-model:value="value" size="small" />
  </n-space>
</template>

<script setup>
import { ref } from 'vue'

const value = ref(50)
</script>
```

### Range Slider

Select a range with two handles.

```vue
<template>
  <n-space vertical>
    <n-slider v-model:value="range" range :step="1" />
    <n-space>
      <n-input-number v-model:value="range[0]" size="small" />
      <span>to</span>
      <n-input-number v-model:value="range[1]" size="small" />
    </n-space>
  </n-space>
</template>

<script setup>
import { ref } from 'vue'

const range = ref([20, 80])
</script>
```

### Slider with Marks

Display marks at specific positions on the track.

```vue
<template>
  <n-slider v-model:value="value" :marks="marks" :step="10" />
</template>

<script setup>
import { ref } from 'vue'

const value = ref(50)
const marks = {
  0: '0°C',
  20: '20°C',
  40: '40°C',
  60: '60°C',
  80: '80°C',
  100: '100°C'
}
</script>
```

### Restrict to Mark Values

Set `step="mark"` to restrict selection to mark values only.

```vue
<template>
  <n-slider v-model:value="value" :marks="marks" step="mark" />
</template>

<script setup>
import { ref } from 'vue'

const value = ref(20)
const marks = {
  0: 'Low',
  25: 'Medium-Low',
  50: 'Medium',
  75: 'Medium-High',
  100: 'High'
}
</script>
```

### Disabled Slider

```vue
<template>
  <n-slider :default-value="50" disabled />
</template>
```

### Disable Tooltip

Hide the tooltip that shows the current value.

```vue
<template>
  <n-slider :step="10" :tooltip="false" v-model:value="value" />
</template>

<script setup>
import { ref } from 'vue'

const value = ref(30)
</script>
```

### Format Tooltip

Customize the tooltip display format.

```vue
<template>
  <n-slider
    v-model:value="value"
    :step="10"
    :format-tooltip="formatTooltip"
  />
</template>

<script setup>
import { ref } from 'vue'

const value = ref(50)

const formatTooltip = (value) => `${value}%`
</script>
```

### Reverse Direction

Invert the track direction.

```vue
<template>
  <n-space vertical>
    <n-slider v-model:value="value" :step="10" reverse />
    <n-input-number v-model:value="value" size="small" />
  </n-space>
</template>

<script setup>
import { ref } from 'vue'

const value = ref(30)
</script>
```

### Vertical Slider

Enable vertical orientation.

```vue
<template>
  <n-space style="height: 300px; justify-content: center">
    <n-slider :default-value="77" vertical />
    <n-slider :default-value="20" vertical reverse />
    <n-slider :default-value="30" vertical disabled />
    <n-slider v-model:value="range" :marks="marks" vertical range />
  </n-space>
</template>

<script setup>
import { ref } from 'vue'

const range = ref([30, 70])
const marks = {
  0: '0',
  50: '50',
  100: '100'
}
</script>
```

### Always Show Tooltip

Keep the tooltip always visible.

```vue
<template>
  <n-slider show-tooltip v-model:value="value" />
</template>

<script setup>
import { ref } from 'vue'

const value = ref(50)
</script>
```

### Custom Handle

Customize the slider handle using the `thumb` slot.

```vue
<template>
  <n-slider v-model:value="value" :step="10">
    <template #thumb>
      <n-icon-wrapper :size="24" :border-radius="12">
        <n-icon :size="18" :component="CustomIcon" />
      </n-icon-wrapper>
    </template>
  </n-slider>
</template>

<script setup>
import { ref } from 'vue'
import { SettingsOutline as CustomIcon } from '@vicons/ionicons5'

const value = ref(50)
</script>
```

### Custom Marks

Use render functions for custom mark labels.

```vue
<template>
  <n-slider v-model:value="value" :marks="customMarks" range />
</template>

<script setup>
import { ref, h } from 'vue'

const value = ref([20, 80])

const customMarks = {
  0: () => h('span', { style: { color: '#999' } }, 'Start'),
  50: () => h('span', { style: { color: '#18a058' } }, 'Middle'),
  100: () => h('span', { style: { color: '#999' } }, 'End')
}
</script>
```

## API Reference

### n-slider Props

| Name | Type | Default | Description |
|------|------|---------|-------------|
| `default-value` | `number \| [number, number] \| null` | `null` | Default value |
| `disabled` | `boolean` | `false` | Whether the slider is disabled |
| `format-tooltip` | `(value: number) => string \| number` | `undefined` | Format tooltip content |
| `keyboard` | `boolean` | `true` | Whether the slider can be controlled by keyboard |
| `marks` | `{ [markValue: number]: string \| (() => VNodeChild) }` | `undefined` | Marks on the slider track |
| `max` | `number` | `100` | Maximum value |
| `min` | `number` | `0` | Minimum value |
| `placement` | `'top-start' \| 'top' \| 'top-end' \| 'right-start' \| 'right' \| 'right-end' \| 'bottom-start' \| 'bottom' \| 'bottom-end' \| 'left-start' \| 'left' \| 'left-end'` | `undefined` | Tooltip placement |
| `range` | `boolean` | `false` | Whether to use range selection |
| `reverse` | `boolean` | `false` | Whether to reverse the track direction |
| `show-tooltip` | `boolean` | `false` | Whether to always show tooltip (non-range only) |
| `step` | `number \| 'mark'` | `1` | Step value. Use `'mark'` to restrict to mark values |
| `tooltip` | `boolean` | `true` | Whether to show tooltip |
| `vertical` | `boolean` | `false` | Whether to enable vertical mode |
| `value` | `number \| [number, number] \| null` | `undefined` | Current value (controlled mode) |

### Events

| Name | Parameters | Description |
|------|------------|-------------|
| `on-update:value` | `(value: number \| [number, number]) => void` | Callback when value updates |
| `on-dragstart` | `() => void` | Callback when dragging starts |
| `on-dragend` | `() => void` | Callback when dragging ends |

### Slots

| Name | Parameters | Description |
|------|------------|-------------|
| `thumb` | `()` | Custom thumb/handle element |

## Common Patterns

### Price Range Filter

```vue
<template>
  <n-card title="Price Range">
    <n-slider
      v-model:value="priceRange"
      range
      :min="0"
      :max="1000"
      :step="10"
      :format-tooltip="formatPrice"
    />
    <n-space justify="space-between" style="margin-top: 12px">
      <span>${{ priceRange[0] }}</span>
      <span>${{ priceRange[1] }}</span>
    </n-space>
  </n-card>
</template>

<script setup>
import { ref } from 'vue'

const priceRange = ref([100, 500])

const formatPrice = (value) => `$${value}`
</script>
```

### Volume Control

```vue
<template>
  <n-space align="center">
    <n-icon :component="VolumeLow" />
    <n-slider
      v-model:value="volume"
      :min="0"
      :max="100"
      :step="1"
      style="width: 200px"
    />
    <n-icon :component="VolumeHigh" />
    <span>{{ volume }}%</span>
  </n-space>
</template>

<script setup>
import { ref } from 'vue'
import { VolumeLowOutline as VolumeLow, VolumeHighOutline as VolumeHigh } from '@vicons/ionicons5'

const volume = ref(50)
</script>
```

### Temperature Selector

```vue
<template>
  <n-space vertical>
    <n-slider
      v-model:value="temperature"
      :min="16"
      :max="30"
      :marks="tempMarks"
      :format-tooltip="formatTemp"
    />
    <n-space justify="center">
      <n-tag :type="tempType">Current: {{ temperature }}°C</n-tag>
    </n-space>
  </n-space>
</template>

<script setup>
import { ref, computed } from 'vue'

const temperature = ref(22)

const tempMarks = {
  16: '16°C',
  20: '20°C',
  24: '24°C',
  28: '28°C',
  30: '30°C'
}

const formatTemp = (value) => `${value}°C`

const tempType = computed(() => {
  if (temperature.value < 20) return 'info'
  if (temperature.value < 26) return 'success'
  return 'warning'
})
</script>
```

### Slider in Form

```vue
<template>
  <n-form ref="formRef" :model="formData">
    <n-form-item label="Brightness" path="brightness">
      <n-slider
        v-model:value="formData.brightness"
        :min="0"
        :max="100"
        :format-tooltip="(v) => `${v}%`"
      />
    </n-form-item>
    <n-form-item label="Contrast" path="contrast">
      <n-slider
        v-model:value="formData.contrast"
        :min="-100"
        :max="100"
        :format-tooltip="(v) => `${v > 0 ? '+' : ''}${v}`"
      />
    </n-form-item>
  </n-form>
</template>

<script setup>
import { ref } from 'vue'

const formData = ref({
  brightness: 50,
  contrast: 0
})
</script>
```

## Best Practices

### 1. Provide Visual Feedback

Always show the current value alongside the slider:

```vue
<template>
  <n-space vertical>
    <n-slider v-model:value="value" />
    <span>Value: {{ value }}</span>
  </n-space>
</template>
```

### 2. Use Marks for Key Values

Add marks to help users understand the scale:

```vue
<template>
  <n-slider v-model:value="value" :marks="{ 0: 'Min', 50: 'Mid', 100: 'Max' }" />
</template>
```

### 3. Format Tooltips for Clarity

Use `format-tooltip` to display meaningful values:

```vue
<template>
  <n-slider :format-tooltip="(v) => `$${v}`" v-model:value="price" />
</template>
```

### 4. Set Appropriate Step Values

Choose step values that match your use case:

```vue
<template>
  <n-space vertical>
    <n-slider :step="1" v-model:value="precise" />
    <n-slider :step="10" v-model:value="coarse" />
  </n-space>
</template>
```

### 5. Use Range for Interval Selection

Use range mode when users need to select an interval:

```vue
<template>
  <n-slider range v-model:value="range" />
</template>
```

### 6. Consider Vertical for Space-Constrained Layouts

Use vertical sliders when horizontal space is limited:

```vue
<template>
  <div style="height: 200px">
    <n-slider vertical v-model:value="value" />
  </div>
</template>
```

### 7. Disable Keyboard When Needed

Disable keyboard control for touch-optimized interfaces:

```vue
<template>
  <n-slider :keyboard="false" v-model:value="value" />
</template>
```

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.