हां और नहीं। पैरेंट तत्व को स्क्रॉल करने से केंद्रित तत्व (जिसे मैं जानता हूं) से रोकने का कोई तरीका नहीं है। हालांकि, आप पैरेंट तत्व को शीर्ष पर वापस स्क्रॉल करके स्क्रॉलिंग को पूर्ववत कर सकते हैं। सही ढंग से हो गया, यह उपयोगकर्ता के लिए ध्यान देने योग्य नहीं होगा।
ऐसा करने के लिए, जब भी आप प्रोग्रामेटिक रूप से किसी तत्व को फ़ोकस करते हैं, तो केंद्रित तत्व के मूल नोड के वर्तमान स्क्रॉल ऑफसेट को पुनर्प्राप्त करें और उस ऑफसेट पर 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 पर काम कर डेमो है।
स्रोत
2017-01-04 01:06:11
अनुवर्ती: स्क्रॉलटॉप को रीसेट नहीं कर सकता है, क्योंकि इसे अन्यथा स्क्रॉल करने में सक्षम होना चाहिए। मुझे लगता है कि मैं पिछले स्क्रॉल मान और ऑनफोकस को बच्चे नोड पर कैश कर सकता हूं, सेटटाइमआउट में पिछली स्क्रॉल ऑफसेट को पुनर्स्थापित कर सकता हूं :( – kobachi
मैंने हमेशा शीर्ष पर लौटने की बजाए मौजूदा ऑफसेट रखने के लिए नीचे अपना समाधान अपडेट किया है। –