javascript - Javascript箭头选择+滚动条
问题描述
我的目标是制作一个列表,我可以在其中选择带有向上和向下箭头的项目。I found this code, but didn't figure out how to make it scroll when the selection is at the bottom or top of the UL list. 任何想法?
现在,如您所见,如果我使用向下箭头,即使选择不在 UL 列表的底部,它也会向下滚动,如果我在第一个元素并按向上,选择将从列表的底部,但滚动条保持静止并且不会向下跳。
var li = $('#torso li');
var liSelected;
$(window).keydown(function(e) {
if(e.which === 40) {
if(liSelected) {
liSelected.removeClass('selected');
next = liSelected.next();
if(next.length > 0) {
liSelected = next.addClass('selected');
}
else {
liSelected = li.eq(0).addClass('selected');
}
}
else {
liSelected = li.eq(0).addClass('selected');
}
}
else if(e.which === 38) {
if(liSelected) {
liSelected.removeClass('selected');
next = liSelected.prev();
if(next.length > 0) {
liSelected = next.addClass('selected');
}
else {
liSelected = li.last().addClass('selected');
}
}
else {
liSelected = li.last().addClass('selected');
}
}
});
li.selected {
background-color: yellow;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<ul id="torso">
<li>item1</li>
<li>item1</li>
<li>item1</li>
<li>item1</li>
<li>item1</li>
<li>item1</li>
<li>item1</li>
<li>item1</li>
<li>item1</li>
<li>item1</li>
<li>item1</li>
<li>item1</li>
<li>item1</li>
<li>item1</li>
<li>item1</li>
<li>item1</li>
<li>item1</li>
<li>item1</li>
<li>item1</li>
<li>item1</li>
<li>item1</li>
<li>item1</li>
<li>item1</li>
<li>item1</li>
<li>item1</li>
<li>item1</li>
<li>item1</li>
<li>item1</li>
<li>item1</li>
<li>item1</li>
<li>item1</li>
<li>item1</li>
<li>item1</li>
<li>item1</li>
<li>item1</li>
<li>item1</li>
<li>item1</li>
<li>item1</li>
<li>item1</li>
<li>item1</li>
<li>item1</li>
<li>item1</li>
<li>item1</li>
<li>item1</li>
<li>item1</li>
<li>item1</li>
<li>item1</li>
<li>item1</li>
<li>item1</li>
<li>item1</li>
<li>item1</li>
</ul>
解决方案
为了防止滚动页面,您可以使用preventDefault,添加以下代码:
e.preventDefault();
然后,如果您希望将页面滚动到选定元素,可以使用scrollIntoViewIfNeeded,将下一个代码放在侦听器的末尾:
if (liSelected) {
liSelected.get(0).scrollIntoViewIfNeeded()
}
但请注意, Firefox 不支持scrollIntoViewIfNeeded
它。你可以使用任何 polyfill(比如这个)。或者只是跳过此步骤添加可用性检查:
if (liSelected && Element.prototype.scrollIntoViewIfNeeded) {...}
推荐阅读
- c - 我犯了这个程序会通过运行时错误发生的错误是什么?
- r - 在 data.frames 列表上应用 as.numeric
- sql - 将数据除以会话开始/结束值
- sql-server - 在已 CAST 到 XML 的文本字段上运行 XQuery
- r - 在 R 中通过至少 3 个单独的因素制作比例数据框
- sql - liquibase 中的大型查询执行
- excel - 有没有办法在 excel 上使用聚合函数来带回满足多个标准 excel 的多个结果?
- swift - 如何使用 NSButton 在 NSTouchBar 中模拟按键?
- python - 按逗号拆分列表以及如何从拆分中的引号中排除逗号和引号
- php - 如何从循环中排除帖子特色图片?