base_ui/components/other/noUiSlider.vue
2025-02-01 13:04:55 +03:30

183 lines
4.5 KiB
Vue

<template>
<!-- <div id="slider"></div> -->
<div>
<div id="price-values " class="price-values">
<span
>حداقل :
<span ref="minPriceValue"
><input
class="min_value"
type="text"
v-model="sliderValue[0]"
@keyup="sendQuery()"
@keydown="onKeyDown()" /></span
></span>
<span
>حداکثر :
<span ref="maxPriceValue"
><input
class="max_value"
type="text"
v-model="sliderValue[1]"
@keyup="sendQuery()"
@keydown="onKeyDown()" /></span
></span>
</div>
<div ref="priceSlider" id="slider-round" ></div>
</div>
</template>
<script>
import noUiSlider from "nouislider";
import "nouislider/dist/nouislider.css";
export default {
name: "noUiSlider",
data() {
return {
slider: "",
sliderValue: [0, 100],
typingTimer: 0,
doneTypingInterval: 500,
};
},
mounted() {
this.slider = this.$refs.priceSlider;
noUiSlider.create(this.slider, {
start: [0, 100],
connect: true,
step: 10,
range: {
min: 0,
max: 50,
},
pips: {
mode: "steps",
stepped: true,
density: 4,
},
});
this.slider.noUiSlider.on("update", (values) => {
this.sliderValue = values.map((value) => parseInt(value)); // تبدیل مقادیر به عدد صحیح
});
},
watch: {
// sliderValue(newVal){
// this.$refs.priceSlider.noUiSlider.set(newVal);
// }
},
methods: {
updateSliderValue() {
const minInputValue = parseInt(this.sliderValue[0]);
const maxInputValue = parseInt(this.sliderValue[1]);
console.log(this.sliderValue);
if (!isNaN(minInputValue) && !isNaN(maxInputValue)) {
this.sliderValue = [minInputValue, maxInputValue];
this.$refs.priceSlider.noUiSlider.set(this.sliderValue);
}
},
sendQuery() {
clearTimeout(this.typingTimer);
this.typingTimer = setTimeout(() => {
this.updateSliderValue();
}, this.doneTypingInterval);
},
onKeyDown() {
clearTimeout(this.typingTimer);
},
},
};
</script>
<style lang="scss">
// .noUi-handle {
// width: 10px; /* عرض لغزنده */
// height: 10px; /* ارتفاع لغزنده */
// background-color: #3498db; /* رنگ پس زمینه لغزنده */
// border: 2px solid #2980b9; /* حاشیه لغزنده */
// border-radius: 50%; /* شکل لغزنده (دایره) */
// cursor: pointer; /* نشانگر موس را تغییر دهید */
// }
// // .noUi-active .noUi-handle {
// // transform: scale(1.2); /* تغییر اندازه لغزنده در وضعیت فعال */
// // transition: transform 0.2s ease; /* انیمیشن تغییر اندازه */
// // }
// /* سفارشی‌سازی شکل ظاهری میله */
// .noUi-connect {
// background: #3498db; /* رنگ پس زمینه میله */
// height: 8px; /* ارتفاع میله */
// border-radius: 10px; /* شکل گرد میله */
// }
// /* سفارشی‌سازی شکل ظاهری میله در حالت فعال */
// .min_value {
// border: none;
// }
.max_value {
border: none;
}
.min_value {
border: none; /* حذف تمام حاشیه‌ها و بوردر‌ها */
border-bottom: 2px solid #a7a098; /* افزودن بوردر پایین به عنوان حالت پیش‌فرض */
color: #a7a098;
/* حالت فوکوس */
&:focus {
outline: none; /* حذف نمایش بوردر فوکوس */
}
}
.max_value {
border: none; /* حذف تمام حاشیه‌ها و بوردر‌ها */
border-bottom: 2px solid #a7a098; /* افزودن بوردر پایین به عنوان حالت پیش‌فرض */
color: #a7a098;
/* حالت فوکوس */
&:focus {
outline: none; /* حذف نمایش بوردر فوکوس */
}
}
.price-values{
margin-bottom: 1rem;
display: flex;
flex-direction: column;
span{
margin-bottom: 17px;
}
}
#slider-round {
height: 10px;
}
.noUi-connect {
background: #3498db;
}
.noUi-handle {
background-color: #3498db;
height: 18px !important;
width: 18px !important;
top: -5px;
left: -10px !important;
right: -9px ; /* half the width */
border-radius: 9px !important;
cursor: pointer; /* نشانگر موس را تغییر دهید */
}
.noUi-handle::before{
content: none !important;
}
.noUi-handle::after{
content: none !important;
}
</style>