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: dynamisches Hinzufügen/Entfernen von
Am Ende habe ich einen Hybrid erstellt.
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 zu verwendende
Als nächstes definieren wir ein Präfix für die benutzerdefinierte Eigenschaft:
const prefix = '--linenum-';
Bevor wir fortfahren, prüfen wir, ob eine vorhandene Eigenschaft wiederverwendet werden soll:
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 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 unsere Immobilie:
const id = `${prefix}${Math.random().toString(36).substr(2, 6)}`;
Und jetzt ist es an der Zeit, das SVG zu rendern:
const svg = ``;
Lassen Sie es uns aufschlüsseln:
Im
Der letzte Teil iteriert ein aus numLines erstelltes Array und hängt die
Wir sind fast da!
Um das generierte SVG als URL()-Eigenschaft zu verwenden, müssen wir es kodieren:
const encodedURI = `url("data:image/svg xml,${encodeURIComponent(svg)}")`;
Und schließlich legen wir diese Eigenschaft entweder für das Element oder den Dokumentkörper fest:
const target = inline ? element : document.body; target.style.setProperty(id, encodedURI); element.style.backgroundImage = `var(${id})`;
Und das ist es!
Nicht schlecht und nur 610 Bytes, minimiert und komprimiert!
Sie können sich hier eine Demo ansehen und das vollständige Skript hier herunterladen.
Unten ist ein vereinfachter Codepen, der nicht die Inline-Eigenschaftslogik verwendet:
Gibt es Vor- und Nachteile? Natürlich gibt es sie!
Ich persönlich brauchte – für mein aktuelles Projekt – eine einfache, klare Möglichkeit, Zeilennummern zu einer JSON-Vorschau innerhalb eines
Diese Methode basiert nicht auf der Manipulation des DOM. Die Zeilennummern werden als einzelnes SVG generiert und in einer benutzerdefinierten CSS-Eigenschaft gespeichert.
Da die Zeilennummern Teil des Hintergrundbilds sind, scrollen sie automatisch mit dem Textinhalt, sodass keine manuelle Synchronisierungslogik erforderlich ist.
Durch die Speicherung der generierten SVG-Datei in einer benutzerdefinierten CSS-Eigenschaft kann sie über mehrere Elemente hinweg wiederverwendet werden. Das bedeutet, dass, wenn mehrere Elemente dieselben Zeilennummern erfordern, alle auf dieselbe benutzerdefinierte Eigenschaft verweisen können, wodurch eine redundante SVG-Generierung vermieden wird.
Geordnete Listen sind für Screenreader und unterstützende Technologien besser zugänglich, während SVG-basierte Zeilennummern möglicherweise ignoriert oder falsch interpretiert werden.
Die Gestaltung und Interaktion mit einzelnen Zeilennummern in einer geordneten Liste ist unkompliziert. Im Gegensatz dazu macht es der SVG-Ansatz schwieriger, bestimmte Zeilennummern anzupassen oder ihnen Interaktivität hinzuzufügen.
Benutzerdefinierte SVG- und CSS-Eigenschaften werden möglicherweise nicht in allen Browsern konsistent dargestellt – die aktuelle Implementierung hat Probleme mit Safari, wo wir (paddingTop / 10) von TranslateY abziehen müssen.
Geordnete Listen können flexibler für die Handhabung dynamischer Inhaltsaktualisierungen sein, z. B. das Hinzufügen oder Entfernen von Zeilen, während der SVG-Ansatz möglicherweise die Neugenerierung und erneute Anwendung des gesamten Hintergrundbilds erfordert.
Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.
Copyright© 2022 湘ICP备2022001581号-3