【问题标题】:jQuery UI Slider -> with mousewheel support?jQuery UI Slider -> 支持鼠标滚轮?
【发布时间】:2011-04-19 21:30:28
【问题描述】:

你可能已经知道我是 jQuery 的新手,所以不属于这个主题的代码改进仍然是非常允许的。

这是我的 HTML 代码:

<div style="display: inline-block; width: 120px;">
    <div>
        Bananas:
        <br />
        <input id="bananas_amount" />
        <input id="bananas_amount_percent" />
    </div>
    <br />
    <div id="bananas" style="height:200px;"></div>
</div>

这是我可怕的 js 代码:

$( "#bananas" ).slider({
    orientation: "vertical",
    range: "min",
    min: 0,
    max: 100,
    value: 20,
    step: 5,
    slide: function( event, ui ) {
        $( "#bananas_amount_percent" ).val( ui.value + " %" );

            // the code displays a percentage by standart, but I need the real value, too:
            var bananas_amount_percent = $( "#bananas_amount_percent" ).val();
            var bananas_amount_percent = bananas_amount_percent.replace(" %", "");
            var bananas_amount = Math.round((weight / 100) * bananas_amount_percent);
            $( "#bananas_amount" ).val( bananas_amount + " g" );
    }
});
$( "#bananas_amount_percent" ).val( $( "#bananas" ).slider( "value" ) + " %" );

// again the real value (else the value would not be updatet on reload-reset)
var bananas_amount_percent = $( "#bananas_amount_percent" ).val();
var bananas_amount_percent = bananas_amount_percent.replace(" %", "");
var bananas_amount = Math.round((weight / 100) * bananas_amount_percent);
$( "#bananas_amount" ).val( bananas_amount + " g" );

(体重为200)

但是,它可以工作,除了一个“小”细节:不是鼠标滚轮! 我已经发现我需要这个扩展:https://github.com/brandonaaron/jquery-mousewheel/downloads

但我真的完全不知道如何在我的 Slider 中实现它(顺便说一句,我的网站上有 5 个)。

请帮助, 谢谢!

【问题讨论】:

  • 只是一个想法,使用更短的变量和类名使您的代码更具可读性。 ;)
  • 变量名本身非常重要,因此它们必须尽可能具有表现力。但是你仍然可以在这里发布它们是正确的。我可以编辑它们谢谢!
  • 当你说“这是我可怕的 js 代码:”时,我认为你把它钉在了一起。
  • 另一个好的做法是将行宽限制为 80 或 100 个字符。使用太长的变量名会降低可读性。

标签: javascript jquery jquery-ui mousewheel jquery-ui-slider


【解决方案1】:

鼠标滚轮插件对于它的作用来说太重了。我提取了精华。适用于所有浏览器。

$('#bananas').bind('mousewheel DOMMouseScroll', function (e) {
    var delta = 0, element = $(this), value, result, oe;
    oe = e.originalEvent; // for jQuery >=1.7
    value = element.slider('value');

    if (oe.wheelDelta) {
        delta = -oe.wheelDelta;
    }
    if (oe.detail) {
        delta = oe.detail * 40;
    }

    value -= delta / 8;
    if (value > 100) {
        value = 100;
    }
    if (value < 0) {
        value = 0;
    }

    result = element.slider('option', 'slide').call(element, e, { value: value });
    if (result !== false) {
        element.slider('value', value);
    }
    return false;
});

编辑:将#slider 更改为#bananas

EDIT2:添加触发slide事件

因为您只使用value 属性,所以我只使用此属性传递参数对象。如果您需要更多内容,请记住将其添加到鼠标滚轮代码中。

EDIT3:当slide 函数返回false 时添加更改取消功能(就像在文档中一样)

更新:delta 不仅显示了车轮的方向,而且还有更深层次的含义。它描述了要滚动的像素数。滚动的默认设置是 3 行,即 120 像素,但可以不同。
如果您只想检索车轮的方向,请更改:

value -= delta / 8;

到这里:

value -= (delta > 0) ? 5 : (delta < 0) ? -5 : 0;

虽然delta === 0 永远不会出现。

更新:为较新版本的 jQuery (e.originalEvent) 添加了部分。

【讨论】:

  • 非常感谢!有用!我对 delta 变量(*40 / 8 ?)有点恼火,当我滚动它时,它会将值增加 30,如何将其更改为 5?
【解决方案2】:

我之前没有使用过鼠标滚轮插件,但据我所知,它应该像这样使用:

$("#DivName").mousewheel(function(event, delta) {
     //Trigger slide event


      //Prevent the default mouse wheel
      event.preventDefault();

});

DivName 可能是您的滑块,我相信 Delta 是滚动方向(以单位为单位)所以我猜负数是向上,正数是向下。

【讨论】:

    【解决方案3】:
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script>
    var slider = $('[your selector ]');
    slider.lightSlider();
    slider.on('mousewheel', function(e) {
        if (e.deltaY > 0) {
            slider.goToPrevSlide();
        } else {
            slider.goToNextSlide();
        }
        e.preventDefault();
    });
    </script>
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-23
    • 2014-07-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多