2 回答

TA贡献1856条经验 获得超11个赞
您需要重新计算新的滚动并#scrollable在 DOM 更改后应用它:
// Get centerRect coordinates again
centerRect = centerTextDiv.getBoundingClientRect();
centerRectMoveX = centerRect.x - (centerRect.width / 2);
centerRectMoveY = centerRect.y - (centerRect.height + 75);
// Apply to scrollDiv by adding it to the current value
scrollDiv.scrollLeft = scrollDiv.scrollLeft + centerRectMoveX;
scrollDiv.scrollTop = scrollDiv.scrollTop + centerRectMoveY;
这应该在 DOM chaging 函数中执行:
setTimeout(()=>{
firstTextDiv.innerHTML = firstChars;
insertNewTextDiv.innerHTML = lastChars;
centerRect = centerTextDiv.getBoundingClientRect();
centerRectMoveX = centerRect.x - (centerRect.width / 2);
centerRectMoveY = centerRect.y - (centerRect.height + 75);
scrollDiv.scrollLeft = scrollDiv.scrollLeft + centerRectMoveX;
scrollDiv.scrollTop = scrollDiv.scrollTop + centerRectMoveY;
}, 3000);
在这个 JSFiddle 中检查它:https ://jsfiddle.net/esm280rq/

TA贡献1816条经验 获得超6个赞
getBoundingRect将随着滚动而改变,因此在这些计算中使用它有点困难。您可以简单地使用元素的偏移量来确定与 div 坐标的关系所需的滚动。
您可以通过始终滚动到元素的offsetLeft和offsetTop来简化,即使绝对偏移量发生变化,它也应该始终保持相对于滚动元素的相同位置。
然后如果你想居中,你只需要调整滚动元素的宽度和高度以及元素的宽度和高度。但是这些数字不会改变,重要的部分是跟随offsetLeft和offsetTop,它们是实际移动的数字。像这样:
let centerTextDiv = document.getElementById('center-text');
let scrollDiv = document.getElementById('scrollable');
// here are the formulas. This centers your div in the scrollable.
// Normally using the same formula will always position the element at the same position relative to the scroll element.
// Here (scrollDiv.offsetWidth - centerTextDiv.offsetWidth) / 2 is to center, but only the offset left and top will change.
scrollDiv.scrollLeft = (centerTextDiv.offsetLeft) - ((scrollDiv.offsetWidth - centerTextDiv.offsetWidth) / 2);
scrollDiv.scrollTop = (centerTextDiv.offsetTop) - ((scrollDiv.offsetHeight - centerTextDiv.offsetHeight) / 2);
let firstTextDiv = document.getElementById('first-div-text');
let firstText = firstTextDiv.textContent;
let firstChars = firstText.substr(0, 500);
let lastChars = firstText.substr(500, firstText.length);
let insertNewTextDiv = document.getElementById('insert-new-text');
setTimeout(() => {
firstTextDiv.innerHTML = firstChars;
insertNewTextDiv.innerHTML = lastChars;
scrollDiv.scrollLeft = (centerTextDiv.offsetLeft) - ((scrollDiv.offsetWidth - centerTextDiv.offsetWidth) / 2);
scrollDiv.scrollTop = (centerTextDiv.offsetTop) - ((scrollDiv.offsetHeight - centerTextDiv.offsetHeight) / 2);
}, 3000);
#scrollable {
width: 300px;
height: 200px;
overflow: scroll;
}
#main {
display: flex;
flex: 1 1 auto;
flex-wrap: nowrap;
}
.flex-grow {
display: flex;
flex-grow: 1 !important;
flex-shrink: 0;
}
.side-div {
width: 250px;
}
#scroll-reference {
align-items: center;
justify-content: center;
margin-left: 20px;
margin-right: 20px;
}
#insert-new-text {
max-width: 400px;
}
<div id="scrollable">
<div id="main">
<div class='flex-grow'>
<div class='side-div' id='first-div-text'>
left - At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat
</div>
</div>
<div id="scroll-reference" class='flex-grow'>
<div id="center-text">text move in 3 seconds</div>
</div>
<div class='flex-grow'>
<div class='side-div'>
At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas molestias excepturi sint occaecati cupiditate non provident, similique sunt in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime placeat facere possimus, omnis voluptas assumenda est, omnis dolor repellendus. Temporibus autem quibusdam et aut officiis debitis aut rerum necessitatibus saepe eveniet ut et voluptates repudiandae sint et molestiae non recusandae. Itaque earum rerum hic tenetur a sapiente delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat
<div>
</div>
</div>
<div class='flex-grow'>
<div id="insert-new-text"></div>
</div>
<div>
</div>
没有找到匹配的内容?试试慕课网站内搜索吧
添加回答
举报