3

我正在尝试使用 noUISlider 加载多个滑块,但它不起作用。使用第一个滑块时,第二个和第三个的值会发生变化。如何重构一个滑块的代码,以便轻松添加具有不同选项的其他滑块?

这是一个小提琴,下面是我的代码。

// noUISlider
        var actSlider = document.getElementById('act-slider');

        noUiSlider.create(actSlider, {
            start: [0, 50],
            connect: false,
            step: 1,
            range: {
                'min': 0,
                'max': 50
            },
            format: {
                to: function (value) {
                    return value + '';
                },
                from: function (value) {
                    return value.replace('', '');
                }
            }
        });

        // Connect bar
        var connectBar = document.createElement('div'),
            connectBase = actSlider.getElementsByClassName('noUi-base')[0],
            connectHandles = actSlider.getElementsByClassName('noUi-origin');

        // Give the bar a class for styling and add it to the slider.
        connectBar.className += 'connect';
        connectBase.appendChild(connectBar);

        actSlider.noUiSlider.on('update', function (values, handle) {

            // Pick left for the first handle, right for the second.
            var side = handle ? 'right' : 'left',
            // Get the handle position and trim the '%' sign.
                offset = (connectHandles[handle].style.left).slice(0, -1);

            // Right offset is 100% - left offset
            if (handle === 1) {
                offset = 100 - offset;
            }

            connectBar.style[side] = offset + '%';
        });

        // Value tooltips
        var tipHandles = actSlider.getElementsByClassName('noUi-handle'),
            tooltips = [];

        // Add divs to the slider handles.
        for (var i = 0; i < tipHandles.length; i++) {
            tooltips[i] = document.createElement('div');
            tooltips[i].className += 'value-tooltip';
            tipHandles[i].appendChild(tooltips[i]);
        }

        // When the slider changes, write the value to the tooltips.
        actSlider.noUiSlider.on('update', function (values, handle) {
            tooltips[handle].innerHTML = values[handle];
        });
4

1 回答 1

5

您可以将滑块创建包装在一个函数中,并为您想要创建滑块的所有元素调用它。

noUiSlider 还支持tooltips(从版本 8.1.0 开始)和connect选项,因此如果您不想进行非常具体的更改,则不必自己实现这些。

至于每个滑块的不同选项,有几种方法可以做到这一点。我为该step选项添加了一个使用数据属性的示例。

以下代码在所有具有.slider类的元素上初始化滑块。

function data ( element, key ) {
    return element.getAttribute('data-' + key);   
}

function createSlider ( slider ) {

        noUiSlider.create(slider, {
            start: [0, 50],
            connect: false,
            step: Number(data(slider, 'step')) || 1,
            range: {
                'min': 0,
                'max': 50
            },
            tooltips: true,
            connect: true,
            format: {
                to: function (value) {
                    return value + '';
                },
                from: function (value) {
                    return value.replace('', '');
                }
            }
        });
}

Array.prototype.forEach.call(document.querySelectorAll('.slider'), createSlider);

这是一个演示此代码的jsFiddle 。

于 2015-10-30T07:20:15.767 回答