Javascript scrollIntoView () 중간 정렬?
Javascript .scrollIntoView(boolean)
는 두 가지 정렬 옵션 만 제공합니다.
- 상단
- 바닥
그렇게보기를 스크롤하려면 어떻게해야합니까? 페이지 중간 어딘가에 특정 요소를 가져오고 싶습니까?
window.scrollTo()
이것을 위해 사용하십시오 . 이동하려는 요소의 상단을 가져오고 창 높이의 절반을 뺍니다.
데모 : http://jsfiddle.net/ThinkingStiff/MJ69d/
Element.prototype.documentOffsetTop = function () {
return this.offsetTop + ( this.offsetParent ? this.offsetParent.documentOffsetTop() : 0 );
};
var top = document.getElementById( 'middle' ).documentOffsetTop() - ( window.innerHeight / 2 );
window.scrollTo( 0, top );
getBoundingClientRect()
이를 달성하는 데 필요한 모든 정보를 얻는 데 사용할 수 있습니다. 예를 들어 다음과 같이 할 수 있습니다.
const element = document.getElementById('middle');
const elementRect = element.getBoundingClientRect();
const absoluteElementTop = elementRect.top + window.pageYOffset;
const middle = absoluteElementTop - (window.innerHeight / 2);
window.scrollTo(0, middle);
데모 : http://jsfiddle.net/cxe73c22/
이 솔루션은 수락 된 답변에서와 같이 부모 체인을 걷는 것보다 효율적이며 프로토 타입을 확장하여 전역 범위를 오염시키지 않습니다 ( 일반적으로 javascript에서 나쁜 관행으로 간주 됨 ).
이 getBoundingClientRect()
방법은 모든 최신 브라우저에서 지원됩니다.
이 시도 :
document.getElementById('myID').scrollIntoView({
behavior: 'auto',
block: 'center',
inline: 'center'
});
자세한 정보 및 옵션은 여기를 참조하십시오 : https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView
두 단계로 수행 할 수 있습니다.
myElement.scrollIntoView(true);
var viewportH = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
window.scrollBy(0, -viewportH/2); // Adjust scrolling with a negative value here
요소를 상단 중앙이 아닌 중앙에 배치하려면 요소의 높이를 추가 할 수 있습니다.
myElement.scrollIntoView(true);
var viewportH = Math.max(document.documentElement.clientHeight, window.innerHeight || 0);
window.scrollBy(0, (myElement.getBoundingClientRect().height-viewportH)/2);
JQuery를 사용하여 다음을 사용합니다.
function scrollToMiddle(id) {
var elem_position = $(id).offset().top;
var window_height = $(window).height();
var y = elem_position - window_height/2;
window.scrollTo(0,y);
}
예:
<div id="elemento1">Contenido</div>
<script>
scrollToMiddle("#elemento1");
</script>
@Rohan Orton
수직 및 수평 스크롤 작업에 대한 답을 개선했습니다 .
Element.getBoundingClientRect () 에있어서, 상기 요소의 크기 및 표시 영역에 상대적인 위치를 반환한다.
var ele = $x("//a[.='Ask Question']");
console.log( ele );
scrollIntoView( ele[0] );
function scrollIntoView( element ) {
var innerHeight_Half = (window.innerHeight >> 1); // Int value
// = (window.innerHeight / 2); // Float value
console.log('innerHeight_Half : '+ innerHeight_Half);
var elementRect = element.getBoundingClientRect();
window.scrollBy( (elementRect.left >> 1), elementRect.top - innerHeight_Half);
}
Using Bitwise operator
right shift to get int value after dividing.
console.log( 25 / 2 ); // 12.5
console.log( 25 >> 1 ); // 12
None of the solutions on this page work when an container other than the window/document is scrolled. The getBoundingClientRect
approach fails with absolute positioned elements.
In that case we need to determine the scrollable parent first and scroll it instead of the window. Here is a solution that works in all current browser versions and should even work with IE8 and friends. The trick is to scroll the element to the top of the container, so that we know exactly where it is, and then subtract half of the screen's height.
function getScrollParent(element, includeHidden, documentObj) {
let style = getComputedStyle(element);
const excludeStaticParent = style.position === 'absolute';
const overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/;
if (style.position === 'fixed') {
return documentObj.body;
}
let parent = element.parentElement;
while (parent) {
style = getComputedStyle(parent);
if (excludeStaticParent && style.position === 'static') {
continue;
}
if (overflowRegex.test(style.overflow + style.overflowY + style.overflowX)) {
return parent;
}
parent = parent.parentElement;
}
return documentObj.body;
}
function scrollIntoViewCentered(element, windowObj = window, documentObj = document) {
const parentElement = getScrollParent(element, false, documentObj);
const viewportHeight = windowObj.innerHeight || 0;
element.scrollIntoView(true);
parentElement.scrollTop = parentElement.scrollTop - viewportHeight / 2;
// some browsers (like FireFox) sometimes bounce back after scrolling
// re-apply before the user notices.
window.setTimeout(() => {
element.scrollIntoView(true);
parentElement.scrollTop = parentElement.scrollTop - viewportHeight / 2;
}, 0);
}
참고URL : https://stackoverflow.com/questions/8922107/javascript-scrollintoview-middle-alignment
'IT박스' 카테고리의 다른 글
linux / videodev.h : 해당 파일 또는 디렉토리 없음-우분투 11.04의 OpenCV (0) | 2020.12.03 |
---|---|
Android에서 전체 ImageView를 채우기 위해 이미지 크기 조정 (0) | 2020.12.03 |
Apache 오류 : _default_ 가상 호스트가 포트 443에서 겹칩니다. (0) | 2020.12.03 |
Android Studio의 파일에서 방법을 검색하는 방법 (0) | 2020.12.03 |
생성자에 인수가있는 Java 8 공급자 (0) | 2020.12.03 |