Professor Web - RSS-Feed News und Tipps & Trick rund um die Welt des Webdesigners. HTML, CSS, PHP, mySQL, Browser und vieles mehr. http://www.professorweb.de Tue, 06 May 2014 18:42:37 +0100 Professor Web http://www.professorweb.de/images/M_images/professorweb.png Professor Web - Das Webdesigner Portal http://www.professorweb.de News und Tipps & Trick rund um die Welt des Webdesigners. HTML, CSS, PHP, mySQL, Browser und vieles mehr. Keine neuen Artikel bei ProfessorWeb http://www.professorweb.de/professor-web/keine-neuen-artikel-bei-professorweb.html
Um die Gründe kurz zu erläutern: Primär ist die Zeit ein Faktor der aufgrund von Arbeit und Privatem eher spärlich gesät ist. Dazu kommen manche echt sau dumme Kommentare, die einem die Lust allmählich nehmen.

Der Grundgedanke des Blogs war es, der Öffentlichkeit das zugänglich zu machen, was ich selbst jüngst herausgefunden oder gelernt habe. Aber Undank ist der Welten Lohn und so ziehe ich den entsprechenden Entschluss.


Die Kommentare bleiben weiterhin offen und bei Fragen darf man mich auch gerne weiterhin kontaktieren - lediglich der RSS-Feed (und damit auch der Blog selbst) wird kein neues Futter erhalten.

Ich danke für Eure Aufmerksamkeit und Euer Verständnis.

Freundlicher Gruß
Armin Rüdiger Vieweg
- Gründer ProfessorWeb.de -
]]>
Fri, 25 Sep 2009 12:19:07 +0100
Zeilen in Tabellen mit PHP abwechselnd stylen (even, odd) http://www.professorweb.de/php-mysql/zeilen-in-tabellen-mit-php-abwechselnd-stylen-even-odd.html
Erst kürzlich habe ich in einem ausführlichen Artikel die PHP Klasse "Simple HTML DOM Parser" vorgestellt, mit der man wie in jQuery sehr komfortabel HTML-Code ändern kann.

Dieser Artikel setzt den Vorherigen als Basis voraus, daher empfehle ich erst den Simple HTML DOM Parser Artikel zu verinnerlichen, bevor wir auf das folgende Praxis-Beispiel näher eingehen.



Grafisch hochwertige Tabellen
Eine nett anzusehende Tabelle könnte zum Beispiel so aussehen:

Hübsche Tabelle

Dieses Bild ist aus einem vorherigen Artikel von Professor Web, in dem ich auf das kleine JavaScript Tablecloth eingegangen bin, dass das was wir jetzt mit PHP machen schon mit JavaScript umgesetzt hat.

Der Vorteil es mit PHP zu machen ist, dass kein JavaScript benötigt wird und der Aufwand verhältnismäßig gering ist.


Der Grund-Code
Wenn wir den Simple HTML DOM Parser eingebunden und den Quellcode der Seite, der gleich ausgegeben werden soll, in eine entsprechende Variable geladen haben, können wir mit dem eigentlichen Script anfangen.

Hier nochmal kurz der Quellcodeauszug um den Parser einzubinden und den Code in die Variable $inhalte zu laden. Wie das genau funktioniert findet Ihr im Artikel, den ich eingangs verlinkt habe.

require_once($_SERVER["DOCUMENT_ROOT"] . "/inc/simple_html_dom.php");
$inhalte = str_get_html($inhalte);


Der Haupt-Code
foreach($inhalte->find('table') as $e) {
    foreach($e->find('tr') as $f) {
        if($i == 0) $f->class .= ' first';
        if($i % 2 == 0) {
            $f->class .= ' odd';
        }
        else {
            $f->class .= ' even';
        }
        $i++;
    }
    unset($i);
}




Erklärung
Wir durchsuchen hier den Quellcode zuerst nach allen Tabellen die vorhanden sind. Danach alle TR (Table Row) innerhalb der jeweiligen Tabellen. Wir müssen es in zwei Schleifen aufteilen, da ansonsten nicht mehr differenziert werden kann ob sich das nächste gefundene TR noch in der 1. oder vielleicht schon in der 2. Tabelle befindet.

Die erste If-Abfrage identifiert anhand der Laufvariable $i ob es das erste TR der aktuellen Tabelle ist. Wenn dem so ist, wird dem TR die Klasse "first" zugewiesen.

In der zweiten If-Abfrage wird geklärt ob das aktuelle TR gerade (even) oder ungerade (odd) ist. Dafür verwenden wir den Operator %. Wir teilen also die Laufvariable durch 2 und erhalten nicht den geteilten Wert, sondern den Restwert.

3 geteilt durch 2 - der Restwert ist 1 - d.h. ungerade
4 geteilt durch 2 - der Restwert ist 0 - d.h. gerade
usw...

Egal mit welcher Zahl wir das machen. Der Restwert ist immer 1 oder 0 und das können wir dann super in einer IF-Abfrage nutzen um die entsprechende CSS-Klasse hinzuzufügen.

Da die Laufvariable bei 0 und nicht bei 1 beginnt sind die Klassen "even" und "odd" scheinbar verkehrt herum aufgeführt - so wird jedoch das korrekte Ergebnis angezeigt. Die 1. Zeile (Zahl 1 = ungerade) erhält somit die Klasse "odd" und dies wird abwechselnd mit "even" fortgeführt.

Sind alle TR der ersten Tabelle durchgelaufen endet die innere foreach-Schleife und die Variable $i wird wieder auf 0 gesetzt. Dann beginnt das Spiel mit der nächsten Tabelle die gefunden wird.


Modifikation
Man kann nach Belieben die erste Zeile des Scriptes anpassen um nur Tabellen aufzuführen die bestimmte Kriterien erfüllen. Beispielsweise sollen nur Tabellen bearbeitet werden die sich im DIV mit der id="content" befinden. Dann würde die erste Zeile so aussehen:
foreach($inhalte->find('div#content table') as $e) {




Das passende CSS
Ist das Script eingebunden und wird der Quellcode ausgegeben können wir die Klassen .even, .odd und .first nach Belieben im Stylesheet definieren.

Um ein vergleichbares Ergebnis wie im Screenshot oben zu erzielen würden wir also folgendes schreiben:
tr.odd {
  background-color:#f8fbfc;
}

tr.even {
  background-color:#e5f1f4;
}

tr.first {
  background-color:#328aa4;
  color:#fff;
  font-weight:bold;
}

Übrigens: Die erste Zeile in der Tabelle hat die Klassen "first" und "odd". Das kann je nach Aufbau des Stylesheets wichtig sein.

Dies ist ein Beispiel, wie wir den Simple HTML DOM Parser sinnvoll in der Praxis einsetzen können. Ein Weiteres, dass sich mit Links befasst, wird demnächst folgen.

Basiswissen: Simple HTML DOM Parser


Der Artikel hat übrigens die glatte ID=300 in meinem Blog :)

]]>
Wed, 12 Aug 2009 13:37:00 +0100
Neuer RSS-Feed - Jetzt mit den kompletten Artikeln http://www.professorweb.de/professor-web/neuer-rss-feed-jetzt-mit-den-kompletten-artikeln.html
Neuer RSS-Feed Während ich vergangene Nacht den RSS-Feed so vor mich hin umgestellt habe, ist mir aufgefallen, dass Feedburner von Google aufgekauft zu sein scheint. Das fand ich sehr interessant und mein alter Feedburner Account wurde in meinen Google Account umgewandelt.

Soll mir recht sein - ich fand es nur lustig, mal einen Moment nicht aufgepasst zu haben und *schwubs* hat Google Feedburner aufgekauft ;-)



Neuer Professor Web RSS-Feed
Alles ist gleich geblieben. Die URL zum Feed und der gewohnte Umfang meiner Beiträge. Jetzt könnt Ihr aber die Artikel direkt, komplett in Eurem RSS-Reader lesen. Und das sogar ohne Werbung.

Der Link zum RSS lautet: http://feeds.feedburner.com/professorweb

Ihr könnt ihn aber auch über den Button rechts oben jederzeit aufrufen und hinzufügen.


Neues Professor Web Logo
Da der Relaunch wohl noch etwas dauern wird, habe ich das neue Professor Web Logo in der vergangenen Woche in den Header, anlässlich des 2. Geburtstages von Professor Web, geladen. Das wollte ich nur mal kurz hier anmerken, wenn ich ja eh gerade ein Artikel über mich selbst am schreiben bin ;)


Fragen, Anregungen und Kritik
bitte wie immer über die Kommentare der jeweiligen Artikel, oder als E-Mail über Kontakt. Das Beste am Bloggen sind die Reaktionen der Besucher, vor allem natürlich wenn man ihnen gerade helfen konnte. Dies strebe ich weiter an.
]]>
Wed, 12 Aug 2009 10:56:53 +0100
Simple HTML DOM Parser - HTML mit PHP ändern http://www.professorweb.de/php-mysql/simple-html-dom-parser-html-mit-php-andern.html
In jQuery gibt es sehr komfortable Selectors. Man kann zum Beispiel sagen, dass jeder Link der extern ist eine zusätzliche Klasse zugewiesen bekommt. Der Code in jQuery sieht dafür so aus:

$("a[href^='http://']").addClass("external");


In CSS 3 gibt es auch die Möglichkeit Selektierungen an Hand von z.B. Eigenschaften vorzunehmen, das sähe in einem CSS3-Stylesheet dann so aus:
a[href^='http://'] {
  color:red;
}

Aber Achtung! CSS3 Befehle werden vom Internet Explorer 8 oder früher nicht unterstützt. Lediglich Vorreiter wie Firefox, etc. unterstützen bereits CSS3-Befehle (und sogar schon HTML5).


Aber ohne jetzt ausschweifen zu wollen, stellt sich mir hierbei die Frage: Wie kann ich eine Klasse über PHP dem entsprechenden Link hinzufügen? Denn jQuery und damit JavaScript klappt nicht auf allen Computern (kann man ja ausschalten) und CSS3 wird nicht flächendeckend unterstützt.



Grundvoraussetzung
Also die Grundvoraussetzung ist, dass wir den Quellcode der Seite die wir gleich ausgeben möchten in einer Variable gespeichert haben um so darauf zugreifen zu können. Wie das geht mit PHP habe ich in zwei Artikeln etwas näher erläutert:

Inhalte mit PHP abfangen und
PHP und .htaccess: Aus statisch mach dynamisch

Haben wir jetzt den Quellcode z.B. in der Variable $inhalte gespeichert, ist die Frage, wie kann z.B. jedem Link, dass sich im DIV mit der id="content" befindet eine zusätzliche Klasse geben? Es gibt vermutlich seitenlange Reguläre Ausdrücke mit denen das ginge, aber es geht sehr viel schneller und einfacher!


PHP Simple HTML DOM Parser

Was hier trotz des Wörtchens "simple" immer noch recht kompliziert klingt ist gar nicht so schlimm wie es aussieht. Wenn wir die aktuell 35,2 KB große kleine Datei über ein Include oder besser ein Require ins PHP einfügen, also so:

require_once($_SERVER["DOCUMENT_ROOT"] . "/inc/simple_html_dom.php");

Dann können wir im Anschluss daran mit neuen Befehlen arbeiten. Wir gehen ja noch davon aus, dass der Quellcode ganz normal als Text in der Variable $inhalte steht.

Damit kann das Script noch nichts anfangen, der Text muss erst geparsed werden. Ist aber nicht schwer, dafür gibt es folgenden Befehl:

$inhalte = str_get_html($inhalte);

Wir überschreiben hier die Variable $inhalte mit der geparsten Variante des Quellcodes.

Man kann auch statt einer Variable direkt eine Datei öffnen oder sich den Quellcode einer externen Seite "leechen" mit folgendem Befehl:

$html = file_get_html('test.html');
$external_html = file_get_html('http://www.google.de/');

Das aber nur am Rande - wir arbeiten jetzt mit $inhalte weiter.


Ich will alle Links im DIV mit der id="content" aufgelistet haben. Kein Problem dafür nutzen wir folgenden Code:
$meine_links = $inhalte->find('#content a');


Die Variable $meine_links ist jetzt ein DOM-Parser-Objekt, vergleichbar mit einem assoziativen Array, d.h. wir können hier mit einer foreach-Schleife arbeiten. Also eine Schleife die für jedes gefundene Element was entsprechendes ausführt.

Der Befehl von eben, kombiniert mit der entsprechenden Schleife sieht dann so aus:
foreach($inhalte->find('#content a') as $e) {
  echo("Link gefunden mit href: " . $e->href . "<br>\n");
}

$e beinhaltet dank der foreach-Schleife immer das aktuelle Element, dass unserem Selektor entspricht. Die Eigenschaften des Objektes sind auch die Eigenschaften des Elementes. Wir können darüber jedes beliebige Attribut abfragen.


Den Quellcode in der Variable verändern
Im letzten Beispiel haben wir in der foreach-Schleife ein Echo zum Ausgeben verwendet. Wir wollen aber in der Regel den Quellcode selbst manipulieren und anschließend komplett als fertige Website ausgeben. Dies geht ebenfalls denkbar einfach und zwar auch über die Attribute des Objektes.

foreach($inhalte->find('#content a') as $e) {
  $e->target = "_blank";
}

Dadurch, dass wir der Eigenschaft "target", die ein Link ja besitzt, einen neuen Wert zuweisen wirkt sich diese Änderung auf alle Elemente in dem Quellcode aus. Also alle Links im DIV mit der id="content" haben nun das Attribut "target" mit dem Wert "_blank" zugewiesen bekommen.

Geben wir den Quellcode nun mit

$fertige_inhalte = $inhalte;
echo $fertige_inhalte;

aus, sehen wir den ursprünglichen Quellcode mit den eben definierten Änderungen. Den Schritt vor dem Echo machen wir um aus dem DOM-Objekt wieder reinen Text zu machen und ihn dann auszugeben.

Wenn wir weiterhin objektorientiert bleiben wollen, können wir aber auch dieses hier schreiben:
$fertige_inhalte = $inhalte->save();
echo $fertige_inhalte;


Alternativ kann man den Quellcode auch direkt in eine Datei zurückschreiben:
$html->save('ergebnis.html');

Das ist total praktisch und relativ einfach zu handhaben.



Spezielle Attribute
Verschiedene Elemente im HTML haben ja verschiedene Eigenschaften. Ein Link hat z.B. ein "target", ein Bild hat kein "target", dafür einen "alt"-Tag. Hier unterscheiden sich die Elemente, darauf muss man auch entsprechend achten. Versucht man ein Attribut aufzurufen, den es nicht gibt erhält man als Rückgabe "NULL". Man erhält allerdings auch "NULL" zurück, wenn man in einem Link ein Target ausgeben möchte, der gar nicht vorhanden ist (obwohl es valide wäre).

Abgesehen von den "normalen" Attributen gibt es aber noch speziell definierte Eigenschafen, die es im normalen HTML so gar nicht gibt.

Und zwar gibt es noch Folgendes:
echo $e->tag; //Ausgabe: a
echo $e->outertext; //Ausgabe: <a href="test.html">Dies ist ein <b>Lin...</a>
echo $e->innertext; //Ausgabe: Dies ist ein <b>Link</b>
echo $e->plaintext; //Ausgabe: Dies ist ein Link

Diese Eigenschaften sind vergleichbar mit innerHTML oder outerHTML aus JavaScript.


Sich im Quellcode bewegen
Wir können uns auch im Quellcode bewegen. Wir wollen also nicht alle Links haben, die mit "http://" im "href" beginnen, sondern alle Elemente, die danach kommen - oder sich vielleicht innerhalb des Links befinden. Oder wir wollen das Element haben, was sich oberhalb des Links befindet.

Hierfür haben die Entwickler ähnliche Befehle eingebaut, wie wir sie schon aus JavaScript oder Libraries wie jQuery kennen:
$element_danach = $e->next_sibling();
$element_davor = $e->prev_sibling();

Wir können auch Kombinationen machen, z.B. alle Kinder-Elemente im nächsten Element:
$elemente_im_element_danach = $e->next_sibling()->children();




Lizenz, Download und Dokumentation
Dieses Script, was mit seinen 35,2 KB recht schnittig ist, unterliegt der MIT-Lizenz, kann also frei (auch für kommerzielle Zwecke) verwendet werden.

Das Projekt selbst liegt bei Sourceforge. Dort liegt auch die Dokumentation und findet sich der Download der verschiedenen Versionen. Die aktuelle Version ist 1.11, diese war auch Bestandteil meiner Tests.

Website von PHP Simple HTML DOM Parser
Download Version 1.11 (als ZIP mit Beispielen)

Wenn Ihr Alternativen kennt, Fragen habt oder schon Erfahrungen damit machen konntet - immer gerne her damit - die Kommentarfunktion steht Euch zur freien Verfügung. ]]>
Tue, 11 Aug 2009 14:38:54 +0100
Wie man in CSS mit Position arbeitet http://www.professorweb.de/css/wie-man-in-css-mit-position-arbeitet.html
Die Position-Eigenschaft in CSS (Cascading Stylesheet) kann folgende Werte haben:
absolute, relative, static und fixed

"Fixed" wird vom IE6 nicht unterstützt ansonsten sind die verschiedenen Werte unterschiedlich einsetzbar.



Wofür verwendet man Position?
Mit Position sagt man einem Element wie es positioniert wird. Also nicht wo es zu finden sein soll, sondern an was es sich ausrichten soll.

Hat z.B. ein DIV position:relative; orientiert es sich ähnlich wie auch bei static an den Elementen die sich davor oder darüber befinden. Bei position:absolute; jedoch wird es praktisch aus der Struktur genommen und erhält komplett unabhängige Positionsangaben.

Fast immer verwendet man in Verbindung mit Position auch die Befehle "left" und "top" - gelegentlich auch "right" und "bottom".

Um mal mit einem einfachen Beispiel arbeiten zu können ist der folgende HTML-Code für alle Beispiele gleich:
<div id="header">
    Ich bin oben
</div>

<div id="footer">
    Ich bin unten
</div>


Dieser Quellcode ohne irgendwelche extra Positionsangaben (das entspricht dann position:static) gibt folgendes im Browser aus:
Skizze 01: DIV-Schema ohne Position

Natürlich nicht so, hierbei handelt es sich um schematische Darstellungen. Grauen Hintergrund oder dunkelgrauen Rahmen haben wir im CSS nirgends definiert.


Position: relative
Das Bild eben bleibt so, auch wenn wir im CSS folgendes sagen:
#header, #footer {
  position:relative;
}


Relative Positionierung bedeutet, abhängig (also relativ) von anderen Elemente die noch vorhanden sind. Gibt man einem Element keine Position kommt das dem Wert "static" gleich. "Relativ" verhält sich prinzipiell genau so, es gibt jedoch noch einen kleinen Unterschied den ich gleich noch erläutern werden und zwar in Kombination mit "absolute".



Position: absolute
Geben wir beiden Elementen position:absolute; erhalten wir folgendes:
Skizze 2: Zwei DIVs bei position:absolute;

Huch! Wo ist denn das zweite DIV hin? Wir haben doch nichts am HTML geändert?!
Nun beide DIVs orientieren sich am darüber gelegenen Objekt. In diesem Fall den . Da wir keinem irgendwelche Top- oder Left-Angaben mitgegeben haben, befinden sich beide Elemente an der gleichen Position. Left:0 und Top: 0.

Das bedeutet sie befinden sich übereinander. Wir sehen das untere DIV ganz oben, da man sich das vorstellen muss wie mit Zetteln auf einem Tisch: Lege ich den ersten Zettel auf den Tisch und dann einen zweiten darüber, sehe ich oben den zweiten.

Manchmal sind solche Überlagerungen durchaus erwünscht, dann kann man mit der CSS-Eigenschaft z-index bestimmen, welcher höher liegt. Je höher der z-index, desto höher auch die Position des Elements. Höher bezieht sich aber nun auf die Z-Achse, also die Tiefe.

#header, #footer {
  position:absolute;
}
#header {
  z-index:10;
}

Jetzt wäre "Ich bin oben" zu lesen.

Bei Position:absolute wird fast immer auch mit Positionsangaben gearbeitet.
#header, #footer {
  position:absolute;
}

#header {
  top:0; left:0;
}

#footer {
  top:20px; left:10px;
}


Das sieht dann so aus:

Skizze 3: Absolute Positionierung mit konkreten Angaben

Übrigens, ich habe jetzt die DIVs länger gemacht, als sie eigentlich sind. Denn bei position:absolute verliert das DIV das ohne eine definierten Breite ja immer so breit ist wie das umliegende Elemente, jegliche Zuordnung und ist dann nur noch so breit wie sein Inhalt. Es sieht praktisch dann so aus wie display:inline - bleibt aber dennoch block.


Position: fixed
"Fixed" ist wie "absolute", mit dem Unterschied, dass es beim Scrollen weiterhin zu sehen bleibt. Ein Logo mit bottom:0; right:0; und position:fixed ausgerichtet ist immer in der unteren rechten Ecke zu sehen, auch wenn man scrollt. Dieser Wert wird vom Internet Explorer 6 nicht unterstützt.


Die Kombination aus absolute und relative
Jetzt wird es interessant! Wenn ich dem DIV position:absolute gebe und top:10px; left:10px setze, dann kann man sich durchaus die Frage stellen: Von wo denn 10 Pixel?

Die Antwort ist, wenn man nichts anderes definiert hat: Vom Rand der Website. Also von ganz links oben. Ein bottom:10px; würde übrigens nicht das untere Ende des Browsers als Basis nehmen, sondern das untere Ende der Website. Ist die Seite also noch nicht vorbei und man muss herunterscrollen werden die 10 Pixel von dem Ende der Website genommen.

Als Beispiel nehmen wir jetzt mal folgenden HTML-Code:
<div id="website">

    <div id="box1">Box 1</div>
    <div id="box2">Box 2</div>

</div>


und folgendes CSS:
#website {
  width:960px;
  height:500px;
}

#box1, #box2 { position:absolute; }

#box1 {
  top:10px; left:10px;
}

#box2 {
  bottom:10px; right:10px;
}


Das Ergebnis sieht so aus:
Skizze 4: Position:absolute hält sich nicht an Parent

Obwohl sich die beiden Boxen innerhalb von #website befinden werden sie mit position:absolute aus dem Raster gehoben und richten sich nun an den Website-Maßen ganz außen.

Wenn man das umgehen möchte und die Boxen sich innerhalb von Website mit 10 Pixel Abstand zum Rand befinden sollen, ist die Lösung einfach eine Kombination aus dem bisher verwendeten absolute und relative!

Wir ergänzen unser letztes CSS folgendermaßen:
#website {
  width:960px;
  height:500px;
  position:relative;
}
...


Der Rest bleibt identisch. Das Ergebnis sieht dann, so wie wir es wollten aus, nämlich so:
Skizze 5: Position Absolute mit Relative

Die Anwendungsgebiete für diese Technik sind groß. Möchte man zum Beispiel einen Artikel schreiben. Und in der letzten Zeile soll neben dem Text noch ein Drucken-Link folgen können wir das nicht anders lösen (außer garstige Tabellen zu nutzen).

Ein bottom:16px; (wenn die Zeilenhöhe z.B. 16 Pixel ist) würde ohne das "relative" am Ende der Website erscheinen. Gibt man aber dem DIV das um den Artikel liegt ein "position:realtive" und dem Link innerhalb des DIV ein "position:absolute; bottom:16px;" erhält man das gewünschte Ergebnis.

Egal wie lang der Artikel wird (das weiß man ja selten im Voraus) der Link befindet sich immer ganz unten. Diese Technik hat sich bewährt und ist die einzige, mir bekannte Möglichkeit so etwas mit CSS, ohne Tabellen umzusetzen.



Soviel mal zu den Möglichkeiten von Position in CSS. Wenn Ihr noch Ergänzungen, Links oder Fragen habt, nur her damit :)

]]>
Thu, 23 Jul 2009 17:17:51 +0100
Firefox 3.5 und Firebug 1.4 haben einen Bug http://www.professorweb.de/anwendungen/firefox-3.5-und-firebug-1.4.0-haben-einen-bug.html
Der Bug wurde in Firefox 3.5.2 behoben

"Web Development Evolved" lautet der Untertitel dieser wirklich göttlich anmutenden Erweiterung für den Firefox Browser. Der Slogan bedeutet soviel wie "Webentwicklung weitergedacht".

Die Rede ist von der Erweiterung Firebug, welche ausnahmslos jedem Webdesigner eine große Erleichterung sein dürfte, vor allem beim Debugging von Webseiten und JavaScripts.

Firebug 1.4.0 Screenshot

In der neuen Version von Firebug 1.4.0 die kurz nach Firefox 3.5 erschienen ist, scheint es jedoch einen kleinen aber relativ gravierenden Fehler zu geben, der das Arbeiten mit Firebug nahezu unmöglich macht.

Update: Der Fehler ist in Version 1.4.1 leider immer noch enthalten.



Die Ausgangssituation
Der Fehler wird verursacht durch für verschiedene Medien definierte Stylesheets. Ein Stylesheet kann je nach Medium, dass die Seite gerade aufruft verschiedenen definiert sein. So ist es bei mir z.B. üblich, dass ich spezielle Formatierungen verwende um die Seite beim Ausdrucken anders aussehen zu lassen, als auf dem Monitor.

Ein entsprechendes Stylesheet sähe z.B. so aus:
#website {
  background:red;
}

@media print
{
  #website {
    background:white;
  }
}

Das Element mit der id="website" wäre im Browser mit einem roten Hintergrund versehen und beim Ausdruck mit einem weißen. Dies ist nur ein Beispiel, was in dieser Form nun keine Anwendung finden dürfte - aber ich nutze die Technik ganz gerne um Content-unabhängige Elemente wie Header oder Footer beim Druck auszublenden.



Der Fehler
Firebug in der neusten Version zeigt, sobald man ihn aktiviert die Print-Variante an. Man sieht also erst die normale Website, aktiviert Firebug und auf einmal verändern oder verschwinden alle entsprechend formatierten Elemente.

So kann man natürlich nicht effektiv arbeiten. Hier mal eine Beispielseite bei der die Nutzung von Firebug zu dem Fehler führt.


Die Lösung
(zum Update)
Es gibt zwar ein Workaround, doch das ist recht impraktikabel: Die Print-Definitionen im Stylesheet für den Zeitraum der Entwicklung der eigentlichen Seite auskommentieren.

Also so:
#website {
  background:red;
}

/* @media print
{
  #website {
    background:white;
  }
} */


So interpretiert Firebug nun nur noch den tatsächlich gültigen CSS-Code und lässt die Kommentare als solche links liegen.



Alternativen?
In meinem Beispiel hänge ich die Print-Definitionen unter das normale Stylesheet. Bisher war dies auch nirgends ein Problem - auch Firefox 3.5 ohne aktiviertem Firebug interpretiert den Code einwandfrei. Gegebenenfalls (das habe ich jetzt aber nicht ausprobiert) reicht die Aufteilung von Screen- und Print-Definition in zwei Dateien mit einem entsprechend definiertem Aufruf im HTML:

<link rel="stylesheet" media="screen" href="screen.css" type="text/css" />
<link rel="stylesheet" media="print" href="print.css" type="text/css" />


Wenn Ihr hier Erfahrungswerte habt, würde ich mich über einen kurzen Kommentar freuen.

Ansonsten bleibt nur Abwarten und Tee trinken, bis eine neue Version von Firebug veröffentlicht wird, die den Fehler entsprechend behebt.


Die Entwickler sagen,...

dass in Version 3.5.2 von Firefox der Fehler behoben sein wird. Noch ist diese Version nicht draußen, d.h. bis dahin müssen wir noch etwas Tee trinken und warten.

Link: Firebug Issue #2141


Update: Eine weitere Alternative
So eben ist mir eine weitere Alternative eingefallen, die auch wunderbar funktioniert. Dieser Bug scheint erst ab der Beta 7 von Firebug 1.4.0 aufzutreten. Da man sich auch vergagene Versionen installieren kann empfiehlt es sich solange es kein neues Update gibt auf eine Beta-Version zurückzuspringen.

Ich bin mal alle durchgegangen. In der Beta 5 war der Fehler noch nicht, in der Beta 7 schon. Das heißt, einfach die Beta 5 installieren und produktiv arbeiten können.

Download: Firebug 1.4.0 Beta 5

Diese Beta-Version sieht noch etwas anders aus als die endgültige Fassung, aber man kann dennoch wunderbar damit arbeiten. Der Fehler tritt zwar immer noch vereinzelnt auf, jedoch ist er mit einem Refresh (F5) der Website wieder behoben.


Letztes Update: Fehler in Firefox 3.5.2 und Firebug 1.4.1 behoben
Wie die Entwickler über Google Code schon mitgeteilt haben, ist in dem kürzlich erschienenen Firefox Update 3.5.2 dieser Fehler behoben. Auch andere kleine Darstellungsfehler wie das Verschwinden von CSS-Attributen wenn man sie verändert, wurden behoben. Damit ist dieser Artikel mehr oder weniger hinfällig :)


Übrgens...
Auch neu ist, dass sich Firebug automatisch in Popups und neuen Fenstern öffnet, die von der gleichen Seite kommen wie der, auf der schon Firebug geöffnet ist. Das kann man aber glücklicherweise abschalten. In den Optionen bzw. Einstellungen einfach den Haken bei "URLs mit gleicher Herkunft aktivieren" raus nehmen. Dann wird Firebug wieder für jedes Fenster separat gehandlet.

Denn es ist nervig, wenn ich auf einer Website Firebug im Einsatz habe und in einem anderen Fenster im CMS ein Popup öffne um z.B. ein Bild hochzuladen, welches dann erstmal komplett von Firebug überlagert wird. ]]>
Tue, 21 Jul 2009 14:22:49 +0100
YouTube stellt den Internet Explorer 6 Support ein http://www.professorweb.de/internet/youtube-stellt-den-internet-explorer-6-support-ein.html
Momentan kursieren drei Versionen des Internet Explorers im Internet herum. Zwischen IE6 und IE8 ist alles vertreten. Während der IE8 erst einige Monate alt ist hat der Internet Explorer 6 schon knapp 8 Jahre auf dem Buckel. Updates im IE6 gibt es kaum und wenn sind sie sicherheitstechnischer Natur.

Verständlich das ein so alter Browser mit "neuen" Standards nicht unbedingt zurecht kommt. Diese Tatsache, kostet jedem von uns wertvolle Zeit, da wir teilweise Extrawürste für den IE entwickeln müssen um die Darstellung der Website dort erst möglich zu machen.



Google macht was dagegen!
Google ist mit seinen Diensten das größte Unternehmen in Internet und ist damit natürlich richtungsweisend. Der weltweit bekannteste und beliebteste Video-Streaming-Dienst YouTube dient nun als erste Aktion den alten Internet Explorer 6 aus der Welt zu schaffen.

Folgender Hinweis erwartet den IE6-Nutzer auf der YouTube-Website:

YouTube Hinweis für Internet Explorer 6 Nutzer
Hinweis: Ich habe diesen Screenshot grafisch etwas abgeändert um die Darstellung zu optimieren.

Dieser Hinweis ist das erste, was den Besucher der YouTube-Website unterhalb der Suchleiste über die komplette Breite der Website erwartet - jedoch nur dann, wenn man den IE6 als Browser nutzt. Eine emulierte Internet Explorer 6 Version (die parallel mit anderen Versionen installiert wurde) funktioniert hier nicht. Der Netrenderer bietet da aber eine entsprechende Alternative.



Das Mittel zum Zweck
YouTube, dass mit seinen enormen Zugriffszahlen einer der führenden Seiten im Internet sein dürfte erreicht extrem viele Menschen - vor allem privat.

Um mal eine Größenordnung von YouTube zu nennen: Jede Minute werden bei YouTube 10 Stunden Videomaterial hochgeladen. Dies schreibt Google selbst im YouTube Fact Sheet (englisch).


Als Vorreiter im Internet hat Google auf YouTube etwas geschaffen, dass viele andere als Vorlage nehmen dürften um ähnliche Maßnahmen durchzuführen.

Auch die neue ProfessorWeb Seite möchte ich ohne IE6-Support veröffentlichen - wo, wenn nicht bei den Webdesignern :-)



Was heißt das für uns?
Für uns Webdesigner und Webentwickler ist dies eine frohe Nachricht, denn endlich hat der IE6 seinen Todesstoß erhalten und das nicht nur mit einem kleinen Dolch, sondern direkt mit der dicken Keule.

Während die Nutzer auf andere Versionen vom IE oder gar andere Browser umsteigen, sinkt der Verbreitungsgrad des IE6 und irgendwann ist er so wie schon der Internet Explorer 5.5 vernachlässigbar in der Erstellung von Internetseiten.

Für mich heißt das übrigens auch, dass ich keine Artikel mehr verfasse welche Lösungen bei welchen Interpretationsproblemen des IE6 anwendbar sind. Und kleine Hass-Artikel des IE betreffend werden (so hoffe ich) auch weniger werden ;-)


Fazit
Insgesamt ist dies eine sehr gute Nachricht. Ich bin gespannt wer noch auf den Zug springt und damit den IE6 in die wohlverdiente Rente schickt.


Heise.de: YouTube stellt Unterstützung für Internet Explorer 6 ein

Tool um YouTube-Website als IE6-Nutzer anzeigen zu lassen:
Netrenderer


Danke Tim, für den Hinweis zur Heise-News.
]]>
Wed, 15 Jul 2009 12:42:05 +0100
Min-Height: Die mindest Höhe und ihre Probleme http://www.professorweb.de/css/min-height-die-mindest-hohe-und-ihre-probleme.html
Height gibt eine feste Höhe an. Das Element ist also immer so hoch, egal wie viele Inhalte darin sind. Sind es mehr, bleibt die Höhe des umschließenden Elementes aber konstant, was teilweise nicht so hübsch aussehen kann.



Dafür gibt es in CSS die min-height Eigenschaft.
Sie gibt keine fixe Höhe vor, sondern beschreibt wie hoch ein Element mindestens sein darf.

So könnte der CSS-Code oder grauen Box aussehen:
.box {
  background:#EDEDED;
  border:1px solid #DEDEDE;
  padding:5px;
  width:120px;
  min-height:100px;
}


Die Breite der grauen Box ist immer 130 Pixel (120 Pixel breite + (2x 5 Pixel Innenabstand links und rechts)). Die Höhe jedoch ist nun flexibel. Sie ist mindestens 110 Pixel hoch und nach oben hin offen, je nach Inhalt.

Ist eine solche Box z.B. nur eine Zeile hoch kann das ziemlich unschön aussehen, daher ist ein solcher Befehl ziemlich praktisch.


Problem im IE6
Der Internet Explorer 6 kennt min-height gar nicht. Das CSS-Attribut height wird im IE6 so verwendet wie in allen anderen Browsern die min-height. Das führt somit unweigerlich zu Konflikten, wenn man keine browserspezifische Anweisungen gibt. Nachfolgend drei Lösungsansätze:



1. Min-Height durch Height mit Unterstrich
Diese Verfahrensweise nutzt mein geschätzter Kollege Sven gerne (dem ich auf diesem Weg zum bestandenen Fachinformatiker/Anwendungsentwickler gratulieren möchte :D), von dem ich auch von dieser Variante erfahren habe.

Man fügt dem CSS etwas hinzu:
.box {
  background:#EDEDED;
  border:1px solid #DEDEDE;
  padding:5px;
  width:120px;
  min-height:100px;
  _height:100px;
}


Jetzt könnte man denken: "Whoo, ein neues Feature in CSS? Der Unterstrich _",
doch tatsächlich ist es einfach ein Fehler.

Ein Fehler der jeden Browser (außer den IE6) dazu veranlasst diese Zeile komplett zu ignorieren. Der Internet Explorer 6 hingegen ignoriert in diesem CSS-Beispiel den min-height (weil er den Befehl nicht kennt) und nutzt stattdessen munter den Height-Befehl da ein voranstehender Unterstrich (_) wohl keine Syntax-Verletzung darstellt.

Height wird im IE6 ja ebenso interpretiert wie in allen anderen Browsern die Min-Height-Eigenschaft, daher kommt man so zu einem einheitlichen Ergebnis in allen Browsern.


2. Verschiedene CSS-Dateien für den Internet Explorer
Dank den hier beschriebenen Conditional Comments oder einer einfachen PHP-Funktion ($_SERVER['HTTP_USER_AGENT'] und get_browser()) kann man je nach verwendetem Browser individuelle Inhalte darstellen. So kann man auch eine spezielle CSS-Datei für den IE6 zusätzlich laden in der folgendes steht:
.box {
  height:100px;
}


So hat man keinen syntaktischen CSS-Fehler provoziert und kommt zum selben Ergebnis.



3. Das Element .minheight
Ich persönlich verwende in meinen Projekten eine Variante, die vielleicht etwas umständlicher, dafür syntaktisch sowie logisch einwandfrei ist.

Ich füge in die Box ein Element mit einer CSS-Klasse (.minheight) und gebe diesem Objekt die Breite 1 Pixel und die Höhe x Pixel, wobei x für die gewünschte Mindesthöhe steht.

Dieses Element muss immer als erstes in der Box erscheinen. Der HTML-Code sieht dann so aus:
<div class="box">
  <div class="minheight"></div>
  Inhalte der Box
</div>


Das passende CSS so:
.box .minheight {
  float:right;
  height:100px;
  width:1px;
}


Bei der Verwendung des Float-Befehls sollte man aber auch daran denken, es mit clear:right; entsprechend wieder aufzuheben ;-)

Diese Lösung hat zwei Nachteile:
1. Sie ist umständlicher
2. Sie nimmt ein Pixel Platz in unserer Box weg. Wer darauf Wert legt sollte zu einer der anderen beiden Lösungen tendieren.


Fazit
Drei verschiedene Lösungen, mit jeweils einem ganz eignem Charme. Ich persönlich empfehle für die Sauberkeit die zweite oder dritte Lösung. Wenn es schnell und schmerzlos gehen muss, auch mal die erste Variante.

Dies alles ist nur für den Internet Explorer 6 nötig. Wenn sein Marktanteil mal auf ein verschwindend geringes Prozentpünktchen geschrumpft ist, sind solche Tricksereien nicht mehr notwendig. ]]>
Mon, 29 Jun 2009 11:44:24 +0100
Master Plan - Über die Macht von Google http://www.professorweb.de/surftipps/master-plan-uber-die-macht-von-google.html
Die Website um das Video "Master Plan - About the power of Google" beschreibt kurz, prägnant und sehr anschaulich was Google macht und warum unsere Privatsphäre dadurch gestört wird.



Besonders hervorheben möchte ich die Aufmachung des Videos, wirklich sehr anschaulich mit netten Effekten und 3D-Animationen. Die unterschwellige Musik erinnert ein wenig an die "Umbrella Corporation" aus der Filmreihe Resident Evil.

Der Film darf zum Nachdenken anregen.





Hier geht es zur Website des Videos, dort kann es auch herunter geladen werden:

Master Plan - About the power of Google ]]>
Fri, 26 Jun 2009 22:53:43 +0100
Wenn Internetfirmen Blogs akquirieren http://www.professorweb.de/sonstiges/wenn-internetfirmen-blogs-akquirieren.html
Heute erreichte mich mal eine für mich ganz neue Anfrage zum Thema "Gastbeiträge". Über mein Kontaktformular schrieb mir eine nette Damen folgendes:

Hallo Herr ,

ich bin  Mitarbeiterin der ******** Gmbh und im Moment auf der Suche nach interessanten Themenblogs zum Thema Webdesign etc. Dabei bin ich auf Ihre Website gestoßen und möchte hiermit anfragen, ob Sie prinzipiell an Fachbeiträgen von Gastautoren interessiert wären. Im Gegenzug würden wir in einem solchen Beitrag einen Link auf unsere Seite www.*******.de platzieren. Bei Interesse würde ich mich über weiteren Kontakt freuen!

MFG
****

Die Sternchen sind auskommentiert, das "Hallo Herr ," ist 1:1 übernommen.

Man kann sich Mühe geben neue Partner für sich zu gewinnen... - muss man aber nicht.

Fairerweise muss ich aber hinzufügen, dass der Ruf der Firma ihr vorauseilt, was ein weitere Grund war diese Offerte sofort auszuschlagen.



Mein persönlicher Tipp:
Wenn die Werbung offensichtlich einem "Serienbrief" ähnelt, die Sache eher skeptisch betrachten. Man kann daraus schließen, dass wie so oft die Masse für den Anbietenden ausschlaggeben ist - und wer will schon einer von vielen sein? Gerade in einem Gebiet, in dem die Individualität eigentlich groß geschrieben werden sollte.

Dann verzichte ich doch lieber auf den "wertvollen" Backlink und habe dafür einen kleinen Artikel mehr im Repertoire =D

]]>
Mon, 22 Jun 2009 20:28:34 +0100