【问题标题】:How do I keep a selected LI visible (not hidden)?如何保持选定的 LI 可见(不隐藏)?
【发布时间】:2017-01-06 03:56:58
【问题描述】:

我正在使用 jQuery 1.12。我有一个带有 LI 元素的样式化 UL。当 DIV 具有焦点时,我使用以下代码使用键盘上的向上或向下箭头选择这些元素...

 $(".select").bind('keydown', function(event) {
    var currentElement = $(this).find(".select-options li.selected");
    if (currentElement.length == 0) {
        currentElement = $(this).find(".select-options li")[0];
      $(currentElement).addClass("selected");
      return;
    }       // if
    var nextElement;
    switch(event.keyCode){
    // case up
    case 38:
        nextElement = $(this).find(".select-options li")[($(this).find(".select-options li").index(currentElement) - 1) % $(this).find(".select-options li").length];
        break;
    case 40:
        nextElement = $(this).find(".select-options li")[($(this).find(".select-options li").index(currentElement) + 1) % $(this).find(".select-options li").length];
      break;
    }
    $(this).find(".select-options li").removeClass("selected");
    if(nextElement !== null) {
        $(nextElement).addClass("selected");
    }
 });

问题是,如果您连续单击向下键(例如),最终您将无法看到所选项目。如何调整以使所选项目始终可见?说明问题的小提琴在这里——http://jsfiddle.net/sge8g5qu/1/

【问题讨论】:

  • 最好的办法是将其限制在屏幕高度内。这就是 Facebook 或 Google 所做的。
  • 你编辑我的小提琴来说明你在说什么吗?
  • 正如How do I mimic keyboard behavior in my styled select dropdown? 中提到的,最简单的解决方案是使用jQuery UI selectMenu 小部件,该小部件可用且经过全面测试。您还可以查看他们的代码以了解他们是如何做到的。

标签: jquery html css html-lists


【解决方案1】:

在您将类添加到 nextElement 的最后,也调用 .scrollIntoView( false )

if(nextElement !== null) {
    $(nextElement).addClass("selected");
    nextElement.scrollIntoView(false); // added this line
}

更新小提琴:http://jsfiddle.net/gaby/6fjnnu55/

【讨论】:

  • @Pineda 对 FF 的限制仅适用于使用 scrollIntoViewOptions 参数。
【解决方案2】:

您可以使用 .offset() 来查找选择框和所选元素的顶部偏移量。

然后您可以使用 .scrollTop 来设置它,尝试类似:

var yourSelectInput = $('.select');

var nextElementTop = $(nextElement).offset().top;  // get offset of element
var selectTop = yourSelectInput.offset().top;  // get offset of select input

// set the scrollTop to the scroll input offset
// plus the difference of the option top offset
yourSelectInput.scrollTop(yourSelectInput.scrollTop() + (nextElementTop - selectTop));

【讨论】:

  • 所以每次我选择一个看不到的元素时,它会自动将该项目滚动到顶部?这可能适用于单击向上箭头键,但我认为单击向下箭头键时看起来很笨重。我希望它表现得像一个选择菜单,它不会一直滚动到顶部。
  • 你应该可以做到,这样当你向下点击时,被选中的元素会被滚动,这样它就会出现在选择输入列表弹出窗口的底部
【解决方案3】:

实现这一点的最简单方法是使用tabIndex="0" 将焦点放在 li 元素上。

当您聚焦一个新元素时,浏览器会自动滚动到所选元素。

参见下面的 sn-p。

$('.select-options li').on('keydown', function (e) {
  var key = e.which || e.keyCode;
  var nextElement = false;
  
  switch (key) {
    case 38: //Up
      nextElement = $(this).prev().length ? $(this).prev() : $(this).parent().find('li').last();
      break;
    case 40:
      nextElement = $(this).next().length ? $(this).next() : $(this).parent().find('li').first();
      break;
  };
   
  if (nextElement) {
    e.preventDefault();
     
    $('.selected').removeClass('selected');
    nextElement.addClass('selected').focus();
    
    console.log(nextElement);
  }
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<ul class="select-options">
  <li tabindex="0">Option 1</li>
  <li tabindex="0">Option 2</li>
  <li tabindex="0">Option 3</li>
  <li tabindex="0">Option 4</li>
  <li tabindex="0">Option 5</li>
  <li tabindex="0">Option 6</li>
  <li tabindex="0">Option 7</li>
  <li tabindex="0">Option 8</li>
  <li tabindex="0">Option 9</li>
  <li tabindex="0">Option 10</li>
  <li tabindex="0">Option 11</li>
  <li tabindex="0">Option 12</li>
  <li tabindex="0">Option 13</li>
  <li tabindex="0">Option 14</li>
  <li tabindex="0">Option 15</li>
  <li tabindex="0">Option 16</li>
  <li tabindex="0">Option 17</li>
  <li tabindex="0">Option 18</li>
  <li tabindex="0">Option 19</li>
  <li tabindex="0">Option 20</li>
</ul>

【讨论】:

  • 当我点击“运行代码片段”时什么都没有发生,我只看到一个带有“Option1”、“Option2”等的虚线项目列表。
  • 用鼠标标记其中一个元素(焦点)并使用向下/向上箭头浏览它们。
猜你喜欢
  • 1970-01-01
  • 2012-06-08
  • 2021-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多