Signatur
Beschreibung
Der Konstruktor Highlight() legt eine Sammlung von Textbereichen (Range oder StaticRange) an, die gemeinsam hervorgehoben werden sollen – zum Beispiel Suchtreffer, Rechtschreibfehler oder die Einfärbung von Quelltext. Anders als bei klassischen Lösungen mit zusätzlichen <mark>- oder <span>-Elementen bleibt der DOM-Baum dabei unverändert. Das ist deutlich schneller und stört weder Event-Listener noch Frameworks, die den DOM selbst verwalten.
Ein Highlight verhält sich wie ein Set: Mit add(), delete(), has(), clear() und size verwaltest du die Bereiche. Sichtbar wird es erst, wenn du es unter einem Namen in der HighlightRegistry registrierst (CSS.highlights.set(name, highlight)) und im CSS über das Pseudo-Element ::highlight(name) gestaltest.
Zusätzlich gibt es die Eigenschaften priority (Reihenfolge, wenn sich mehrere Highlights überlappen) und type ("highlight", "spelling-error" oder "grammar-error"). Der Typ ist für assistive Technologien gedacht.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $...ranges | AbstractRange (Range | StaticRange) | Beliebig viele Bereiche, mit denen das Highlight gleich zu Beginn befüllt wird. Wenn du keine übergibst, entsteht ein leeres Highlight, das du später mit add() füllst. |
Rückgabewert
Highlight-Objekt mit den übergebenen Bereichen, priority = 0 und type = "highlight".Beispiele
Einfaches Highlight anlegen und registrieren
// CSS: ::highlight(markiert) { background-color: yellow; color: black; }
const absatz = document.querySelector('p');
const textNode = absatz.firstChild;
const range = new Range();
range.setStart(textNode, 0);
range.setEnd(textNode, 5);
const highlight = new Highlight(range);
CSS.highlights.set('markiert', highlight);
console.log(highlight.size);
Suchtreffer ohne DOM-Änderung hervorheben
// CSS: ::highlight(suche) { background-color: orange; }
const sucheHervorheben = (container, begriff) => {
CSS.highlights.delete('suche');
if (!begriff) return 0;
const walker = document.createTreeWalker(container, NodeFilter.SHOW_TEXT);
const ranges = [];
const needle = begriff.toLowerCase();
for (let node = walker.nextNode(); node; node = walker.nextNode()) {
const text = node.textContent.toLowerCase();
let index = text.indexOf(needle);
while (index !== -1) {
const range = new Range();
range.setStart(node, index);
range.setEnd(node, index + needle.length);
ranges.push(range);
index = text.indexOf(needle, index + needle.length);
}
}
CSS.highlights.set('suche', new Highlight(...ranges));
return ranges.length;
};
document.querySelector('#suchfeld').addEventListener('input', (e) => {
const treffer = sucheHervorheben(document.querySelector('article'), e.target.value);
console.log(`${treffer} Treffer`);
});
Leeres Highlight mit Priorität und Typ
// CSS: ::highlight(tippfehler) { text-decoration: wavy underline red; }
const fehler = new Highlight();
fehler.type = 'spelling-error';
fehler.priority = 10; // gewinnt bei Überlappung gegen priority 0
const node = document.querySelector('#editor').firstChild;
const r = new StaticRange({ startContainer: node, startOffset: 4, endContainer: node, endOffset: 9 });
fehler.add(r);
CSS.highlights.set('tippfehler', fehler);
console.log(fehler.has(r), fehler.type);
// Wichtig · Fallstricke
- Browser-Unterstützung: Chromium 105+ und Safari 17.2+. Firefox unterstützt die API erst ab Version 140. Prüfe sie vorher mit
if ('highlights' in CSS), bevor du sie nutzt. - Ein
Highlightist erst sichtbar, wenn du es mitCSS.highlights.set()registrierst und passende::highlight()-Regeln im CSS existieren. - In
::highlight()wirkt nur ein Teil der CSS-Eigenschaften:color,background-color,text-decoration,text-shadowund einige weitere. Eigenschaften, die das Layout ändern (z. B.font-size,padding), werden ignoriert. - Eine
Rangepasst sich automatisch an, wenn sich der DOM ändert. EineStaticRangetut das nicht. Nach DOM-Änderungen kann sie also auf die falsche Stelle zeigen oder ungültig werden. - Wird der Konstruktor ohne
newaufgerufen, wirft er einenTypeError. - Viele Highlights mit vielen Bereichen kosten Rechenzeit beim Neuzeichnen. Entferne oder ersetze Highlights, die du nicht mehr brauchst, zum Beispiel mit
CSS.highlights.delete().