返回 slidev
FormSlider.vue
根目录 / packages / client / internals / FormSlider.vue
1 <script setup lang="ts">
2 const props = defineProps<{
3 max: number
4 min: number
5 step: number
6 unit?: string
7 default?: number
8 }>()
9
10 const value = defineModel<number>('modelValue', {
11 type: Number,
12 })
13 </script>
14
15 <template>
16 <div relative h-22px w-60 flex-auto @dblclick="props.default !== undefined ? value = props.default : null">
17 <input
18 v-model.number="value" type="range" class="slider"
19 v-bind="props"
20 absolute bottom-0 left-0 right-0 top-0 z-10 w-full align-top
21 >
22 <span
23 v-if="props.default != null"
24 border="r main" absolute bottom-0 top-0 h-full w-1px op75
25 :style="{
26 left: `${(props.default - min) / (max - min) * 100}%`,
27 }"
28 />
29 </div>
30 <div relative h-22px>
31 <input v-model.number="value" type="number" v-bind="props" border="~ main rounded" m0 w-20 bg-gray:5 pl2 align-top text-sm>
32 <span v-if="props.unit" pointer-events-none absolute right-1 top-0.5 text-xs op25>{{ props.unit }}</span>
33 </div>
34 </template>
35
36 <style>
37 .slider {
38 appearance: none;
39 height: 22px;
40 outline: none;
41 opacity: 0.7;
42 -webkit-transition: 0.2s;
43 transition: opacity 0.2s;
44 --uno: border border-main rounded of-hidden bg-gray/5;
45 }
46
47 .slider:hover {
48 opacity: 1;
49 }
50
51 .slider::-webkit-slider-thumb {
52 -webkit-appearance: none;
53 appearance: none;
54 width: 5px;
55 height: 22px;
56 background: var(--slidev-theme-primary);
57 cursor: pointer;
58 z-index: 10;
59 }
60
61 .slider::-moz-range-thumb {
62 width: 5px;
63 height: 22px;
64 background: var(--slidev-theme-primary);
65 cursor: pointer;
66 z-index: 10;
67 }
68 </style>
69
69 lines Plain Text