So synchronisieren Sie mehrere Bildlaufleisten mit nativem JS
Dieses Mal zeige ich Ihnen, wie Sie mehrere Bildlaufleisten mit nativem JS synchronisieren. Hier ist ein praktischer Fall.
Auf einigen Websites, die die Verwendung von zum Schreiben von Artikeln unterstützen, unterstützt die Hintergrundschreibseite im Allgemeinen die-Sofortvorschau, dh die gesamte Seite ist in zwei Teile und die linke Hälfte unterteilt ist für Sie Die rechte Hälfte des eingegebenen markdown
-Textes wird sofort auf der entsprechenden Vorschauseite ausgegeben. Das Folgende befindet sich beispielsweise markdown
auf der CSDN-Backend-Schreibseite. markdown
markdown
In diesem Artikel wird nicht erklärt, wie dieser Effekt von
in Zukunft ein separater Artikel sein wird. Schauen Sie sich einfach die beiden Containerelemente links und rechts an). im Hauptteil der Seite, also 0
Eingabefeldelement und Vorschauanzeigefeldelement
In diesem Artikel wird erläutert, wie das andere Element zum Scrollen gebracht werden kann, wenn der Inhalt der beiden Containerelemente die Höhe des Containers überschreitet, dh wenn ein Bildlauffeld angezeigt wird. markdown
Da es mit der Bildlaufleiste zusammenhängt, fällt mir als Erstes ein Attribut in ein, das die Höhe der Bildlaufleiste steuert:
Solange Sie den Wert dieses Attributs steuern können, können Sie dies Steuern Sie natürlich das Scrollen der Bildlaufleiste.js
Für die folgende scrollTop
-Struktur:
DOM
Unter diesen ist das
<p id="container"> <p class="left"></p> <p class="right"></p> </p>
ihr gemeinsames übergeordnetes Element. .left
.right
Da ein Überlauf-Scrollen erforderlich ist, müssen Sie auch den entsprechenden Stil festlegen (nur den Schlüsselstil, nicht alle): .container
Fügen Sie dann so viel Inhalt in die Elemente
und#container { display: flex; border: 1px solid #bbb; } .left, .right { flex: 1; height: 100%; word-wrap: break-word; overflow-y: scroll; }
.left
ist grob ermittelt. Jetzt können Sie diese .right
A hinzufügen Es werden eine Reihe von Operationen durchgeführt.
DOM
Die allgemeine Idee besteht darin, die Bildlaufereignisse zweier Containerelemente abzuhören. Wenn eines der Elemente einen Bildlauf durchführt, ermitteln Sie den Wert des Attributs dieses Elements und setzen Sie diesen Wert auf den Wert
des anderen Bildlaufelements.scrollTop
Zum Beispiel: scrollTop
Es scheint sehr gut zu sein, aber jetzt möchte ich nicht nur, dass die rechte Seite mit der linken Seite scrollt, sondern auch, dass die linke Seite mit der rechten Seite scrollt, also füge ich den folgenden Code hinzu:
var l=document.querySelector('.left') var r=document.querySelector('.right') l.addEventListener('scroll',function(){ r.scrollTop = l.scrollTop })
Es sieht toll aus, aber nichts ist so einfach.
addEventListener('scroll',function(){ r.scrollTop = l.scrollTop })
Um die oben genannten Probleme zu lösen, gibt es derzeit zwei Lösungen.
Scroll-Ereignis durch Mausrad-Ereignis ersetzenDa das -Ereignis nicht nur durch aktives Scrollen mit der Maus ausgelöst wird, sondern auch durch
, das das Containerelement ändert, wird das aktive Scrollen des Elements tatsächlich durch das Mausrad ausgelöst, sodass das-Ereignis möglich ist Ersetzt durch ein Ereignis, das auf das Scrollen mit der Maus reagiert: „mousewheel“, wird der obige Listening-Code zu: scroll
scrollTop
scroll
Es scheint einigermaßen nützlich zu sein, aber es gibt tatsächlich zwei Probleme.
addEventListener('mousewheel',function(){ r.scrollTop = l.scrollTop }) r.addEventListener('mousewheel',function(){ l.scrollTop = r.scrollTop })
-Ereignisses finden. Ich vermutete, dass dies ein
dieses Ereignisses sein könnte.
鼠标每次滚动基本上都并不是以 1px
为单位的,其最小单元远比 scroll
事件小的多,我用我的鼠标在 chrome
浏览器上滚动,每次滚过的距离都恰好是 100px
,不同的鼠标或者浏览器这个数值应该都是不一样的,而 wheel
事件其实真正监听的是鼠标滚轮滚过一个齿轮卡点的事件,这也就能解释为何会出现弹跳的现象了。一般来说,鼠标滚轮每滚过一个齿轮卡点,就能监听到一个 wheel
事件,从开始到结束,被鼠标主动滚动的元素已经滚动了 100px
,所以另外一个跟随滚动的容器元素也就瞬间跳动了 100px
而之所以上述 scroll
事件不会让跟随滚动元素出现瞬间弹跳,则是因为跟随滚动元素每次 scrollTop
发生变化时,其值不会有 100px
那么大的跨度,可能也没有小到 1px
,但由于其触发频率高,滚动跨度小,最起码在视觉上就是平滑滚动的了。
wheel
只是监听鼠标滚轮事件,但如果是用鼠标拖动滚动条,就不会触发此事件,另外的容器元素也就不会跟随滚动了
这个其实很好解决,用鼠标拖动滚动条肯定是能触发 scroll
事件的,而在这种情况下,你肯定能够很轻易地判断出这个被拖动的滚动条是属于哪个容器元素的,只需要处理这个容器的滚动事件,另外一个跟随滚动容器的滚动事件不做处理即可。
wheel
事件的兼容问题
wheel
事件是 DOM Level3
的标准事件,但是除了此事件之外,还有很多非标准事件,不同的浏览器内核使用不同的标准,所以可能还需要按情况来进行兼容,具体可见MDN MouseWheelEvent
实时判断
如果你难以忍受 wheel
的弹跳,以及各种兼容,那么其实还有另外的路可以走得通,依旧是 scroll
事件,只不过需要做一些额外的工作。
scroll
事件的问题在于,没有判断当前主动滚动的是哪一个容器元素,只要确定了主动滚动的容器元素,这事就好办了,例如上述使用 wheel
事件中,用鼠标拖动滚动条之所以能够使用 scroll
事件,就是因为能够很容易地确定当前主动滚动容器元素是哪一个。
所以,问题的关键在于,如何判断出当前主动滚动的容器元素,只要解决了这个问题,剩下的就很好办了。
不论是鼠标滚轮滚动还是鼠标按在滚动条上拖动滚动条滚动,都会触发 scroll
事件,并且这个时候,在坐标系 Z
轴上,鼠标的坐标肯定是位于滚动容器元素所占的面积之内的,也就是说,在 Z
轴上,鼠标肯定是悬浮或者位于滚动容器元素之上。
鼠标在屏幕上移动的时候,是可以获取到鼠标当前坐标的。
其中, clientX
和 clientY
就是当前鼠标相对于视口的坐标,可以认为,只要这个坐标在某个滚动容器的范围内,则认为这个容器元素就是主动滚动容器元素,容器元素的坐标范围可以使用 getBoundingClientRect
进行获取。
下面是鼠标移动到 .left
元素中的示例代码:
if (e.clientX>l.left && e.clientX<l.right && e.clientY>l.top) { // 进入 .left元素中 }
这样确实是可以的,不过考虑到两个滚动容器元素几乎占据了整个屏幕面积,所以 mousemove
所要监听的面积未免有点大,对于性能可能要求较高,所以其实可以换成 mouseover
事件,只需要监听鼠标有没有进入到某个滚动容器元素即可,也省去上述的坐标判断了。
addEventListener('mouseover',function(){ // 进入 .left滚动容器元素内 })
当确定了鼠标主动滚动的容器元素是哪一个时,只需要处理这个容器的滚动事件,另外一个跟随滚动容器的滚动事件不做处理即可。嗯,效果很不错,性能也很好, perfect
,可以收工喽~
按比例滚动
上述示例全部是在两个滚动容器元素的内容高度完全一致的情况下的效果,如果这两个滚动容器元素的内容高度不同呢?
可见,由于两个滚动容器元素的内容高度不同,所以最大的 scrollTop
也就不同,就会出现当其中一个 scrollTop
值较小的元素滚到底时,另外一个元素还停留在一半,或者当其中一个 scrollTop
值较大的元素才滚到一半时,另外一个元素就已经滚到底了。
这种情况很常见,例如你用 markdown
写作时,一个一级标题标记 #
在编辑模式下占用的高度,一般都是小于预览模式占用的高度的,这样就出现了左右两侧滚动高度不一致的情况。
所以,如果将这种情况也考虑进来的话,那么就不能简单地为两个滚动容器元素相互设置 scrollTop
值那么简单。
虽然无法固定住滚动容器内容的高度,但是有一点可以确定,滚动条最大滚动高度,或者说 scrollTop
的值,肯定是与滚动容器内容的高度与滚动容器本身的高度呈一定的关系。
由于需要知道滚动容器内容的高度,还要存在滚动条,所以需要给此容器元素加个子元素,子元素高度不限,就是滚动容器内容的高度,容器高度固定,溢出滚动即可。
<p id="container"> <p class="left"> <p class="child"></p> </p> <p class="right"> <p class="child"></p> </p> </p>
通过我的观察推论与实践验证,已经确定下来了它们之间的关系,很简单,就是最基本的加减法运算:
滚动条的最大滚动高度(scrollTopMax) = 滚动容器内容的高度(即子元素高度ch) - 滚动容器本身的高度(即容器元素高度ph)
也就是说,如果已经确定了滚动容器内容的高度(即子元素高度ch)与滚动容器本身的高度(即容器元素高度ph),那么就一定能确定滚动条的最大滚动高度( scrollTop
),而这两个高度值基本上都是可以获取到的,所以就能得到 scrollTop
因此,想要让两个滚动元素容器等比例上下滚动,即其中一个元素滚到头或者滚到底,另外一个元素也能对应滚到头和滚到底,那么只要得到这两个滚动容器元素之间的 scrollTop
最大值的比例( scale
)就行了。
确定了 scale
之后,实时滚动时,只需要获取主动滚动容器元素的 scrollTop1
,就能得到另外一个跟随滚动的容器元素对应的 scrollTop2
:
很顺滑~
小结
上述本上已经实现了需求,可能在实践过程中还需要根据实际情况来进行一定的修改,例如如果你编写一个 markdown
的在线编辑和预览页面,就需要根据输入内容的高度实时更新 scale
值,不过主体已经搞定,小修小改就没什么难度了。
另外,本文所述不仅是针对两个滚动容器元素的跟随滚动,同时也可扩展开来,更多的元素间的跟随滚动都是可以根据本文思路来实现的,本文只是为了方便讲解而具体到了两个元素上。
相信看了本文案例你已经掌握了方法,更多精彩请关注php中文网其它相关文章!
推荐阅读:
Das obige ist der detaillierte Inhalt vonSo synchronisieren Sie mehrere Bildlaufleisten mit nativem JS. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

Video Face Swap
Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Im Allgemeinen müssen wir nur einen der Kopfhörer oder Lautsprecher gleichzeitig verwenden. Einige Freunde haben jedoch berichtet, dass sie im Win11-System auf das Problem gestoßen sind, dass Kopfhörer und Lautsprecher gleichzeitig klingen Schalten Sie es im Realtek-Panel aus und es ist in Ordnung. Schauen wir uns das unten an. Was soll ich tun, wenn meine Kopfhörer und Lautsprecher in Win11 zusammen klingen? 1. Suchen und öffnen Sie zuerst die „Systemsteuerung“ auf dem Desktop. 2. Rufen Sie die Systemsteuerung auf, suchen und öffnen Sie „Hardware und Sound“. „Realtek High Definition“ mit einem Lautsprechersymbol. „Audio Manager“ 4. Wählen Sie „Lautsprecher“ und klicken Sie auf „Rückseite“, um die Lautsprechereinstellungen einzugeben. 5. Nach dem Öffnen können wir den Gerätetyp sehen. Wenn Sie die Kopfhörer ausschalten möchten, deaktivieren Sie „Kopfhörer“.

Wenn Sie feststellen, dass ein oder mehrere Elemente in Ihrem Synchronisierungsordner nicht mit der Fehlermeldung in Outlook übereinstimmen, kann dies daran liegen, dass Sie Besprechungselemente aktualisiert oder abgesagt haben. In diesem Fall wird eine Fehlermeldung angezeigt, die besagt, dass Ihre lokale Version der Daten mit der Remote-Kopie in Konflikt steht. Diese Situation tritt normalerweise in der Outlook-Desktopanwendung auf. Ein oder mehrere Elemente in dem von Ihnen synchronisierten Ordner stimmen nicht überein. Um den Konflikt zu lösen, öffnen Sie die Projekte und versuchen Sie den Vorgang erneut. Fix Ein oder mehrere Elemente in synchronisierten Ordnern stimmen nicht mit dem Outlook-Fehler überein. In der Outlook-Desktopversion können Probleme auftreten, wenn lokale Kalenderelemente mit der Serverkopie in Konflikt stehen. Glücklicherweise gibt es jedoch einige einfache Möglichkeiten, um zu helfen

So implementieren Sie mit WebSocket und JavaScript ein Online-Spracherkennungssystem. Einführung: Mit der kontinuierlichen Weiterentwicklung der Technologie ist die Spracherkennungstechnologie zu einem wichtigen Bestandteil des Bereichs der künstlichen Intelligenz geworden. Das auf WebSocket und JavaScript basierende Online-Spracherkennungssystem zeichnet sich durch geringe Latenz, Echtzeit und plattformübergreifende Eigenschaften aus und hat sich zu einer weit verbreiteten Lösung entwickelt. In diesem Artikel wird erläutert, wie Sie mit WebSocket und JavaScript ein Online-Spracherkennungssystem implementieren.

WebSocket und JavaScript: Schlüsseltechnologien zur Realisierung von Echtzeit-Überwachungssystemen Einführung: Mit der rasanten Entwicklung der Internet-Technologie wurden Echtzeit-Überwachungssysteme in verschiedenen Bereichen weit verbreitet eingesetzt. Eine der Schlüsseltechnologien zur Erzielung einer Echtzeitüberwachung ist die Kombination von WebSocket und JavaScript. In diesem Artikel wird die Anwendung von WebSocket und JavaScript in Echtzeitüberwachungssystemen vorgestellt, Codebeispiele gegeben und deren Implementierungsprinzipien ausführlich erläutert. 1. WebSocket-Technologie

Einführung in die Verwendung von JavaScript und WebSocket zur Implementierung eines Online-Bestellsystems in Echtzeit: Mit der Popularität des Internets und dem Fortschritt der Technologie haben immer mehr Restaurants damit begonnen, Online-Bestelldienste anzubieten. Um ein Echtzeit-Online-Bestellsystem zu implementieren, können wir JavaScript und WebSocket-Technologie verwenden. WebSocket ist ein Vollduplex-Kommunikationsprotokoll, das auf dem TCP-Protokoll basiert und eine bidirektionale Kommunikation zwischen Client und Server in Echtzeit realisieren kann. Im Echtzeit-Online-Bestellsystem, wenn der Benutzer Gerichte auswählt und eine Bestellung aufgibt

So implementieren Sie ein Online-Reservierungssystem mit WebSocket und JavaScript. Im heutigen digitalen Zeitalter müssen immer mehr Unternehmen und Dienste Online-Reservierungsfunktionen bereitstellen. Es ist von entscheidender Bedeutung, ein effizientes Online-Reservierungssystem in Echtzeit zu implementieren. In diesem Artikel wird erläutert, wie Sie mit WebSocket und JavaScript ein Online-Reservierungssystem implementieren, und es werden spezifische Codebeispiele bereitgestellt. 1. Was ist WebSocket? WebSocket ist eine Vollduplex-Methode für eine einzelne TCP-Verbindung.

Um das Scrollen eines Iframes zu überwachen, sind bestimmte Codebeispiele erforderlich. Wenn wir das Iframe-Tag verwenden, um andere Webseiten in eine Webseite einzubetten, müssen wir manchmal bestimmte Vorgänge für den Inhalt im Iframe ausführen. Eine der häufigsten Anforderungen besteht darin, auf das Scroll-Ereignis des Iframes zu warten, damit der entsprechende Code beim Scrollen ausgeführt werden kann. Im Folgenden wird die Verwendung von JavaScript zum Überwachen des Scrollens eines Iframes vorgestellt und spezifische Codebeispiele als Referenz bereitgestellt. Holen Sie sich zuerst das iframe-Element

JavaScript und WebSocket: Aufbau eines effizienten Echtzeit-Wettervorhersagesystems Einführung: Heutzutage ist die Genauigkeit von Wettervorhersagen für das tägliche Leben und die Entscheidungsfindung von großer Bedeutung. Mit der Weiterentwicklung der Technologie können wir genauere und zuverlässigere Wettervorhersagen liefern, indem wir Wetterdaten in Echtzeit erhalten. In diesem Artikel erfahren Sie, wie Sie mit JavaScript und WebSocket-Technologie ein effizientes Echtzeit-Wettervorhersagesystem aufbauen. In diesem Artikel wird der Implementierungsprozess anhand spezifischer Codebeispiele demonstriert. Wir
