【问题标题】:Focus option without select the value in the option list不选择选项列表中的值的焦点选项
【发布时间】:2020-07-08 07:51:24
【问题描述】:

我有一个要求,它基于打开一个带有很多选项的“选择”,但它应该在列表的一半开始选择,而不选择启动组件的那个值

<select> 
   <option value="1">value 1</option> 
   <option value="2">value 2</option> 
   <option value="3">value 3</option> 
   <option value="4">value 4</option> 
   <option value="5">value 5</option> 
   <option value="6">value 6</option>
   <option value="7">value 7</option> 
   <option value="8">value 8</option> 
   <option value="9">value 9</option> 
   <option value="10">value 10</option>

当用户打开列表时,它应该从中间开始而不选择该选项,看看中间选项是如何被聚焦但没有被选中的:

有没有办法使用 jQuery 来实现这一点?

【问题讨论】:

  • &lt;select&gt; 不是真的。您可以在中间选项上使用 CSS 样式来伪造它,但您不能在 &lt;option&gt; 标签上使用事件,并且选择上没有事件来检测它正在被打开。这就是为什么有许多使用其他 html 列表进行显示的选择替换脚本
  • 你的意思是当下拉菜单打开的时候?

标签: javascript html jquery html-select


【解决方案1】:

免责声明:造型&lt;select&gt; 是一项棘手的工作。在 Chrome、FF、Edge、Windows10 中测试

document.querySelectorAll("select[size]").forEach(EL => {
  
  const h = EL.scrollHeight / EL.options.length; // option height
  const i = Math.floor(EL.options.length / 2); // Index of the half-way option
  const s = Math.floor(EL.size / 2); // Get the size (also half-way)
  
  EL.options[i].classList.add("highlight"); // (PS: this is bad UX)
  EL.scroll(0, h * (i - s));
});
select option.highlight {
  background: #0bf;
  color: #fff;
}
<select size="3">
  <option value="1">value 1</option>
  <option value="2">value 2</option>
  <option value="3">value 3</option>
  <option value="4">value 4</option>
  <option value="5">value 5</option>
  <option value="6">value 6</option>
  <option value="7">value 7</option>
  <option value="8">value 8</option>
  <option value="9">value 9</option>
  <option value="10">value 10</option>
</select>

注意:CSS-.highlight 选项可能是一个非常糟糕的 UI,并导致人们认为该选项实际上是 selected,而它显然 不是
避免做用户不习惯在网络世界中看到的事情。

因此:而不是做

EL.options[i].classList.add("highlight"); // (PS: this is bad UX)

宁可这样做:

EL.options[i].selected = true;

【讨论】:

  • 我同意使用该样式而不是选择元素是不好的 UX,我如何自动滚动列表以在中间打开?
  • @EdgardoRodriguez 你的机器上没有滚动?你在 Windows 上吗?铬合金?你注意到EL.scroll(0, h * (i - s)); 了吗?它正是用于此目的。
  • @EdgardoRodriguez 运行上述演示时,选择框没有滚动显示中间显示“值 6”?
  • @RokoBuljan 如果我在打开列表时不滚动选择中的 size 属性。
  • @EdgardoRodriguez 好吧,您在 stackoverflow.com/posts/62784857/revisions 的一个编辑中删除了 size 属性 - 使这个答案几乎过时了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-27
  • 1970-01-01
  • 2011-12-25
  • 1970-01-01
  • 2014-06-20
  • 1970-01-01
相关资源
最近更新 更多