如何使用noUiSlider加载输入和输出在2个值之间的多个滑块? [英] How to load multiple sliders handling between 2 values with input and output with noUiSlider?

查看:84
本文介绍了如何使用noUiSlider加载输入和输出在2个值之间的多个滑块?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我被卡住了.我想用noUiSlider创建多个范围滑块.每个滑块必须处理到[0,100]的值; (最小值= 0,最大值= 100,).此外,我需要按处理程序进行值的输出和输入,并由用户输入.

I'm stuck.. I want to create multiple range sliders with noUiSlider. Each slider has to handle between to values [0,100]; (min=0, max=100,). Moreover i need a output and input of values by handler and entered by User.

在此处查看我当前的代码:

See my current code here:

		function data ( element, key ) {
			return element.getAttribute('data-' + key);   
		}
		
		var connectSlider = document.getElementsByClassName('slider'); 
		var input0 = document.getElementsByClassName('input-format-0');
		var input1 = document.getElementsByClassName('input-format-1');
		var inputs = [input0, input1];
		
		function createSlider ( slider ) {
			
				noUiSlider.create( connectSlider,{
					start: [0, 100],
					connect: false,
					step: Number(data(slider, 'step')) || 1,
					range: {
						'min': [0],
						'max': [100],
					},
					tooltips: true,
					connect: true,
					format: {
						to: function (value) {
							return value + '%';
						},
						from: function (value) {
							return value.replace('%', '');
						},
					}
				});
		}
		connectSlider.noUiSlider.on('update', function( values, handle ) {
			inputs[handle].value = values[handle];
		});
		
		Array.prototype.forEach.call(document.querySelectorAll('.slider'), createSlider); 

	

		function setSliderHandle(i, value) {
			var r = [null,null];
			r[i] = value;
			connectSlider.noUiSlider.set(r);
		}

		// Listen to keydown events on the input field.
		inputs.forEach(function(input, handle) {

			input.addEventListener('change', function(){
				setSliderHandle(handle, this.value);
			});

			input.addEventListener('keydown', function( e ) {

				var values = connectSlider.noUiSlider.get();
				var value = Number(values[handle]);

				// [[handle0_down, handle0_up], [handle1_down, handle1_up]]
				var steps = connectSlider.noUiSlider.steps();

				// [down, up]
				var step = steps[handle];

				var position;

				// 13 is enter,
				// 38 is key up,
				// 40 is key down.
				switch ( e.which ) {

					case 13:
						setSliderHandle(handle, this.value);
						break;

					case 38:

						// Get step to go increase slider value (up)
						position = step[1];

						// false = no step is set
						if ( position === false ) {
							position = 1;
						}

						// null = edge of slider
						if ( position !== null ) {
							setSliderHandle(handle, value + position);
						}

						break;

					case 40:

						position = step[0];

						if ( position === false ) {
							position = 1;
						}

						if ( position !== null ) {
							setSliderHandle(handle, value - position);
						}

						break;
				}
			});
		});

  
  
  
  

<link href="https://refreshless.com/noUiSlider/distribute/nouislider.min.css" rel="stylesheet"/>
<script src="https://refreshless.com/noUiSlider/distribute/nouislider.js"></script>

						<div class="rangefilter">
							<div class="slider"></div>
							<ul>
								<li class="left"><input class="input-format-0" type="text"></li>
								<li class="right"><input class="input-format-1" type="text"></li>
							</ul>
						</div>

如果有人可以帮助我,那将非常好. 谢谢. 最好的祝福.

Would be really nice if somebody could help me. Thank's. Best regards.

推荐答案

遇到了类似的问题.在解决方案上花费了3天.解决方案不是最佳的.但是现在这是我所能提供的最好的.

Faced a similar problem. Spent 3 days on the solution. The solution is not optimal. But now this is the best I can offer.

HTML:

<div class="custom-range-slider">

  <span class="custom-range-slider__input-text">from</span>
  <input class="custom-range-slider__input custom-range-slider__input--from" type="number">

  <span class="custom-range-slider__input-text">to</span>
  <input class="custom-range-slider__input custom-range-slider__input--to" type="number">

  <div class="custom-range-slider__track"></div>
</div>

<br>
<br>
<br>

<div class="custom-range-slider">

  <span class="custom-range-slider__input-text">from</span>
  <input class="custom-range-slider__input custom-range-slider__input--from" type="number">

  <span class="custom-range-slider__input-text">to</span>
  <input class="custom-range-slider__input custom-range-slider__input--to" type="number">

  <div class="custom-range-slider__track"></div>
</div>

<br>
<br>
<br>

<div class="custom-range-slider">

  <span class="custom-range-slider__input-text">from</span>
  <input class="custom-range-slider__input custom-range-slider__input--from" type="number">

  <span class="custom-range-slider__input-text">to</span>
  <input class="custom-range-slider__input custom-range-slider__input--to" type="number">

  <div class="custom-range-slider__track"></div>
</div>

JS:

var rangeSlidersTrack = document.querySelectorAll('.custom-range-slider .custom-range-slider__track');
var rangeSlidersInputFrom = document.querySelectorAll('.custom-range-slider .custom-range-slider__input--from');
var rangeSlidersInputTo = document.querySelectorAll('.custom-range-slider .custom-range-slider__input--to');
var rangeSliderInputs = [];

for(var i = 0; i < rangeSlidersTrack.length; i++) {
    rangeSliderInputs.push([rangeSlidersInputFrom[i], rangeSlidersInputTo[i]]);
}

[].slice.call(rangeSlidersTrack).forEach(function(slider, index) {
    noUiSlider.create(slider, {
        start: [0, 500],
        connect: true,
        range: {
            'min': 0,
            'max': 500
        }
    }).on('update', function(values, handle) {
        rangeSliderInputs[index][handle].value = parseInt(values[handle]);
    });

    function setSliderHandle(i, value) {
        var r = [null,null];
        r[i] = value;
        slider.noUiSlider.set(r);
    }

    rangeSliderInputs[index].forEach(function(input, handle) {

        input.addEventListener('change', function(){
            setSliderHandle(handle, this.value);
        });

        input.addEventListener('keydown', function(e) {

            var values = slider.noUiSlider.get();
            var value = Number(values[handle]);

            // [[handle0_down, handle0_up], [handle1_down, handle1_up]]
            var steps = slider.noUiSlider.steps();

            // [down, up]
            var step = steps[handle];

            var position;

            // 13 is enter,
            // 38 is key up,
            // 40 is key down.
            switch (e.which) {

                case 13:
                    setSliderHandle(handle, this.value);
                    break;

                case 38:

                    // Get step to go increase slider value (up)
                    position = step[1];

                    // false = no step is set
                    if ( position === false ) {
                        position = 1;
                    }

                    // null = edge of slider
                    if ( position !== null ) {
                        setSliderHandle(handle, value + position);
                    }

                    break;

                case 40:

                    position = step[0];

                    if ( position === false ) {
                        position = 1;
                    }

                    if ( position !== null ) {
                        setSliderHandle(handle, value - position);
                    }

                    break;
            }
        });

    });

});

小提琴

这篇关于如何使用noUiSlider加载输入和输出在2个值之间的多个滑块?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆