Dropcaps mit jQuery

Was Dropcaps sind, zeigt das nachfolgende Bild. Zu deutsch ist dies ein "Initial". Es gibt verschiedene Darstellungsmöglichkeiten für Initialien. Ganz allgemein ist es ein "schmückender Anfangsbuchstabe", der als erster Buchstabe von Kapiteln oder Abschnitten verwendet wird.

Wikipedia hat Abbildungen von historischen, wunscherschön und aberwitzig arbeitsintensiv aufbereiteten Initialen aus verschiedenen alten Dokumenten.

Das gezeigte Beispiel ist ein Screenshot aus einem Kundenprojekt.

Realisiert habe ich das mit jQuery und Hilfe aus dem Internet, mit Google gefunden. Es gibt mehrere Ansätze, Initiale zu realisieren. Im Grunde geht es darum, den Text zu filtern, den ersten Buchstaben "zur Seite zu schieben" und durch ein Bild zu ersetzen, daß das gewünschte Initial (entsprechend dem 1. Buchstaben) zeigt.

Was so einfach klingt, hat mich tatsächlich über 10 h Entwicklungszeit gekostet, bis es stabil, optisch zufriedenstellend und gemäß den Kundenvorgaben funktionierte.

Realisiert wurde es mit der aktuellen jQuery Version 1.3.2. Auf jQuery wird einfach per script-Anweisung im head-Bereich der Datei referenziert:

...

...

Da die Kundenwebsite vorsieht, daß diese Dropcaps in verschiedenen "Bereichen" der Seite auftauchen können, habe ich mir folgenden Funktionsaufruf zurechtgelegt:


$(document).ready(function(){
  dropcaps( "der/pfad/zu/den/bildern/img/", "div-tag (bereich)" );
});

Das $(document).ready( ... wird von jQuery bereitgestellt und stellt sicher, daß der enthaltene Code erst nach dem vollständigen Laden des Dokumentes ausgeführt wird. Hier drin befindet sich der Aufruf der Funktion dropcaps(), dessen Code so aussieht:

function dropcaps( picpath, bereich )
{

	$("#" + bereich + " p").each( function( index ) {
		var paragraph = this;
		var node = paragraph;
		
		while( node.childNodes.length ) {
			node = node.firstChild;
		}
		
		var text = node.nodeValue;
		
		/* html-source erhalten, da hier links etc. drin liegen koennen */
		var source = $( this ).html( );
		var source = source.slice( 1 );	/* das 1. zeichen wegschmeissen */
		
		var first_letter = text.substr( 0, 1 );
		
		var match = /[a-zA-Z]/.test(first_letter);
		
		if( match ) {
			node.nodeValue = text.slice(1);
			
			$( this ).html( ""
				+ first_letter
				+ ""
				+ source
			);
			
		}
	});
}

/* based on these sources:
 * http://www.learningjquery.com/2006/12/multiple-fancy-drop-caps
 * http://northtemple.com/2008/12/02/hot-and-graceful-jquery-dropcaps
 */

Die Quellangaben im Source zeigen an, woher der Quellcode ursprünglich stammt. Prinzipiell habe ich die verschiedenen Ansätze dieser beiden Autoren zu einer neuen Lösung verschmolzen. Da ich mir immer noch kein jQuery Buch gekauft habe (was ich schon sehr lange vorhabe), muß ich mir alles mühsam irgendwo aus dem Internet puhlen.

Es war ein ziemliches Gefummel, den ursprünglichen Text mitsamt enthalten HTML-Tags zu erhalten, denn die Methoden der beiden Autoren hatten das nicht berücksichtigt; somit waren z.B. im Text enthaltene Links plötzlich futsch. Alles in allem also viel Zeit für die Suche nach Lösungen für bestimmte Teilprobleme.

Ich muß mir unbedingt das Buch kaufen ;-)

Man muß natürlich alle Zeichen, die als Initial in Frage kommen könnten, als Bilder aufbereiten. Ist zwar nicht schwierig, aber nimmt auch Zeit in Anspruch. Auch hier steckt der Teufel im Detail: die Buchstaben so einer Schnörkelschrift in einer fixen Punktzahl sind nicht alle gleich groß. Man muß daher auch die Bildgröße einiger-vieler anpassen.

Zusätzlich gibt es durch die zugehörige CSS-Datei eine Möglichkeit der Feinjustage der Initialien:

/* dropcaps */
.dropcap{
    text-indent: 0;
}
.dropcap-a, 
.dropcap-b, 
.dropcap-c, 
.dropcap-d, 
.dropcap-e, 
.dropcap-f, 
.dropcap-g, 
.dropcap-h, 
.dropcap-i, 
.dropcap-j, 
.dropcap-k, 
.dropcap-l, 
.dropcap-m, 
.dropcap-n, 
.dropcap-o, 
.dropcap-p, 
.dropcap-q, 
.dropcap-r, 
.dropcap-s, 
.dropcap-t, 
.dropcap-u, 
.dropcap-v, 
.dropcap-w, 
.dropcap-x, 
.dropcap-y, 
.dropcap-z {
    width: 40px;
    height: 33px;
    display: block;
    text-indent: -5000px;
    float: left;
    margin-top: 3px;
    margin-right: 2px;
    background: transparent top center no-repeat;
}

.dropcap-h { width: 50px; }
.dropcap-j { height: 40px; }
.dropcap-k { width: 50px; }
.dropcap-m { width: 55px; }
.dropcap-n { width: 45px; }
.dropcap-p { width: 45px; }
.dropcap-y { width: 40px; height: 40px; }

Wer diesen Code für eigene Projekte nutzen möchte, kann das gerne tun. Ich bitte nur darum, die Quellangaben zu den Vorgängern und zu mir irgendwo im Source mitzuführen.

This article was updated on Mittwoch, Juli 13, 2022

seo-scout.org war eines meiner Lieblingsprojekte und mein Hauptblog, in den sehr viel Blut und Schweiß reingeflossen sind. Die vielen kurzen und langen Artikel hier haben viel Zeit in Anspruch genommen und sind natürlich auch Zeitzeugen. So wird z.B. über das erste Release von Chrome berichtet oder - wer kennt noch Google Wave? Hier zu lesen, heißt, die Zeit ein wenig zurückzudrehen und über die Anfänge und das Ende von vielen bekannten Webdiensten zu lesen.