Skip to content

Alles für WordPress, Webentwicklung — und mehr

📜 Scroll-block in CSS und jQuery: fixe Höhe mit Scrollen

📜 Scroll-block in CSS und jQuery: fixe Höhe mit Scrollen

Wall-of-Text-SEO-Blöcke, halbbildschirmfüllende Kommentare, Admin-Protokolle und Tabellen mit 30 Spalten zerschießen jedes Layout und zwingen Leser zu endlosem Scrollen. Kommt Ihnen das bekannt vor? Es gibt eine Lösung, und sie ist beschämend einfach: ein Block mit fester Höhe und internem Scrollbalken.

Als ich anfing, Layouts zu bauen, stopfte ich Inhalte in overflow: hidden und betete, dass niemand den abgeschnittenen Text bemerkt. Dann entdeckte ich Scroll-Blöcke, und das hat alles verändert: Die SEO-Texte der Kunden wurden aufgeräumt, Seiten blähten sich auf Mobilgeräten nicht mehr auf und benachbarte Skripte gerieten nicht länger in Konflikt.

Nachfolgend zwei funktionierende Ansätze: reines CSS (für die meisten Aufgaben) und ein jQuery-Wrapper (für individuelle Szenarien). Beide sind auf Dutzenden Projekten praxiserprobt, funktionieren auf Mobilgeräten korrekt und stören benachbarte Skripte nicht.

💡 Kurzüberblick:

  • Inhalt in ein <div> mit den Klassen scroll-block und scroll-content einpacken
  • max-height + overflow-y: auto im CSS setzen, schon ist der Scroll-Block einsatzbereit
  • Das jQuery-Plugin aus dem Artikel für Auto-Scroll, Animation und Events einbinden
  • Scrollbalken über ::-webkit-scrollbar an das Design Ihrer Seite anpassen

Was ein Scroll-Block ist und wo Sie ihn wirklich brauchen

Ein Scroll-Block ist ein Container mit fester Höhe, dessen Inhalt unabhängig vom Haupt-Scrollen der Seite intern scrollt. Der Browser fügt automatisch einen Scrollbalken hinzu, wenn der Inhalt die festgelegte Höhe überschreitet.

Wo ich diese Lösung ständig einsetze:

  • SEO-Texte. Der Kunde wünscht eine 3.000-Wörter-Textwand mitten auf der Landingpage, ich verpacke sie in einen Scroll-Block, die Seite wird nicht zur endlosen Leinwand.
  • Kommentare und Protokolle. Lange Diskussionsfäden oder Debug-Protokolle im Admin-Panel, eine feste Höhe bewahrt das Interface vor dem Auseinanderlaufen.
  • Datentabellen. Horizontaler Scroll bei Tabellen ist klassisch, aber vertikaler Scroll bei einer Tabelle mit über 50 Zeilen löst das Problem genauso gut.
  • Chat-Widgets und Benachrichtigungen. Ein Chat-Fenster mit Nachrichtenverlauf, derselbe Scroll-Block, nur mit automatischem Scrollen zur letzten Nachricht.

Technisch beruht alles auf zwei CSS-Eigenschaften: max-height (oder height) und overflow-y. Aber der Teufel steckt im Detail: mobile Browser, verschachtelte Container, Konflikte mit position: fixed und Besonderheiten von iOS Safari erfordern eine sorgfältige Herangehensweise.

Sehen Sie sich dieses kurze Tutorial zur overflow-Eigenschaft an, es zeigt anschaulich alle Scroll-Modi und ihr Verhalten:

CSS-Lösung: schnell und ohne JavaScript

Für die allermeisten Fälle wird kein JavaScript benötigt. Drei Zeilen CSS genügen:

1.scroll-block {
2 max-height: 320px;
3 overflow-y: auto;
4 border: 1px solid #e0e0e0;
5 padding: 16px;
6}

Im Einzelnen: max-height legt die Obergrenze fest, der Block wird nicht höher als 320px, kann aber niedriger sein, wenn weniger Inhalt vorhanden ist. overflow-y: auto weist den Browser an: „Zeige den Scrollbalken nur, wenn der Inhalt den Container überläuft." Rahmen und Innenabstand sind optional, aber ohne Innenabstand klebt der Text am Scrollbalken und wirkt billig.

Das HTML bleibt semantisch sauber:

1<div class="scroll-block">
2 <p>Your long SEO text, logs, table, or whatever.</p>
3</div>

Diese Lösung funktioniert identisch in Chrome, Firefox, Safari und Edge, die overflow-Spezifikation ist seit CSS2 stabil und wird von allen modernen Browsern unterstützt. Auf Mobilgeräten kollidiert das Scrollen innerhalb des Blocks nicht mit dem Haupt-Scrollen der Seite (anders als clevere JavaScript-Lösungen aus den 2010ern, die touchmove abfingen und das Scrollen oft zerstörten).

Aber es gibt eine Nuance bei iOS Safari: Standardmäßig ist das Scrollen innerhalb des Blocks „unelastisch", es gibt keinen nativen Gummi-Effekt. Wenn Sie sanftes, träges Scrollen wie beim Hauptinhalt benötigen, fügen Sie hinzu:

1.scroll-block {
2 -webkit-overflow-scrolling: touch;
3}

Die Eigenschaft -webkit-overflow-scrolling: touch aktiviert das native Momentum-Scrollen unter iOS. Hinweis: Mit iOS 13 hat Apple dies zum Standardverhalten für overflow: auto gemacht, sodass das Präfix für neuere Versionen optional ist. Wenn das Projekt aber ältere iPads unterstützt, behalten Sie es bei.

JQuery-Lösung: wenn Sie volle Kontrolle brauchen

Die CSS-Methode löst die meisten Aufgaben. Die verbleibenden Fälle sind, wenn Sie programmatisches Scrollen zum Ende (Chat), benutzerdefinierte Events beim Erreichen der Blockgrenzen oder eine Scroll-Animation per Button benötigen. Hier kommt jQuery ins Spiel.

Hier ein fertiges Plugin, minimalistisch, keine Abhängigkeiten außer jQuery selbst, getestet mit modernen WordPress-Versionen und ohne Konflikte mit anderen Theme-Skripten:

1(function($) {
2 $.fn.scrollBlock = function(options) {
3 var settings = $.extend({
4 maxHeight: 320,
5 autoScroll: false,
6 scrollSpeed: 400,
7 onTopReached: null,
8 onBottomReached: null
9 }, options);
10
11 return this.each(function() {
12 var $block = $(this);
13
14 $block.css({
15 'max-height': settings.maxHeight + 'px',
16 'overflow-y': 'auto'
17 });
18
19 if (settings.autoScroll) {
20 $block.animate({
21 scrollTop: $block[0].scrollHeight
22 }, settings.scrollSpeed);
23 }
24
25 $block.on('scroll', function() {
26 var scrollTop = $block.scrollTop();
27 var maxScroll = $block[0].scrollHeight - $block.outerHeight();
28
29 if (scrollTop <= 0 && settings.onTopReached) {
30 settings.onTopReached.call(this);
31 }
32 if (scrollTop >= maxScroll && settings.onBottomReached) {
33 settings.onBottomReached.call(this);
34 }
35 });
36 });
37 };
38})(jQuery);

Wo Sie es starten: Ihr Skript (separate Theme-JS-Datei oder <script>-Bereich im Footer). Binden Sie es nach jQuery ein:

1$(document).ready(function() {
2 $('.scroll-content').scrollBlock({
3 maxHeight: 400,
4 autoScroll: true,
5 scrollSpeed: 600,
6 onBottomReached: function() {
7 console.log('Reached bottom of block');
8 }
9 });
10});

Was hier passiert: Das Plugin nimmt einen Selektor entgegen, wendet eine CSS-Höhenbegrenzung an, scrollt den Block optional nach unten und verfolgt das Erreichen der oberen/unteren Grenze über Callbacks. Keine Magie, nur ein Wrapper um die standardmäßigen jQuery-Methoden .css(), .animate() und das scroll-Event.

Nutzen Sie diese Lösung, wenn: a) Sie einen Chat automatisch zur letzten Nachricht scrollen müssen, b) eine sanfte Scroll-Animation über einen externen „Runter"/„Hoch"-Button erforderlich ist, c) Sie Analytics an das Event „Nutzer hat bis zum Ende gelesen" anhängen müssen.

Mehrere Blöcke auf einer Seite

Szenario: drei Scroll-Blöcke mit unterschiedlichem Inhalt auf der Seite. Wenn Sie eine Klasse .scroll-block ohne eindeutige Bezeichner setzen, funktioniert alles, CSS greift für alle auf einmal. Aber sobald jeder Block seine eigene Höhe benötigt, willkommen in der Welt der IDs.

CSS für mehrere Blöcke mit unterschiedlichen Höhen:

1#seo-text-block {
2 max-height: 320px;
3 overflow-y: auto;
4}
5
6#changelog-block {
7 max-height: 480px;
8 overflow-y: auto;
9}
10
11#comments-block {
12 max-height: 600px;
13 overflow-y: auto;
14}

HTML:

1<div id="seo-text-block" class="scroll-block">
2 <!-- Long SEO text -->
3</div>
4
5<div id="changelog-block" class="scroll-block">
6 <!-- Changelog list -->
7</div>

Beim jQuery-Plugin gilt dieselbe Logik: Initialisieren Sie jeden Block separat mit seinen eigenen Einstellungen:

1$('#seo-text-block').scrollBlock({ maxHeight: 320 });
2$('#changelog-block').scrollBlock({ maxHeight: 480, autoScroll: true });
3$('#comments-block').scrollBlock({ maxHeight: 600, autoScroll: true, scrollSpeed: 300 });

Wenn es viele Blöcke (10+) sind und alle identisch, genügt eine gemeinsame Klasse. Wenn unterschiedlich, IDs plus individuelle Einstellungen. Keine Zauberei mit nth-child oder manueller Iteration, CSS-Selektoren erledigen das von Haus aus.

Scrollbalken gestalten: damit er nicht wie aus 2007 aussieht

Der Standard-Scrollbalken des Browsers ist ein graues Rechteck aus der Windows-XP-Ära. Zwei Minuten CSS, und er passt zu Ihrem Design:

1.scroll-block::-webkit-scrollbar {
2 width: 6px;
3}
4
5.scroll-block::-webkit-scrollbar-track {
6 background: #f1f1f1;
7 border-radius: 3px;
8}
9
10.scroll-block::-webkit-scrollbar-thumb {
11 background: #c1c1c1;
12 border-radius: 3px;
13}
14
15.scroll-block::-webkit-scrollbar-thumb:hover {
16 background: #a1a1a1;
17}

Wichtig: Die ::-webkit-scrollbar-Pseudoelemente funktionieren in Chrome, Edge, Safari und Opera und decken die große Mehrheit der Nutzer ab. Firefox verwendet separate Eigenschaften scrollbar-width: thin und scrollbar-color, aber Sie können den Scrollbalken in Firefox nicht global auf Elementebene gestalten (nur seitenweit). Für Firefox genügt das:

1html {
2 scrollbar-width: thin;
3 scrollbar-color: #c1c1c1 #f1f1f1;
4}

Übertreiben Sie es nicht mit der Scrollbalkenbreite: 4-8px ist der optimale Bereich. Schmaler als 4px treffen Nutzer ihn mit dem Finger auf dem Handy nicht. Breiter als 8px zieht der Scrollbalken zu viel Aufmerksamkeit auf sich.

⁉️🤔 Häufig gestellte Fragen

Funktioniert der Scroll-Block auf Mobilgeräten?

Ja, und zwar ohne Hacks. Die CSS-Eigenschaft overflow-y: auto wird von iOS Safari und Chrome für Android nativ unterstützt. Das interne Scrollen des Blocks kollidiert nicht mit dem Haupt-Scrollen der Seite, der Browser bestimmt anhand der Fingerposition, welcher Container gescrollt werden soll. Einzige Nuance: Fügen Sie bei älteren iOS-Versionen (vor 13) -webkit-overflow-scrolling: touch für träges Scrollen hinzu.

Kann man einen Scroll-Block innerhalb eines Flexbox- oder Grid-Containers verwenden?

Das ist möglich. Der Scroll-Block benötigt eine feste Höhe, setzen Sie diese über max-height in Pixeln oder über flex-basis/grid-row mit einem absoluten Wert. Verwenden Sie keine prozentuale Höhe innerhalb eines Flex-Kindes ohne explizite Höhe beim Elternelement, der Browser kann die Basis für die Overflow-Berechnung nicht ermitteln und der Scrollbalken erscheint nicht.

Wie realisiert man sanftes Scrollen des Blocks nach unten ohne jQuery?

In reinem JavaScript: element.scrollTo({ top: element.scrollHeight, behavior: 'smooth' }). Die Methode scrollTo mit der Option behavior: 'smooth' wird von allen modernen Browsern unterstützt. Für das automatische Scrollen im Chat rufen Sie diese Zeile nach dem Hinzufügen jeder neuen Nachricht auf.

Kollidiert der Scroll-Block mit anderen Skripten auf der Seite?

Bei der CSS-Lösung: nein. Dies sind native Browsereigenschaften, sie arbeiten isoliert. Das jQuery-Plugin aus dem Artikel verwendet seinen eigenen Namensraum $.fn.scrollBlock und greift nicht auf globale Variablen zu, Konflikte sind somit ausgeschlossen. Getestet auf Seiten mit über 20 aktiven Plugins, es traten keine Probleme auf.

Kann man das Erscheinen eines Scroll-Blocks animieren?

Ja. Setzen Sie im Ausgangszustand max-height: 0 und overflow: hidden und animieren Sie dann auf die Zielhöhe. Wenn die Animation abgeschlossen ist, schalten Sie overflow auf auto. In jQuery geschieht dies über .animate({ 'max-height': '320px' }, 500, function() { $(this).css('overflow-y', 'auto') }). In reinem CSS über transition: max-height 0.5s ease.

JQuery oder CSS: was Sie 2026 verwenden sollten

Die CSS-Lösung deckt die allermeisten Szenarien ab und wiegt null Kilobyte. Wenn Sie einfach nur einen ordentlichen Block mit internem Scrollbalken brauchen, nehmen Sie sie und machen Sie es nicht komplizierter als nötig.

Das jQuery-Plugin ist gerechtfertigt, wenn: Sie einen Chat mit automatischem Scrollen bauen, Analytics an Scroll-Events anhängen oder das Scrollen über einen externen Button animieren. In anderen Fällen ist der jQuery-Wrapper eine überdimensionierte Lösung, die eine Bibliotheksabhängigkeit für drei Zeilen CSS hinzufügt.

Probieren Sie die CSS-Variante jetzt aus: Kopieren Sie drei Zeilen Stile, packen Sie Testinhalt in <div class="scroll-block"> und öffnen Sie die Seite auf Ihrem Handy. Sie sehen Ergebnisse in einer Minute, ohne npm install, ohne Bundler, ohne Schmerzen.