Ich verwende ScrollIntoView (), um das markierte Element in einer Liste in die Ansicht zu scrollen. Wenn ich nach unten scrolle, funktioniert ScrollIntoView (false) perfekt. Wenn ich jedoch nach oben scrolle, bewirkt ScrollIntoView (true), dass sich die gesamte Seite ein wenig bewegt, was meiner Meinung nach beabsichtigt ist. Gibt es eine Möglichkeit, das Verschieben der gesamten Seite zu vermeiden, wenn ScrollIntoView (true) verwendet wird?
Hier ist die Struktur meiner Seite -
#listOfDivs {
position:fixed;
top:100px;
width: 300px;
height: 300px;
overflow-y: scroll;
}
<div="container">
<div="content">
<div id="listOfDivs">
<div id="item1"> </div>
<div id="item2"> </div>
<div id="itemn"> </div>
</div>
</div>
</div>
listOfDivs kommt von einem Ajax-Aufruf. Mobile Safari nutzen.
Danke im Vorraus für deine Hilfe!
javascript
css
Ich bin da
quelle
quelle
Antworten:
Sie könnten
scrollTop
anstelle von verwendenscrollIntoView()
:jsFiddle: http://jsfiddle.net/LEqjm/
Wenn es mehr als ein scrollbares Element gibt, das Sie scrollen möchten, müssen Sie das Element
scrollTop
einzeln ändern , basierend auf denoffsetTop
s der dazwischenliegenden Elemente. Dies sollte Ihnen die feinkörnige Kontrolle geben, um das Problem zu vermeiden, das Sie haben.BEARBEITEN: offsetTop ist nicht unbedingt relativ zum übergeordneten Element, sondern relativ zum zuerst positionierten Vorfahren. Wenn das übergeordnete Element nicht positioniert ist (relativ, absolut oder fest), müssen Sie möglicherweise die zweite Zeile in Folgendes ändern:
quelle
target.parentNode.scrollTop = target.offsetTop - target.parentNode.offsetTop
position: relative
, sollten Sie seinen Versatz nicht subtrahieren. Aber Sie haben in den meisten Fällen Recht.position: relative
auf prent div: es behebt wirklich das ProblemEs wurde behoben mit:
Siehe: https://developer.mozilla.org/en-US/docs/Web/API/Element/scrollIntoView
quelle
block : 'nearest'
zurückführen , bei dem der Parameter fehlte .quelle
top: el['offsetTop']
Spielen Sie mit
scrollIntoViewIfNeeded()
... stellen Sie sicher, dass es vom Browser unterstützt wird.quelle
Ich habe eine Möglichkeit hinzugefügt, das wichtige Verhalten von ScrollIntoView anzuzeigen - http://jsfiddle.net/LEqjm/258/ [Es sollte ein Kommentar sein, aber ich habe nicht genug Ruf]
quelle
Ich hatte auch dieses Problem und verbrachte viele Stunden damit, damit umzugehen. Ich hoffe, meine Entschließung kann einigen Menschen noch helfen.
Mein Fix war:
.scrollIntoView()
zu.scrollIntoView({block: 'nearest'})
(danke an @jfrohn).overflow: -moz-hidden-unscrollable;
Auf das verschobene Containerelement anwenden .quelle
Das jQuery-Plugin
scrollintoview()
erhöht die BenutzerfreundlichkeitAnstelle der Standard-DOM-Implementierung können Sie ein Plugin verwenden, das Bewegungen animiert und keine unerwünschten Effekte hat. Hier ist die einfachste Möglichkeit, es mit Standardeinstellungen zu verwenden:
Gehen Sie auf jeden Fall zu diesem Blog-Beitrag, in dem Sie alle Details lesen und schließlich zum GitHub-Quellcode des Plugins gelangen.
Dieses Plugin sucht automatisch nach dem nächsten scrollbaren Vorfahrenelement und scrollt es so, dass sich das ausgewählte Element in seinem sichtbaren Ansichtsfenster befindet. Befindet sich das Element bereits im Ansichtsfenster, führt es natürlich nichts aus.
quelle
Nach der Idee von Brilliant ist hier eine Lösung, die nur (vertikal) einen Bildlauf durchführt, wenn das Element derzeit NICHT sichtbar ist. Die Idee ist, den Begrenzungsrahmen des Ansichtsfensters und das Element zu erhalten, die im Koordinatenraum des Browserfensters angezeigt werden sollen. Überprüfen Sie, ob es sichtbar ist, und scrollen Sie, falls nicht, um den erforderlichen Abstand, damit das Element oben oder unten im Ansichtsfenster angezeigt wird.
quelle
Hinzufügen weiterer Informationen zum
@Jesco
Posten.Element.scrollIntoViewIfNeeded()
non-standard WebKit method
für Chrome-, Opera- und Safari-Browser.Befindet sich das Element bereits im sichtbaren Bereich des Browserfensters, findet kein Bildlauf statt .
Element.scrollIntoView()
Die Methode scrollt das Element, für das es aufgerufen wird, in den sichtbaren Bereich des Browserfensters.Versuchen Sie den folgenden Code im
mozilla.org
scrollIntoView()
Link. Beitrag zur Identifizierung des Browsersquelle
In meinem Kontext würde er die klebrige Symbolleiste vom Bildschirm schieben oder neben einer fabelhaften Schaltfläche mit Absolut eingeben.
mit dem nächsten gelöst.
quelle
Ich hatte das gleiche Problem, ich habe es behoben, indem
transform:translateY
ich das CSS entfernt habe, das ich auffooter
der Seite platziert habe.quelle