예 아니요. 상위 요소가 집중 요소 (내가 아는)로 스크롤하지 못하게하는 방법은 없습니다. 그러나 부모 요소를 맨 위로 스크롤하여 스크롤을 취소 할 수 있습니다. 올바르게 완료되면 사용자에게 눈에 띄지 않습니다.
이렇게하려면 프로그래밍 방식으로 요소를 포커스 할 때마다 포커스가있는 요소의 부모 노드의 현재 스크롤 오프셋을 검색하고 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에 작업 데모입니다.
추가 정보 : 달리 스크롤 할 수 있어야하므로 ScrollTop을 재설정 할 수 없습니다. 이전의 스크롤 값을 캐싱하고 자식 노드의 OnFocus를 사용하여 SetTimeout의 이전 스크롤 오프셋을 복원 할 수 있다고 가정합니다. ( – kobachi
항상 상단으로 돌아가는 대신 기존 오프셋을 유지하도록 아래에서 내 솔루션을 업데이트했습니다. –