Mittwoch, 8. Dezember 2010

Ein Klick hinter die Maske

Da will man mit einem runden Bullauge mal weg vom ewigen Rechteckdesign und stellt dann fest, dass man nicht durch transparente PNGs hindurch auf Links darunter klicken kann. Und jetzt?
Ich möchte mit einem an bestimmten Stellen transparenten PNG einen Textlayer abdecken, diesen Layer aber trotzdem scrollen und Links darin mit der Maus erreichen. Das geht aber nicht, weil das PNG für die Mauserkennung nicht transparent ist. Mist.
Als Stichwort fällt mir zunächst event bubbling ein, aber Fehlanzeige. Wo nix ankommt, wird auch nix gebubbelt.
Da ich bei dem Projekt jQuery verwende, könnte ich ja den Klick auf's PNG abfangen, die Cursorposition ermitteln, dann im Textlayer an der Stelle nachsehen, ob da ein Link ist (geht das überhaupt?) und dem dann den Clickevent manuell senden. Klingt nach einem langen Weg mit vielen Stolperfallen.
Machen wir es kurz: Die tatsächliche Lösung ist so einfach wie elegant, funktioniert adhoc und, was für mich das Schlimmste ist, sie hätte mir auch selbst einfallen können. Nach langer Suche, diversen Posts von Leuten, die das Problem nicht verstanden haben (nein, z-Index hilft hier gar nicht) und diversen Stichwortmorphs fand ich diesen Beitrag: http://www.blazekwebdesign.com/bwd/2008/developer-notes/clickable-links-through-a-transparent-image-in-css/
Wir brauchen also drei Layer:
  1. die Textebene
  2. die Bildebene mit dem transparenten PNG
  3. eine durchsichtige Kopie der Textebene
Was ich nicht wusste: Der transparente Textlayer 3 bleibt klickbar! Man sieht also den Layer 1, aber man klickt den Layer 3. Einfach, genial, einfach genial. Das wird gleich ausprobiert: http://www.haarkoetter.com
So, nach der anfänglichen Begeisterung widmen wir uns nun den Problemen dieser Lösung ;O)

Link ohne mouseover

Zwar funktionieren nun die Links, sprich, beim Anklicken wird zum Ziel verzweigt, aber alle anderen Effekte bleiben unsichtbar. Der Grund ist klar, denn der reagierende Layer 3 ist ja voll transparent, aka unsichtbar. Der Rollover findet zwar statt, aber ohne uns.
Ok. Hatte ich schon erwähnt, dass ich jQuery verwende? Die Links werden mit IDs versehen, dann kann man den Event an Layer 1 weiterreichen und dort gibt es dann den sichtbaren Hover-Effekt. Falls ein Leser sich daran erfreut, hier die Lösung eines Problemes gefunden zu haben, darf er gerne das entsprechende Skript hier posten. Ansonsten liefere ich das demnächst nach, denn...wär schon schön!

Kopie des Textlayers pflegen

Mit der Kopie des Layers wird die HTML-Quelle ganz schön unübersichtlich. Und bei Änderungen muss man stets daran denken, diese zweimal vorzunehmen. Blöd. Besonders dann, wenn Text hinzugefügt wird und dadurch die Position des Original-Links und der Kopie verrutschen. Dann sind (sichtbare) Links plötzlich nicht mehr klickbar.
Die Lösung liegt nahe: die Kopie wird erst zur Laufzeit gefüllt! Mit jQuery ist das nur ein Einzeiler! Das müsste sich sogar in CM-Systemen machen lassen, wenn man diesen Aufruf nach dem Laden des Contents einfügen kann.

No script, no fun

Graceful degradation, also die Rücksichtnahme auf ältere Browser und Menschen, die ohne Javascript surfen, ist hier unschwer umzusetzen, sieht aber hässlich aus. Der sichtbare Layer muss im CSS zunächst vor dem Bild liegen (ade, du schöner Rahmeneffekt) und wird erst durch ein onload-Skript nach hinten gedrückt. Jetzt bleibt alles klickbar, aber die Optik ist im Eimer.

Screenreader

Freundlicherweise sollte das Skript nur angewendet werden, wenn kein screenreader erkannt wurde, denn sonst werden alle Texte zweimal gelesen.

Übrigens: die hier gezeigte Site verwendet meinen automatischen Index (Blogartikel) zur Navigation.

Dienstag, 4. Mai 2010

Zwischendurch...

Hier ein paar Experimente mit HTML5, CSS3 und jQuery. Die Quelltexte sind einigermaßen kommentiert und laden hoffentlich zu eigenen Versuchen ein.
Zum einen etwas Spielerei mit CSS3. Ist wirklich schön mit modernen Browsern, aber schmucklos anzusehen mit dem IE6...
CSS3: Transparente Layer, Fontfacing & Spaltensatz

Dann ein wenig Imagehandling mit jQuery:
Imageslider - unbedingt mit den verschiedenen Bilder probieren ;O)
Die Variante 1c ist noch etwas buggy, aber man sieht schon, wo es hingeht, daher wollte ich die nicht weglassen...
Bessere Bildbearbeitungsmöglichkeiten bietet das canvas-Element, daher werde ich die hier vorgestellten Wege vorerst nicht weiter beschreiten.

Mittwoch, 14. April 2010

Automatischer Index mit jQuery

Die Arbeit mit jQuery spart Zeit, die man wunderbar für Schnickschnack nutzen kann. Obwohl... eigentlich ist so ein Index bei langen Texten ganz schön praktisch.
Nach dem absatzweisen Scrollen zur Erhöhung des Lesegenusses ;O) werden nun lange Texte automatisch indiziert und über eine Sidebar navigierbar (Beispiel). Auch hier verwenden wir jQuery und das scrollto-Plugin.

Sonntag, 21. März 2010

Scrolling absatzweise

Hier eine Abwandlung der Scroll-Routine. Der Text wird absatzweise gescrollt. Außerdem habe ich mit einer Lesehilfe experimentiert und den Text zoombar gemacht.
Im ersten scroll-Artikel wurde der Inhalt mit jQuery und dem scrollTo-Plugin pixelweise gescrollt. Diesmal soll sich das Scrollen am Inhalt orientieren und absatzweise scrollen.

Struktur finden

Wie kann ich durch eine unbekannte Anzahl Elemente scrollen, die nicht nummeriert sind? Mit jQuery gibt es dafür mehrere Lösungen:
  • Ersten finden, dann mit .prev und .next arbeiten
  • Liste erstellen
  • Nummerierte Klassen vergeben
Ich habe mich für die dritte Möglichkeit entschieden. Zu Beginn werden die entsprechenden Absätze mit Klassennamen versehen und erhalten dadurch einen Identitifier, der eventuell vorhandene Id's nicht überschreibt und trotzdem jeden Absatz individuell adressierbar macht. Mit jQuery ein Klacks:
$(document).ready( function() {
  $("#scrollcontent").scrollTop(0);   // anfangsposition setzen
  paras = $('#scrollcontent p');      // alle <p>-Elemente holen
  paras.each(function(index) {        // 'index' wird von jQuery gefüllt
    $(this).addClass('scroll_'+index);  // klassennamen basteln
    maxpara = index;                  // maxpara mitlaufen lassen
  });
  aktpara = 0; //aktueller paragraph
(Die Variablen sind weiter oben im Originaltext definiert.)

Nach der Ausführung dieser Schritte hat jeder Absatz im Zielcontainer scrollcontent einen Klassennamen, der sich aus scroll_ und einer Nummer zusammensetzt, also scroll_0, scroll_1, scroll_2 etc.
Diese können dann mit .scrollto direkt angefahren werden:

Dienstag, 16. März 2010

Das fluid-Projekt - Teil 1: Rechnen

 Falls ihr die Artikel aus dem Intro gelesen habt, wisst ihr ja bereits, dass wir mit einem 'Standard'-Layout in vorgegebener Größe beginnen und dann feste Angaben (px) durch relative (%) ersetzen.
Bauen wir also zunächst das feste Grundgerüst, hier bestehend aus wrapper, header, content und footer.

Montag, 15. März 2010

Browser: Fenstergrösse auf Knopfdruck

Da freut sich der Entwickler: Eigentlich auf der Suche nach einer Möglichkeit, in Safari Bookmarks zu setzen, fand ich diesen Artikel über das Erstellen kleiner Bookmarklets zum Einstellen der Fenstergröße.
Und da das auch in Firefox funktioniert, habe ich es gleich ausprobiert und empfehle es zur Nachahmung. Öffnet einfach die Bookmark-Sidebar und erstellt ein neues Bookmark. Als Adresse gebt ihr eines der folgenden Skripte ein.

Donnerstag, 11. März 2010

Das fluid-Projekt – works well in a crowded area™


 Das fluid-Projekt fasst einige Tricks zusammen, auf die ich während der Arbeit an der Site des Fotografen Michael Eckstein gestoßen bin.
Fluid bedeutet in diesem Zusammenhang: Bei einer Fenstergrößenänderung skalieren alle Elemente einer Website mit, wobei Schriftgrößen nicht bzw. anders verändert werden. Hierbei gehe ich von einer Maximalgröße der Seite aus, für die alle Bilder angelegt werden.
Die Nutzer kleinerer Bildschirme können dann ein verkleinertes Abbild der Site sehen, ohne auf Lesekomfort durch Skalieren der Schrift verzichten zu müssen.
Auf der oben genannten Site könnt ihr sehen, wie das dann aussieht (einfach mal das Browserfenster verkleinern/vergrößern).
Hier die Leute, die mit ihren Blogs und Tutorials geholfen haben, das ganze zu verstehen:

Mittwoch, 10. März 2010

Scroll while mousedown

Nachdem ich jQuery und jQuery UI kennen und schätzen gelernt habe, wollte ich gleich mal probieren, wie ich eigene Scroll-Elemente erstellen könnte. Denn mal ehrlich — die Betriebssystem-Scrollbalken passen einfach nie zum Website-Design
Das mit dem scrollen war dank jQuery und scrollTo-Plugin schnell erledigt: Button-Element mit Event-Callback mousedown ausstatten und schon wird gerollt. Genau einmal! Hmm...
Also muss eine Art while(mousedown) her, nur leider gibt es das nicht so einfach. Dann fand ich aber den Forumsbeitrag von itsallkizza auf CodingForums, der aber ein kleines Problem aufweist, das wir im Folgenden beheben werden.
Das soll getan werden: Der Inhalt eines div-Containers soll über zwei weitere Elemente nach oben bzw. unten gescrollt werden. Diese Elemente können beliebige Bilder oder andere DOM-Objekte sein (um den Download der Demodateien klein zu halten, verwende ich hier HTML-Buttons).
Solange auf den Button gedrückt wird, soll die Scrollfunktion laufen, bei mouseup soll sie wieder aufhören. Das Problem: Die jQuery-Funktion mousemove ist sehr CPU-hungrig, die im Forum gefundene Lösung hat hingegen einen unschönen Seiteneffekt.

Samstag, 27. Februar 2010

Herzlich willkommen

In diesem Blog sammle ich Tipps rund um das weite Thema Gestaltung mit den Schwerpunkten Print2Web und DB2Print.
Sie werden hier also Codeschnipsel finden, Softwaretests oder HowTo's. Ob CSS, framescript oder ActionScript, Photoshop oder Illustrator, Cinema3D oder Shockwave 3D – Themen meiner Arbeit sind auch Themen dieses Blogs.