Javascript .scrollIntoView(boolean)
bietet nur zwei Ausrichtungsoptionen.
- oben
- Unterseite
Was ist, wenn ich die Ansicht so scrollen möchte? Ich möchte ein bestimmtes Element irgendwo in die Mitte der Seite bringen.
javascript
js-scrollintoview
DHRUV BANSAL
quelle
quelle
offsetTop - (container / 2)
. einfach, aber ich habe nicht daran gedacht.Versuche dies :
document.getElementById('myID').scrollIntoView({ behavior: 'auto', block: 'center', inline: 'center' });
Weitere Informationen und Optionen finden Sie hier: https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView
quelle
scrollIntoView
und tun, was sie wollen. Auch bei neuesten Versionen; Ich habe es gerade noch einmal getestet.Es ist möglich
getBoundingClientRect()
, alle Informationen zu erhalten, die Sie benötigen, um dies zu erreichen. Zum Beispiel könnten Sie so etwas tun: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);
Demo: http://jsfiddle.net/cxe73c22/
Diese Lösung ist effizienter als das Überqueren der übergeordneten Kette, wie in der akzeptierten Antwort, und beinhaltet keine Verschmutzung des globalen Bereichs durch Erweiterung des Prototyps (im Allgemeinen als schlechte Praxis in Javascript angesehen ).
Die
getBoundingClientRect()
Methode wird in allen modernen Browsern unterstützt.quelle
Sie können dies in zwei Schritten tun:
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
Sie können die Höhe des Elements hinzufügen, wenn Sie es global und nicht oben zentrieren möchten:
myElement.scrollIntoView(true); var viewportH = Math.max(document.documentElement.clientHeight, window.innerHeight || 0); window.scrollBy(0, (myElement.getBoundingClientRect().height-viewportH)/2);
quelle
Mit JQuery verwende ich Folgendes:
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); }
Beispiel:
<div id="elemento1">Contenido</div> <script> scrollToMiddle("#elemento1"); </script>
quelle
document.getElementById("id").scrollIntoView({block: "center"});
quelle
Verbesserung der Antwort
@Rohan Orton
auf vertikale und horizontale Schriftrollen.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); }
Verwenden Sie die
Bitwise operator
Rechtsverschiebung, um den int-Wert nach dem Teilen zu erhalten.console.log( 25 / 2 ); // 12.5 console.log( 25 >> 1 ); // 12
quelle
Keine der Lösungen auf dieser Seite funktioniert, wenn ein anderer Container als das Fenster / Dokument gescrollt wird. Der
getBoundingClientRect
Ansatz schlägt mit absolut positionierten Elementen fehl.In diesem Fall müssen wir zuerst das scrollbare übergeordnete Element bestimmen und es anstelle des Fensters scrollen. Hier ist eine Lösung, die in allen aktuellen Browserversionen funktioniert und sogar mit IE8 und Freunden funktionieren sollte. Der Trick besteht darin, das Element an den oberen Rand des Containers zu scrollen, damit wir genau wissen, wo es sich befindet, und dann die Hälfte der Bildschirmhöhe abzuziehen.
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); }
quelle
Das Scrollen in die Mitte eines Elements funktioniert gut, wenn das übergeordnete Element das CSS hat:
overflow: scroll;
Wenn es sich um eine vertikale Liste handelt, können Sie diese verwenden
document.getElementById("id").scrollIntoView({block: "center"});
und das ausgewählte Element in die vertikale Mitte des übergeordneten Elements scrollen.Ein Hoch auf Gregory R. und Hakuna für ihre guten Antworten.
Weiterführende Literatur:
https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView
https://developer.mozilla.org/en-US/docs/Web/CSS/overflow
quelle
Um alle Optionen
scrollIntoViewOptions
für alle Browser zu unterstützen, ist es besser, Seamless-Scroll-Polyfill zu verwenden ( https://www.npmjs.com/package/seamless-scroll-polyfill ).Hat für mich gearbeitet.
Hier ist ein Link mit Erläuterungen https://github.com/Financial-Times/polyfill-library/issues/657
quelle