У меня есть требование прокрутки определенного элемента внутри div (а не прямого дочернего) в представлении.
В основном мне нужны те же функции, что и ScrollIntoView, но для указанного родителя (только этот родитель должен прокручивать).
Кроме того, я не могу использовать какие-либо сторонние библиотеки.
Я не совсем уверен в том, как подходить к этой проблеме, поскольку я очень ограничиваю разработку JavaScript. Есть ли кто-нибудь, кто мог бы мне помочь?
Я нашел этот код, который будет делать именно то, что мне нужно, но, к сожалению, он требует JQuery, и я не смог перевести его на простой JavaScript.
Думаю, у меня есть для тебя начало. Когда вы думаете об этой проблеме, вы думаете о том, чтобы сделать дочерний div в видимой области родителя. Один наивный способ - использовать дочернюю позицию на странице относительно родительской позиции на странице. Затем, учитывая свиток родителя. Это возможная реализация.
function scrollParentToChild(parent, child) {
// Where is the parent on page
var parentRect = parent.getBoundingClientRect();
// What can you see?
var parentViewableArea = {
height: parent.clientHeight,
width: parent.clientWidth
};
// Where is the child
var childRect = child.getBoundingClientRect();
// Is the child viewable?
var isViewable = (childRect.top >= parentRect.top) && (childRect.top <= parentRect.top + parentViewableArea.height);
// if you can't see the child try to scroll parent
if (!isViewable) {
// scroll by offset relative to parent
parent.scrollTop = (childRect.top + parent.scrollTop) - parentRect.top
}
}
Просто передайте ему родительский и дочерний узлы следующим образом:
scrollParentToChild(parentElement, childElement)
Добавлено демо, использующее эту функцию для основного элемента и даже вложенных элементов
Вы можете сделать несколько простых вещей, таких как:
function customScroll(id) {
window.location.href = "#mydiv"+id;
}
В основном window.location.href
должен помочь вам.
Эта функциональность может быть достигнута в несколько шагов. Сначала вы получаете положение ребенка, используя childElement.getBoundingClientRect();
который вернет следующие значения
bottom : val
height: val
left: val
right: val
top: val
width: val
Затем просто поместите дочерний элемент в соответствии с верхними левыми значениями в родительский элемент, сохраняя position
дочерних элементов как absolute
. Родительская position
элемента должна быть relative
типом, чтобы правильно поместить ребенка и получить эффект от ScrollIntoView
.
childElement.style.position = 'absolute';
childElement.style.top = 'value in px';
childElement.style.left = 'value in px';