Heim > Artikel > Web-Frontend > Zeilennummern für
Neulich habe ich an einem JSON-Schemagenerator gearbeitet und wollte Zeilennummern in einem
Ich habe einige Nachforschungen angestellt und mehrere Ansätze gefunden:
Keiner davon hat mir gefallen! Das erste sah nicht klar aus – und entsprach nicht den Stilen, die ich bereits für meine
Der zweite Schritt erforderte eine Menge JavaScript, um diese geordnete Liste aufrechtzuerhalten:
Also habe ich am Ende einen Hybrid geschaffen.
Es handelt sich um eine dynamisch generierte SVG-Datei, die als benutzerdefinierte CSS-Eigenschaft gespeichert und als Hintergrundbild verwendet wird, wobei die Stile vom übergeordneten
Lass uns eintauchen.
Zuerst die Hauptmethode:
lineNumbers(element, numLines = 50, inline = false)
Element ist das
Als nächstes definieren wir ein Präfix für die benutzerdefinierte Eigenschaft:
const prefix = '--linenum-';
Bevor wir fortfahren, prüfen wir, ob vorhandene Immobilien weiterverwendet werden sollen:
if (!inline) { const styleString = document.body.getAttribute('style') || ''; const regex = new RegExp(`${prefix}[^:]*`, 'g'); const match = styleString.match(regex); if (match) { element.style.backgroundImage = `var(${match[0]})`; return; } }
Als nächstes extrahieren wir Stile aus dem Element und rendern das SVG mit derselben Schriftfamilie, Schriftgröße, Zeilenhöhe usw. :
const bgColor = getComputedStyle(element).borderColor; const fillColor = getComputedStyle(element).color; const fontFamily = getComputedStyle(element).fontFamily; const fontSize = parseFloat(getComputedStyle(element).fontSize); const lineHeight = parseFloat(getComputedStyle(element).lineHeight) / fontSize; const paddingTop = parseFloat(getComputedStyle(element).paddingTop) / 2; const translateY = (fontSize * lineHeight).toFixed(2);
Wir benötigen auch eine zufällige ID für unser Eigentum:
const id = `${prefix}${Math.random().toString(36).substr(2, 6)}`;
Und jetzt ist es an der Zeit, das SVG zu rendern:
const svg = `<svg xmlns="http://www.w3.org/2000/svg"> <style> svg { background: ${bgColor}; } text { fill: hsl(from ${fillColor} h s l / 50%); font-family: ${fontFamily}; font-size: ${fontSize}px; line-height: ${lineHeight}; text-anchor: end; translate: 0 calc((var(--n) * ${translateY}px) + ${paddingTop}px); } </style> ${Array.from({ length: numLines }, (_, i) => `<text x="90%" style="--n:${i + 1};">${i + 1}</text>`).join("")} </svg>`;
Lassen Sie es uns aufschlüsseln:
Im