Text-Styling mit der CSS Custom Highlight API

Die CSS Custom Highlight API löst ein grundlegendes Problem: Wie lassen sich Textbereiche programmatisch hervorheben, ohne das DOM mit Wrapper-Elementen zu überladen? Ob Sie Suchschnittstellen, Texteditoren oder Bildungsanwendungen entwickeln – diese API bietet einen saubereren und performanteren Ansatz als herkömmliche <mark>
- oder span-basierte Methoden.
Wichtige Erkenntnisse
- Die CSS Custom Highlight API ermöglicht Text-Hervorhebung ohne DOM-Manipulation
- Hervorhebungen funktionieren über Range-Objekte, Highlight-Objekte und die CSS.highlights-Registry
- Die Performance verbessert sich erheblich, da keine Layout-Neuberechnungen auftreten
- Mehrere nicht zusammenhängende Bereiche können gleichzeitig hervorgehoben werden
Was macht die CSS Custom Highlight API anders
Herkömmliche Text-Hervorhebung erfordert die Modifikation der DOM-Struktur. Die Verwendung von <mark>
-Elementen oder Spans bedeutet das Einfügen von Knoten, das Auslösen von Layout-Neuberechnungen und die Verwaltung komplexer HTML-Strukturen, wenn Hervorhebungen mehrere Elemente umspannen. Die CSS Custom Highlight API eliminiert diese Probleme, indem sie mit JavaScript-Ranges und dem ::highlight
-Pseudo-Element arbeitet und dabei Ihr DOM unberührt lässt.
Die API besteht aus drei Kernkomponenten:
- Range-Objekte, die Textgrenzen definieren
- Highlight-Objekte, die Ranges gruppieren
- CSS.highlights-Registry, die Hervorhebungen mit Styles verbindet
Erstellen und Stylen von Textbereichen
Ihre erste Hervorhebung erstellen
Beginnen Sie mit der Erstellung eines Range-Objekts, um zu definieren, welcher Text hervorgehoben werden soll:
const range = new Range();
const textNode = document.querySelector('p').firstChild;
range.setStart(textNode, 0);
range.setEnd(textNode, 20);
Als nächstes erstellen Sie ein Highlight-Objekt und registrieren es:
const highlight = new Highlight(range);
CSS.highlights.set('my-highlight', highlight);
Schließlich stylen Sie es mit dem ::highlight
-Pseudo-Element:
::highlight(my-highlight) {
background-color: yellow;
color: black;
}
Implementierung der Suchergebnis-Hervorhebung
Hier ist ein praktisches Beispiel für die Hervorhebung von Suchergebnissen in Ihrem Dokument:
function highlightSearchResults(searchTerm) {
// Bestehende Hervorhebungen löschen
CSS.highlights.delete('search-results');
const walker = document.createTreeWalker(
document.body,
NodeFilter.SHOW_TEXT
);
const ranges = [];
let node;
while (node = walker.nextNode()) {
const text = node.textContent;
const regex = new RegExp(searchTerm, 'gi');
let match;
while (match = regex.exec(text)) {
const range = new Range();
range.setStart(node, match.index);
range.setEnd(node, match.index + searchTerm.length);
ranges.push(range);
}
}
if (ranges.length > 0) {
const searchHighlight = new Highlight(...ranges);
CSS.highlights.set('search-results', searchHighlight);
}
}
Discover how at OpenReplay.com.
Erweiterte Muster: Multi-Range-Hervorhebungen
Die wahre Stärke zeigt sich beim Arbeiten mit mehreren, nicht zusammenhängenden Textbereichen. Ein einzelnes Highlight-Objekt kann mehrere Range-Objekte enthalten:
// Mehrere separate Absätze hervorheben
const range1 = new Range();
range1.selectNodeContents(document.querySelector('#intro'));
const range2 = new Range();
range2.selectNodeContents(document.querySelector('#conclusion'));
const highlight = new Highlight(range1, range2);
CSS.highlights.set('important-sections', highlight);
Sie können auch mehrere Hervorhebungsgruppen gleichzeitig verwalten:
// Verschiedene Hervorhebungstypen mit unterschiedlichen Styles
CSS.highlights.set('errors', new Highlight(...errorRanges));
CSS.highlights.set('warnings', new Highlight(...warningRanges));
CSS.highlights.set('info', new Highlight(...infoRanges));
::highlight(errors) {
background-color: #fee;
text-decoration: wavy underline red;
}
::highlight(warnings) {
background-color: #ffa;
}
::highlight(info) {
background-color: #e6f3ff;
}
Performance-Vorteile und Browser-Unterstützung
Die CSS Custom Highlight API glänzt in performance-kritischen Szenarien. Im Gegensatz zur DOM-Manipulation lösen Hervorhebungen keine Layout-Neuberechnungen aus und erzeugen keinen Memory-Overhead durch zusätzliche Elemente. Die Rendering-Engine des Browsers behandelt Hervorhebungen auf der Paint-Ebene, wodurch Updates bemerkenswert schnell werden.
Stand 2025 unterstützen Chrome, Edge und Safari die API, während Firefox-Unterstützung in der Entwicklung ist. Für ältere Browser implementieren Sie einen Feature-Detection-Fallback:
if ('CSS' in window && 'highlights' in CSS) {
// CSS Custom Highlight API verwenden
const highlight = new Highlight(range);
CSS.highlights.set('fallback-safe', highlight);
} else {
// Fallback auf traditionellen Ansatz
const span = document.createElement('span');
span.className = 'highlight';
range.surroundContents(span);
}
Praktische Implementierungstipps
Bei der Implementierung von Text-Hervorhebung in der Produktion:
-
Ungenutzte Hervorhebungen aufräumen, um Memory Leaks zu verhindern:
CSS.highlights.delete('old-highlight');
-
Dynamische Inhalte handhaben, indem Ranges bei DOM-Änderungen aktualisiert werden:
highlight.add(newRange); highlight.delete(oldRange);
-
Aussagekräftige Hervorhebungsnamen verwenden, die ihren Zweck beschreiben (z.B. ‘search-results’, ‘spell-check’, ‘user-annotations’)
Fazit
Die CSS Custom Highlight API transformiert unseren Ansatz zur Text-Hervorhebung im Web. Durch die Trennung der Hervorhebungslogik von der DOM-Struktur liefert sie bessere Performance, saubereren Code und mehr Flexibilität als traditionelle Methoden. Beginnen Sie mit dem Experimentieren von Textbereich-Hervorhebungen in Ihrem nächsten Projekt – Ihre Benutzer (und Ihr DOM) werden es Ihnen danken.
Häufig gestellte Fragen
Ja, die API kann Text hervorheben, der sich über mehrere Elemente erstreckt. Range-Objekte können in einem Element beginnen und in einem anderen enden, wodurch sie perfekt für die Hervorhebung von Phrasen geeignet sind, die Absatz- oder Span-Grenzen überschreiten.
Hervorhebungen bleiben an ihre ursprünglichen Range-Objekte gebunden. Wenn sich das DOM ändert, müssen Sie die Ranges manuell aktualisieren oder neu erstellen. Die API verfolgt DOM-Mutationen nicht automatisch, daher sollten Sie für dynamische Inhalte Ihr eigenes Observer-Pattern implementieren.
Mehrere Hervorhebungen können denselben Textbereich überlagern. Der Browser wendet alle passenden Hervorhebungs-Styles an, wobei später definierte Styles Vorrang haben. Sie können die visuelle Schichtung über CSS-Eigenschaften wie background-color und opacity steuern.
Truly understand users experience
See every user interaction, feel every frustration and track all hesitations with OpenReplay — the open-source digital experience platform. It can be self-hosted in minutes, giving you complete control over your customer data. . Check our GitHub repo and join the thousands of developers in our community..