javascript - 有没有办法在子节点获得焦点时阻止父容器滚动?

标签 javascript html focus dom-events

情况:有一个带有 overflow: auto 的固定高度的父 div 和足够高的子“line-item”div 来触发滚动条的存在。这些子 div 中的每一个都有 tabindex=-1,因此可以以编程方式聚焦。

当以编程方式聚焦这些子 div 中的任何一个时,浏览器(在本例中为 Chrome 55)的默认行为似乎是滚动父 div 以使新聚焦的子 div 居中。有什么办法可以防止这种行为吗?

最佳答案

是也不是。没有办法阻止父元素滚动到焦点元素(据我所知)。但是,您可以通过将父元素滚动回顶部来撤消滚动。如果做得正确,用户不会注意到它。

为此,只要您以编程方式聚焦元素,检索聚焦元素的父节点的当前滚动偏移量并将 scrollTop 设置为该偏移量。

var children = document.getElementsByClassName('child')

for (var i = 0; i < children.length; i++) {
  children[i].addEventListener('click', function (e) {
    e.preventDefault
    var focused = document.getElementById('focus')
    var focusedParent = focused.parentNode
    var savedOffset = focusedParent.scrollTop
    focused.focus();
    focused.parentNode.scrollTop = savedOffset;
  })
}
.parent {
  height: 300px;
  overflow: auto;
}

.child {
  height: 50px;
  background-color: gray;
  border-bottom: 1px solid black;
  color: white;
  box-sizing: border-box;
  text-align: center;
  line-height: 50px;
  font-family: Arial;
}
<div class="parent">
  <div class="child" tabIndex="-1">1</div>
  <div class="child" tabIndex="-1">2</div>
  <div class="child" tabIndex="-1">3</div>
  <div class="child" tabIndex="-1">4</div>
  <div class="child" tabIndex="-1">5</div>
  <div class="child" tabIndex="-1">6</div>
  <div class="child" tabIndex="-1">7</div>
  <div class="child" tabIndex="-1">8</div>
  <div class="child" tabIndex="-1" id="focus">9</div>
  <div class="child" tabIndex="-1">10</div>
</div>

这是关于 Codepen 的工作演示.

关于javascript - 有没有办法在子节点获得焦点时阻止父容器滚动?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41454327/

相关文章:

java - 按 Enter 键将光标从一个 JTextField 转移到另一个 JTextField?

javascript - Amcharts - 一些标签中的 HTML 标签

HTML5 占位符在焦点上消失

javascript - 如何在 Angular2 中将组件的 html 设置为 iframe

javascript - 哪个具有 Flash 后备功能的 HTML5 播放器具有通用的 javascript API

html - 如何定位子容器,使它们恰好位于彼此之上?

javascript - 具有多行标题的可排序 HTML 表格

javascript - 节目结束后将焦点设置为锚定在 div 内?

javascript - 如何修改类方法?

javascript - 使用钩子(Hook)时在回调函数中设置状态