Ich habe eine Seite, auf der eine Bildlaufleiste mit Tabellenzeilen mit Divs dynamisch aus der Datenbank generiert wird. Jede Tabellenzeile verhält sich wie ein Link, wie Sie ihn auf einer YouTube-Wiedergabeliste neben dem Videoplayer sehen würden.
Wenn ein Benutzer die Seite besucht, sollte die Option, auf der er sich befindet, oben im Bildlaufbereich angezeigt werden. Diese Funktionalität funktioniert. Das Problem ist, dass es nur ein bisschen zu weit geht. Wie die Option, die sie sind, ist etwa 10px zu hoch. Wenn die Seite besucht wird, wird die URL verwendet, um zu identifizieren, welche Option ausgewählt wurde, und diese Option wird dann zum oberen Rand des Bildlauf-Divs gescrollt. Hinweis: Dies ist nicht die Bildlaufleiste für das Fenster, sondern ein Div mit einer Bildlaufleiste.
Ich verwende diesen Code, um die ausgewählte Option an den oberen Rand des div zu verschieben:
var pathArray = window.location.pathname.split( '/' );
var el = document.getElementById(pathArray[5]);
el.scrollIntoView(true);
Es verschiebt es an die Spitze des Div, aber ungefähr 10 Pixel zu weit oben. Weiß jemand, wie man das behebt?
quelle
scrollIntoView
ist besorgniserregend.Antworten:
Wenn es ungefähr 10px ist, können Sie den Bildlaufversatz des Inhalts einfach
div
wie folgt manuell anpassen :quelle
scrollIntoView
?scrollIntoView
Funktion verursacht keine Animation. Sprechen Sie über das scrollIntoView jQuery-Plugin?el.scrollIntoView({ behavior: 'smooth' });
. Support ist aber nicht so toll!Scrollen Sie sanft zu einer richtigen Position
Holen Sie sich die richtige
y
Koordinate und verwendenwindow.scrollTo({top: y, behavior: 'smooth'})
quelle
jQuery('#el').offset().top
und dann verwendenwindow.scrollTo
scroll={el => { const yCoordinate = el.getBoundingClientRect().top + window.pageYOffset; const yOffset = -80; window.scrollTo({ top: yCoordinate + yOffset, behavior: 'smooth' }); }}
- wo der Versatz 10-15 Pixel mehr als die Größe Ihres Headers ist, nur um den Abstand zu verbessernSie können dies in zwei Schritten tun:
quelle
scrollIntoView()
Bildlauf vorscrollBy()
dem Ausführen noch nicht abgeschlossen ist , wird der erstere Bildlauf abgebrochen. Zumindest auf Chrome 71.scrollIntoView({adjustment:y})
, ich denke , es sollte am Ende mit einem benutzerdefinierten Code möglich seinPositionieren Sie den Anker nach der absoluten Methode
Eine andere Möglichkeit besteht darin, die Anker genau dort zu positionieren, wo Sie sie auf der Seite haben möchten, anstatt sich auf das Scrollen nach Versatz zu verlassen. Ich finde, es ermöglicht eine bessere Kontrolle für jedes Element (z. B. wenn Sie für bestimmte Elemente einen anderen Versatz wünschen) und ist möglicherweise auch widerstandsfähiger gegen Änderungen / Unterschiede der Browser-API.
Jetzt wird der Versatz als -100px relativ zum Element angegeben. Erstellen Sie eine Funktion zum Erstellen dieses Ankers für die Wiederverwendung von Code. Wenn Sie ein modernes JS-Framework wie React verwenden, erstellen Sie dazu eine Komponente, die Ihren Anker rendert, und übergeben Sie den Ankernamen und die Ausrichtung für jedes Element, das möglicherweise oder möglicherweise nicht gleich sein.
Dann benutze einfach:
Für flüssiges Scrollen mit einem Versatz von 100px.
quelle
Ich habe dieses Problem gelöst mit:
Dadurch wird das Element
center
nach dem Scrollen angezeigt, sodass ich nicht berechnen mussyOffset
.Ich hoffe es hilft...
quelle
scrollTo
nicht am,element
sondern amwindow
Dies funktioniert bei mir in Chrome (mit reibungslosem Scrollen und ohne Timing-Hacks)
Es bewegt nur das Element, leitet den Bildlauf ein und bewegt es dann zurück.
Es gibt kein sichtbares "Knallen", wenn sich das Element bereits auf dem Bildschirm befindet.
quelle
Aufbauend auf einer früheren Antwort mache ich dies in einem Angular5-Projekt.
Begann mit:
Dies gab jedoch einige Probleme und musste Timeout für scrollBy () wie folgt festlegen:
Und es funktioniert perfekt in MSIE11 und Chrome 68+. Ich habe nicht in FF getestet. 500 ms war die kürzeste Verzögerung, die ich wagen würde. Das Absenken schlug manchmal fehl, da die glatte Schriftrolle noch nicht abgeschlossen war. Passen Sie die Anforderungen für Ihr eigenes Projekt an.
+1 an Fred727 für diese einfache, aber effektive Lösung.
quelle
Angenommen, Sie möchten zu den Divs scrollen, die sich alle in DOM auf derselben Ebene befinden und den Klassennamen "Scroll-with-Offset" haben, dann löst dieses CSS das Problem:
Der Versatz vom oberen Rand der Seite beträgt 100 Pixel. Es funktioniert nur wie vorgesehen mit Block: 'start':
Was passiert ist, dass sich der oberste Punkt der Divs am normalen Ort befindet, ihr innerer Inhalt jedoch 100 Pixel unter dem normalen Ort beginnt. Dafür ist Padding-Top: 100px da. Rand-unten: -100px dient zum Ausgleich des zusätzlichen Randes des unteren Div. Um die Lösung zu vervollständigen, fügen Sie auch dieses CSS hinzu, um die Ränder / Auffüllungen für die obersten und untersten Divs zu versetzen:
quelle
Diese Lösung gehört zu @ Arseniy-II , ich habe sie gerade zu einer Funktion vereinfacht.
Verwendung (Sie können die Konsole hier in StackOverflow öffnen und testen):
quelle
Sie können auch die
element.scrollIntoView()
Optionen verwendenwelche die meisten Browser unterstützen
quelle
Ich habe das und es funktioniert hervorragend für mich:
Ich hoffe es hilft.
quelle
Eine andere Lösung besteht darin, "offsetTop" wie folgt zu verwenden:
quelle
Also, vielleicht ist das ein bisschen klobig, aber soweit so gut. Ich arbeite in Winkel 9.
Datei
.ts
Datei
.html
Ich passe den Versatz mit Rand und Polsterung oben an.
Saludos!
quelle
Es wurde eine Problemumgehungslösung gefunden. Angenommen, Sie möchten zu einem div scrollen, z. B. Element hier, und Sie möchten einen Abstand von 20 Pixel darüber haben. Setzen Sie den Ref auf ein erstelltes Div darüber:
<div ref={yourRef} style={{position: 'relative', bottom: 20}}/> <Element />
Dadurch wird der gewünschte Abstand erstellt.
Wenn Sie eine Kopfzeile haben, erstellen Sie auch hinter der Kopfzeile ein leeres div und weisen Sie ihm eine Höhe zu, die der Höhe der Kopfzeile entspricht, und verweisen Sie darauf.
quelle
Meine Hauptidee ist es, ein tempDiv über der Ansicht zu erstellen, zu der wir scrollen möchten. Es funktioniert gut, ohne in meinem Projekt zu verzögern.
Beispiel mit
Hoffe es hilft
quelle
Basierend auf der Antwort von Arseniy-II: Ich hatte den Anwendungsfall, bei dem die scrollende Entität nicht das Fenster selbst war, sondern eine innere Vorlage (in diesem Fall ein div). In diesem Szenario müssen wir eine ID für den Bildlaufcontainer festlegen und diese über
getElementById
die Bildlauffunktion abrufen:Lassen Sie es hier, falls jemand in eine ähnliche Situation gerät!
quelle
Hier sind meine 2 Cent.
Ich hatte auch das Problem, dass scrollIntoView ein wenig über das Element hinaus scrollt, also habe ich ein Skript (natives Javascript) erstellt, das dem Ziel ein Element voranstellt, es mit CSS etwas nach oben positioniert und zu diesem gescrollt. Nach dem Scrollen entferne ich die erstellten Elemente wieder.
HTML:
Javascript-Datei:
CSS:
Hoffe das hilft jedem!
quelle
Ich füge diese CSS-Tipps für diejenigen hinzu, die dieses Problem mit den oben genannten Lösungen nicht gelöst haben:
quelle
UPD: Ich habe ein npm-Paket erstellt , das besser als die folgende Lösung funktioniert und einfacher zu verwenden ist.
Meine SmoothScroll-Funktion
Ich habe die wunderbare Lösung von Steve Banton genommen und eine Funktion geschrieben, die die Verwendung bequemer macht. Es wäre einfacher, es einfach zu benutzen
window.scroll()
oder sogarwindow.scrollBy()
, wie ich es zuvor versucht habe, aber diese beiden haben einige Probleme:Hier ist der Code
Kopieren Sie es einfach und machen Sie es fertig, wie immer Sie wollen.
Um ein Linkelement zu erstellen, fügen Sie einfach das folgende Datenattribut hinzu:
Sie können auch ein anderes Attribut als Ergänzung festlegen
Es repräsentiert die
block
Option derscrollIntoView()
Funktion. Standardmäßig ist esstart
. Lesen Sie mehr über MDN .Schließlich
Passen Sie die SmoothScroll-Funktion an Ihre Bedürfnisse an.
Wenn Sie beispielsweise einen festen Header haben (oder ich nenne ihn mit dem Wort
masthead
), können Sie Folgendes tun:Wenn Sie einen solchen Fall nicht haben, löschen Sie ihn einfach. Warum nicht :-D.
quelle
Verwenden Sie für ein Element in einer Tabellenzeile JQuery, um die Zeile über der gewünschten Zeile abzurufen , und scrollen Sie stattdessen einfach zu dieser Zeile.
Angenommen, ich habe mehrere Zeilen in einer Tabelle, von denen einige von und admin überprüft werden sollten. Jede zu überprüfende Zeile enthält sowohl einen Aufwärts- als auch einen Abwärtspfeil, mit dem Sie zum vorherigen oder nächsten Element zur Überprüfung gelangen.
Hier ist ein vollständiges Beispiel, das nur ausgeführt werden sollte, wenn Sie ein neues HTML-Dokument im Editor erstellen und speichern. Es gibt zusätzlichen Code, um die Ober- und Unterseite unserer Artikel zur Überprüfung zu erkennen, damit wir keine Fehler auslösen.
quelle
Einfache Lösung zum Scrollen eines bestimmten Elements nach unten
quelle