Aug. 12 2008

Mit Conditional-CSS browserspezifische Stylesheetangaben verwenden

Tag: AllgemeinesPatrick @ 9:46 pm

Zweifellos jeder Web-Designer und -Entwickler stieß bei CSS-Angaben auf Darstellungsunterschiede in verschiedenen – vor allem älteren – Browsern, durch die man gezwungen war weitere Stylesheet-Dateien einzubinden oder CSS-Hacks zu verwenden um eine einheitliche Darstellung erzielen.

Das Kernpunkt des Problemes ist der unterschiedliche Grad der CSS-Implementierung in den verschiedenen Browsern und deren Versionen.

Allan Jardine bietet mit Conditional-CSS eine, wenn nicht sogar die, Lösung des Problems an: Er nahm die Idee der Conditional-Comment-Syntax des Internet Explorers auf und übertrug diese auf CSS-Anweisungen.

Somit ist es nun möglich, einfacher zu wartenden CSS-Code zu schreiben, der sich an die Eigenheiten des jeweiligen Renderers anpassen lässt. Damit sollten sich die nervigen CSS-Bugs auf einfache Weise umgehen lassen.

Unterstützt werden nahezu alle gängigen und exotischen Browser von IE bis Playstation Portable. Wobei zu beachten ist, dass nicht jede Browserversion auf Grund der Eigenheiten vollen Support erhält. Eine genaue Übersicht gibt dazu gibt es hier.

Hauptsächlich wird Conditional-CSS, wie bereits angesprochen, dazu verwendet werden, um festzulegen, ob ein CSS-Ausdruck an den jeweiligen Browser gesendet werden soll oder nicht. Es ist klar, dass man eigentlich auf solche Tricks verzichten möchte, aber in Ausnahmefällen ist C-CSS äußerst nützlich um einen bestimmten Browser anzusprechen anstatt Stunden mit einem Problem sich rumzuplagen.

Jeder CSS-Einzelanweisung oder jedem Anweisungsblock kann eine Bedingung vorangestellt werden.

Hier ein paar Beispiele zur Anwendung:

a.button_active, a.button_unactive {
display: inline-block;
[if lte Gecko 1.8] display: -moz-inline-stack;
[if lte Konq 3.1] float: left;
height: 30px;
[if IE 5.0] margin-top: -1px;
text-decoration: none;
outline: none;
[if IE] text-decoration: expression(hideFocus='true');
}

[if IE] .box {
width: 500px;
padding: 100px 0;
}

Wer sicher näher dafür interessiert, kann das OpenSource-Projekt C-CSS herunterladen und auf dem eigenen Server aufspielen. Eine detailierte Einbaueinleitung für PHP liegt bei.


Jul. 21 2008

IEPNGFix erhält Update

Tag: AllgemeinesPatrick @ 9:32 pm

Das durchaus sehr bekannte IEPNGFix, das den fehlenden Support von transparenten png-Grafiken für den Internet Explorer 5.5 und 6 nachliefert, hat vor wenigen Tagen ein Update erfahren und bietet nun volle Unterstützung der CSS1-Eigenschaften background-position und background-repeat.

Die vollständige Featureliste sieht nun wie folgt aus:

  • automatische Aktivierung der Transparenz von png-Grafiken in der Homepage
  • Unterstützung von <img src=““>-Elementen
  • Unterstützung PNG-Hintergrundgrafiken
  • volle Unterstützung der CSS-Eigenschaften background-repeat und background-position (durch eine optionale Erweiterung)
  • erlaubt das Definieren von Hintergrundgrafiken sowohl in der Datei als auch in externen Stylesheets
  • automatisches Aktuallisieren bei Änderungen der IMG-Quelldatei (SRC) oder der Hintergrundgrafik durch Javascript – funktioniert auch beim Ändern der festgelegten CSS-Klasse
  • bietet automatisches Workaround für <a href=““>-Elemente mit PNG-Hintergrundelementen
  • geringe Größe des Skripts
  • frei verfügbar

Der große Vorteil des Fixes besteht darin, dass man nur eine einzige Zeile CSS-Zeile einfügen muss um den Fix einzubauen. Weitere Codeanpassungen sind nicht nötig.

Vorgehen zum Einbau:

1.) Kopieren der Dateien iepngfix.htc and blank.gif in das Verzeichnis der Seite

2.) Füge die folgenden Zeilen Code in die HTML- beziehungsweise CSS-Datei ein (Der Pfad muss eventuell entsprechend angepasst werden):

<style type="text/css">
img, div { behavior: url(iepngfix.htc) }
</style>

3.) Falls Unterverzeichnisse verwendet werden, muss der Pfad in der HTC-Datei die Zeile IEPNGFix.blankImg = ‚/images/blank.gif‘; per Hand angepasst werden.

4.) Für die Unterstützung von  background-position und background-repeat muss die Javascriptdatei iepngfix_tilebg.js eingebunden werden.

5.) Einbau abgeschlossen.


Jul. 18 2008

Erfahrungsbericht: Probleme mit standardkonformen XHTML

Tag: AllgemeinesPatrick @ 10:22 am

Bei meinem täglichen Umgang mit Web-Programmierung bin in letzter Zeit in Bezug auf 100 Prozent standkonformes XHTML(1.1) auf 2 Bugs gestoßen, die mich sehr nervten. Der erstere betrifft den Internet Explorer und ist eher harmlos, der zweite ist allgemeiner Natur.

Wie angesprochen, behandle ich den IE-Fehler zuerst.

In meinen eigenen Projekten bevorzuge ich es, den XHTML-Standard nach Version 1.1 – also sehr strikt – einzuhalten. Meine üblichen Header beginnen dementsprechend wie folgt:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">

Jedoch genügt dies nicht, um den Validatortest des W3C zu bestehen, da hierfür auch der korrekte Datei-Header mitgeschickt werden muss. Dies sollte ja in PHP kein Problem sein.

Wie so üblich, war es dann doch nicht so einfach, da Microsofts Internet Explorer mit der Anweisung „Content-Type: application/xhtml+xml“ überhaupt nichts anzufangen weiß und idiotischer Weise die Seite zum Download anbietet.

Um Abhilfe zu schaffen, baute ich eine einfache IE-Browserweiche in meinen PHP-Code ein. Alle Webbrowser, bis auf den aus Redmond, bekommen den korrekten Datei-Header zugesandt.

$browser = get_browser( null, true );
if ( $browser['browser'] != "IE" ) {
header("Content-Type: application/xhtml+xml; charset=ISO-8859-1");
}

Das zweite Problem ist, wie bereits im Vorwort erwähnt, allgemeiner und betrifft die XHTML-Definition selbst. Diese sieht vor, dass beispielsweise kein document.write in XHTML gibt.

Bisher störte dies mich nur wenig. Jedoch kam ich die Tage mit einem Scipt in Berührung, das durch den massiven Gebrauch von document.write Emailadressen für Mailbots unzugänglich bzw. unlesbar macht.

Anschließend schrieb ich an einer eigenen document.write-Funktion, die jedoch 100% DOM-kompartibel sein sollte. Hierzu erwies sich das innerDOM-Script von Simon Kühn als sehr nützlich, da es einen (validierten) XHTML-String in ein DOM-Objekt konvertiert. Dieses Objekt lässt sich dann leicht an einer beliebigen Stelle im bestehende Dokument einfügen.

Die letzte Hürde bestand darin, die richtige, also „letzte“, Position im Dokument zu finden, so dass meine Funktion write ähnelt. Dazu nutzte ich in einer rekursiven Schleife die lastChild-Methode. Da Firefox und IE in Bezug Textknoten unterschiedlich behandeln, musste noch eine Fallunterscheidung eingebaut werden.

Die komplett Funktion lautet nun wie folgt:

function writeDom ( string ) {
var path = document;
while ( path.lastChild ) {
if ( path.lastChild.nodeType === 1 ) {
path = path.lastChild;
} else break;
}
path.parentNode.insertBefore( stringToDOM( string ), path );
}
document.writeDom=writeDom;

Der Aufruf geschieht ganz einfach über document.writeDom( String ).

Im Dokumentkopf muss das innerDOM-Script eingebunden sein!


Jul. 02 2008

CSS-Selektoren und die Browser

Tag: AllgemeinesPatrick @ 11:34 pm

In den Javascript-Bibliotheken werden sie sehr großzügig unterstützt, doch in ihrer Heimat, den Browsern selbst, besteht, vor allem bei Microsofts Internet Explorer, noch Handlungsbedarf. Die Rede ist von CSS-Selektoren.

Auf Grundlage der Test-Suite von www.css3.info habe ich eine Übersicht über die Unterstützung der einzelnen Selektoren in verschiedenen Browsern erstellt.

Die nachstehene Tabelle ist eine kurze Zusammenfassung der Testergebnisse.

Browser
bestandene Tests
bestandene Einzeltests
Internet Explorer 6 10 / 43 246 / 578
Internet Explorer 7 13 / 43 329 / 578
Internet Explorer 8 Beta 1 14 / 43 334 / 578
Firefox 2.0.0.15 26 / 43 357 / 578
Firefox 3.0 36 / 43 373 / 578
Firefox 3.1 Alpha 1 pre 43 / 43 578 / 578
Opera 9.51 43 / 43 578 / 578
Safari 3.1 43 / 43 578 / 578
WebKit R34936 43 / 43 578 / 578

Der komplette Ergebnis kann man dieser Übersicht entnehmen.

Schaut man sich die Tabelle an, erkennt man auch den sofort den Grund, warum Web-Entwickler bisher nur sehr zögerlich Gebrauch der CSS-Selektoren machen. Sie werden schlicht weg von den bisherigen IE-Browsern unzureichend unterstützt.

Bleibt zu hoffen, dass Microsoft noch kräftig am IE8 arbeitet. Vielleicht kann man zur nächsten Beta im August sich selbst schon ein Bild der Fortschritte machen.


Mai 08 2008

Codekomprimierung mal anders

Tag: Allgemeines,Canvas,JavascriptPatrick @ 9:57 am

Jacob Seidelin hatte am vergangenen Wochenende scheinbar seinen Spaß und bastelte an einer weiteren verrückten Idee: Javascriptcode in Bilddateien ablegen. Dabei erreichte er beachtliche Ergebnisse. Die 124 Kilobyte große Prototype-Bibliothek packte er in eine 30 Kilobyte kleine 8-bit-png-Grafik.

Seidelin, der bereits durch seine durch seine Spieleumsetzungen von Super Mario und Wolfenstein 3D auf sich aufmerksam machte, beteuert, dass es bei seiner Demonstration nur um eine Machbarkeitsstudie handelt, die dem im Web häufig anzutreffenden gzip-Komprimieralgorithmus nicht den Rang ablaufen kann.

Zu Beginn seines Vorhabens Code in Grafiken abzuspeichern, stellte sich Seidelin die Frage nach dem zu verwendenten Dateiformat. Sämtliche verlustbehafteten Formate waren von Anfang ausgeschlossen. Somit blieben nur GIF und PNG übrig. PNG bietet indes 2 verschiedene Modi: 24 bit und 8 bit. Durch einfaches Probieren mit Photoshop kam Seidelin zu dem Ergebnis, dass die 8-bit-PNG-Variante die beste Wahl in Sachen Komprimierung ist.

Das Umwandeln der Javascript-Bibliothek Prototype in Farbwerte, die in der PNG-Grafik hinterlegt werden, geschieht in einem PHP-Script. Die PHP-Datei dient dazu die JS-Datei einzulesen, die PNG-Grafik zu erzeugen und jedem Pixel einen Wert zwischen 0 und 255 entsprechend des ASCII-Wertes eines jeden Zeichens der JS-Datei zuzuweisen.

Als Ergebnis erhält man eine PNG-Grafik, die Prototype exakt aber komprimiert abbildet.

Mit Hilfe des Canvas-Elements kann die Grafik einfach über die Funktion drawImage() gezeichnet und über getImageDate() pixelweise eingelesen werden. Auf diese Weise erhält man ein Array aus Werten, wobei jedes Pixel aus 4 Farbwerten (RGBA) besteht. Da unsere Grafik aber nur einen 8-bit-Farbraum darstellt, wird nur jeden vierten Wert benötigt. Reiht man nun all diese Werte auf und verwendet die eval()-Funktion von Javascript erhält man seine ursprünge Protoytpe-Datei zurück.

Die komplette Dekomprimierfunktion sieht man hier.

Da das hier vorgestellte Verfahren die Unterstützung des HTML5-Elementes Canvas voraussetzt, funktioniert es auch nur in den aktuellen Versionen der Browser Firefox, Opera und WebKit. Der Internet Explorer muss wegen fehlender Canvas-Unterstützung außen vor bleiben.

Wer neugierig geworden ist, kann auf dieser Demoseite verschiedene Testdateien komprimieren und sich anzeigen lassen.

Prototype in png komprimiert jQuery in png komprimiert Mario in png komprimiert


Mai 06 2008

Homer Simpson und George Bush als CSS-Porträt

Tag: AllgemeinesPatrick @ 8:09 pm

Da soll noch mal einer sagen Web-Programmierer haben keinen Sinn für Kunst. Román Cortés hat in vielen Stunden Probierens mit CSS (Cascade Style Sheets) erst ein Porträt von Homer Simpson und einige Wochen später von George W. Bush erstellt. Die „Kunstwerke“ bestehen nur aus Zeichen in verschiedenen Größen, Farben und Positionsangaben. Beim Markieren des Bildes kann man dies sehr gut sehen.

Die Bilder werden im Internet Explorer 5.5+, Firefox 2+, Opera 9+ und Safari 3+ korrekt dargestellt.

Angeregt von Cortés‘ Beitrag veröffentlichte Ned Batchelder in seinem Blog eine mit jQuery animierte Version der Homer-„Grafik“, die den Aufbau anschaulich darstellt.

Homer in CSSGeorge Bush in CSS


Apr. 28 2008

FancyUpload – elegante Multifile-Uploadlösung mittels swiff und Ajax

Tag: Ajax Allgemein,Allgemeines,mootoolsPatrick @ 4:12 pm

Harald Kirschner veröffentlichte Version 2.0 seiner Multi-Uploadlösung FancyUpload, die den Flashuploader swiff und die Javascript-Bibliothek MooTools voraussetzt.

FancyUpload ist eine einfach zu handhabende Anwendung, die es ermöglicht mehrere Uploads nacheinander auszuführen und diesen Vorgang graphisch darzustellen. Es ist leicht einzurichten, serverunabhängig, lässt sich mit Hilfe von CSS und XHTML vollständig frei gestalten und basiert auf MooTools, um auf allen aktuellen Browsern (Internet Explorer 6+, Opera 9, Firefox 1.5+ und Safari 2+) zu laufen.

Die Featureliste liest sich wie folgt:

  • Auswählen und Uploaden von mehreren Dateien
  • Herausfiltern von Dateitypen durch einen Auswahldialog
  • Optionale Events um eigene Ereignisfunktionen einzubinden
  • Anzeigen von nützlichen Dateiinformationen noch vor Beginn des Uploadvorgangs
  • Begrenzen der Uploads über die Dateigröße oder – anzahl
  • plattform- und serverunabhängig, setzt nur Flash 9+ vorraus
  • Abbrechen laufender Uploads, Hinzufügen neuer Uploads während eines laufenden Hochladevorgangs
  • Alles ist optional, dokumentiert und lässt sich leicht anpassen
  • Serverantwort nach dem Uploaden zum Anzeigen zusätzlicher Dateiinformationen oder einer Bildvorschau
  • Angabe der aktuellen Uploadgeschwindigkeit und der verbleibenden Zeit
  • Senden zusätzlicher Informationen über Variablen mittels GET und POST
  • Bestimmen des Dateinamens nach dem Uploadvorgang

FancyUpload


Apr. 25 2008

WebKit unterstützt CSS-Masken

Tag: AllgemeinesPatrick @ 1:36 pm

Wie die Entwickler des WebKit-Browsers in ihrem Blog berichten, unterstützt ihr Schützling ab sofort CSS-Masken, mit denen sich sehr coole Effekte erzeugen lassen. Möglich wird dies durch die folgenden, neu eingeführten CSS-Eigenschaften:

  • -webkit-mask (background)
  • -webkit-mask-attachment (background-attachment)
  • -webkit-mask-clip (background-clip)
  • -webkit-mask-origin (background-origin)
  • -webkit-mask-image (background-image)
  • -webkit-mask-repeat (background-repeat)
  • -webkit-mask-composite (background-composite)
  • -webkit-mask-box-image (border-image)

Mit den CSS-Masken ergeben sich interessante Möglichkeiten um Überblendeffekte zu erstellen. So kann man beispielsweise ein Bild mit einem weichen Übergang zum Hintergrund erschaffen, indem man dem Bild eine Maskengrafik erweist. Der Quellcode dafür sieht wie folgt aus:

<img src=”kate.png” style=”-webkit-mask-box-image: url(mask.png) 75 stretch;” />

Bild + Maske

Des weiteren ist ebenso gut möglich, die vor kurzem vorgestellten Gradienten als Maskengrafik zu verwenden um Verläufe zu erzeugen. Der Code hierfür lautet:

<img src=”kate.png” style=”-webkit-mask-image: -webkit-gradient(linear, left top, left bottom, from(rgba(0,0,0,1), to(rgba(0,0,0,0))” />

Bild + Gradient
Auch svg-Grafiken eigenen sich als Grundlage für CSS-Masken. Dafür wird folgende Syntax angewandt:

<img src=”kate.png” style=”-webkit-mask-image: url(circle.svg)” />

Bild + SVG-Maske

WebKit stellt die Mittel zur Verfügung, es liegt an uns Webentwicklern die Chancen zu erkennen und die neuen Funktionen zu verwenden.

Ich bezweifle jedoch, dass sich die hier vorgestellten Masken in dieser Form mittelfristig durchsetzen werden, da sie erst in zukünftigen CSS-Definitionen Einzug halten. Es wird noch etliche Zeit dauern bis CSS-Masken auch von den „gewöhnlichen“ Browsern, zu denen ich WebKit nicht zähle, unterstützt werden.


Apr. 18 2008

Browser-News – Fixes und neue Features

Tag: AllgemeinesPatrick @ 9:52 am

In dieser Woche sind jeweils neue Versionen und Snapshots der wichtigsten Browser erschienen. Während die einen Sicherheitslücken schließen, bieten andere gänzlich neue Möglichkeiten.

Den Anfang machen die beiden Browser der Mozilla Foundation mit Namen Firefox und Appels Safari. Die neuen Versionen 2.0.0.14 von FF und 3.1.1 von Safari, die jeweils auch in deutscher Sprache zur Verfügung stehen, beheben einige Sicherheitslücken, die es zum Beispiel ermöglichten den Browser zum Absturz zu bringen bzw. schadhaften Code aus dem Clienten-Rechner auszuführen. In beiden Fällen steckte der Fehler in der Javascript-Engine.

Ein Fehler, der nur im Safari – sowohl die Windows- als auch die Mac-Version, betrifft, ermöglichte das Ausführen von Cross-Site-Scripting-Attacken indem ein Doppelpunkt in die Adressleiste eingegeben wurde.

Es wird dringend empfohlen, auf die veröffentlichen Versionen upzudaten!

Auch bei den Opera-Entwicklern gibt es Neuigkeiten zu vermelden. Im aktuellen Nightly Build wurde eine neue Schutzfunktion zum Warnen vor gefakten und betrügerischen Websites integriert. Diese „fraud protection“ ermöglicht besseres, schnelleres und nachvollziehbareres Blocken von unerwünschten Seiten und ist standardmäßig aktiviert. Zudem wurde eine zweite Beta der Version 9.5 in Aussicht gestellt.

Völliges Neuland betreten die Entwickler von WebKit. Ihr Browser unterstützt ab sofort die in HTML5 erwähnten Gradientenfarbverläufe. Die Syntax sieht wie folgt aus:

-webkit-gradient(<type>, <point> [, <radius>]?, <point> [, <radius>]? [, <stop>]*)

Die einzelnen Attribute haben folgende Bedeutung:

  • type – bestimmt die Art des Gradienten („linear“ oder „radial“)
  • point – ist ein Pärchen von mit Leerzeichen abgetrennten Werten (in Zahlen, Prozentangaben und Beschreibungen wie „bottom“)
  • radius – gibt den Radius des Gradienten beim Typ „radial“ an
  • stop – ist eine Funktion mit Namen „color-stop“, die 2 Argumente erwartet – „stop value“ (ein Wert zwischen 0 und 1 oder prozentual) und „color“ (eine css-konforme Farbangabe)

Die Gradientenverläufe lassen sich auf Hintergründe, Rahmen, Listengrafiken und als eingebettete Grafiken verwenden. Wer genaueres wissen möchte, schaue sich den WebKit-Blog zu diesem Thema an.

CSS-Gradientenfarbverläufen in WebKit


Mrz. 28 2008

Opera und Webkit knacken die 100 Punkte

Tag: AllgemeinesPatrick @ 1:22 am

Diesmal ging es ja wirklich flott. Berichteten wir vor wenigen Tagen, dass der Webkit-Browser im Acid3-Test 93 von 100 möglichen Punkte erreichte, investierten die Entwickler nochmals viel Zeit und Geduld um auch die verbleibenden Tests erfolgreich zu bestehen.

Wie man den Webkit-Webblog entnehmen kann, hatten die Entwickler Erfolg dabei, ihren Browser acid3-fit zu machen. Zwar wirken einige Animationen noch nicht so flüssig, aber man arbeitet daran.

Die Opera-Entwickler waren seit der Veröffentlichung des neuen Acid-Tests ebenso nicht untätig. Wie in ihrem Blog zu lesen ist, ist auch ihnen mit viel Arbeit gelungen in den Browserkern die fehlenden Webstandards zu implementieren.

In den folgenden Wochen wird es auch ein öffentliches PreRelease von Opera geben, das den Acid3-Test besteht, wovon sich jeder dann überzeugen kann.

Webkit schafft die 100 Punkte Opera gelingt dies ebenso


« Vorherige SeiteNächste Seite »