Archiv:

Latest photoblog

photoblog

Blog » Webdev

Listenpunkte rechtsbündig machen

Vielleicht interessiert es ja den Einen oder Anderen, mir hätte das aber gerade einige Minuten Arbeit gespart. Arbeit, ja, und das am Samstagabend …

Wer Listen schonmal mittels text-align: right; rechtsbündig ausgerichtet hat, wird wohl gemerkt haben das der Bulletpoint ganz nervig auf der linken Seite bleibt. Wenn man jedoch auch den Aufzählungspunkt auf der rechten Seite haben möchte, kommt man mit ul {text-align: right; direction: rtl;} zum gewünschten Ergebnis.

Vertikal zentrierte Seiten mit CSS

Ebenfalls ein Unding aus »vergangenen Zeiten mit Tabellenlayouts«, ist die Angewohnheit eine Seite, unabhängig von ihrer »realen« Höhe, stets vertikal zentriert darstellen zu wollen. Semantisches XHTML schiebt dem jedoch einen Riegel vor, da sich XHTML an XML orientiert und es somit keine absolute Seitenmitte, sondern lediglich noch übergeordnete Elemente gibt. Von daher ist es nahezu unmöglich, eine Seite die in der Höhe variabel ist, mit einem immer gleichen Stylesheet stets vertikal zentriert zu bekommen.

Für Seiten mit fixer Höhe gibt es mittlerweile einige Workarounds. Beispielsweise ist es möglich, die Seite absolut 50% vom oberen Browserrand zu positionieren, und anschließend mittels negativen Margin auf die Seitenmitte zu bringen. Diese Variante ist allerdings nur bedingt geeignet, da die Seite, wenn das Browserfenster zu klein skaliert wird, aus dem oberen Bildrand heraus geschoben wird. Auf eine sehr viel bessere Variante bin ich vor einiger Zeit im Netz gestoßen.

Während man horizontale Zentrierung in der Regel einfach mittels margin: auto auto; erreichen kann, bedarf es bei der vertikalen Zentrierung wie gesagt einiger Nachhilfe. Wem der Code genügt, und auf die Erklärung verzichten kann, schaut sich vorab die kommentierte Demo an.

Wie auch schon in der Erklärung für 100 % Höhe mit festen Footern (Einmal Erdgeschoss bitte), ist es auch hier anfangs von Nöten, 100 % Höhe auf html und body anzuwenden. Ansonsten geht der Browser nicht vom kompletten Viewport aus (also dem im Browserfenster sichtbaren Bereich der Seite).

html, body {
    height: 100%;
    margin: 0; // wichtig für Firefox, IE, Safari & Co
    padding: 0; // wichtig für Opera
}

Der nächste, wohl wichtigste Punkt, ist leider nicht gerade der semantisch korrekteste, aber wie dies in CSS-Layouts oft der Fall ist, geht es nicht wirklich ohne; wir benötigen nun 2 aufeinanderfolgende Elemente, in meinem Beispiel nehme ich 2 divs:

Das div #abstand regelt später den Abstand vom Inhalt zum oberen Browserrand, #inhalt steht logischerweise für den Seiteninhalt.

Da diese Methode wie anfangs erwähnt nur für Seiten mit fixierter Höhe zu gebrauchen ist, sollten wir wissen wie hoch unser Seiteninhalt am Ende sein wird. Von dieser Höhe hängen die Werte ab, die wir später in der Deklaration des #abstand-div benötigen. Ich habe mich in meinem Beispiel komplett auf Angaben in em beschränkt, um zu demonstrieren, dass diese Methode problemlos skalierbar ist.

Wir definieren also eine feste Höhe für den Inhalt (ich habe mich hier für 28em entschieden), als Höhenangabe für den #abstand definieren wir anschließend 50%, also die halbe Höhe des sichtbaren Bereiches im Browserfenster (Viewport). Da sich der Inhalt unter dem Abstand befindet, liegt die obere Kante von #inhalt nun genau bei 50% des Viewports. Durch einen negativen unteren Margin beim #abstand, der exakt die halbe Höhe des #inhalt-divs betragen sollte, wird der Inhalt nun soweit nach oben »gezogen«, dass sich dieser jetzt in der Mitte befindet:

#abstand {
    height: 50%; 
    margin-bottom: -14em; 
    width: 1px;
}
 
#inhalt {
    height: 28em; 
    margin: auto auto; 
}

Schauen wir uns diesen Code in Livedemo 1 an, sehen wir das wir dem gewünschten Endergebnis schon mal sehr nahe sind. Allerdings wird der Inhalt immer noch nach oben aus dem Browserfenster heraus geschoben, sobald wir das Browserfenster kleiner ziehen. Diesen unerwünschten Fehler korrigieren wir nun mit nur zwei kurzen Zeilen im CSS.

Durch die Höhenangabe von 50% in #abstand wird diese jetzt relativ am Browserfenster ausgerichtet. Sollte diese 50%-Höhe nun kleiner werden als die -14em die wir als margin-bottom deklariert haben, wird der Inhalt natürlich höher eingezogen als das Browserfenster hergibt. Um dies zu umgehen, reicht ein simples float: left in #abstand, sowie ein clear: left in #inhalt. Den Elementen wird nun beigebracht, dass #inhalt wie bisher unterhalb von #abstand bleiben, jedoch nicht weiter hochgezogen werden soll wenn #inhalt an die obere Browserkante stößt. Schlussendlich sieht unser komplettes CSS also wie folgt aus:

html, body {
    height: 100%;
    margin: 0;
    padding: 0;
}
 
#abstand {
    float: left; 
    height: 50%; 
    margin-bottom: -14em; 
    width: 100px;
}
 
#inhalt {
    clear: left; 
    height: 28em; 
}

Nun kann das Browserfenster frei skaliert werden, der Inhalt befindet sich stets in der Mitte, wird jedoch auch bei zu kleinen Browserfenstern nicht mehr aus dem Viewport hinausgeschoben. Anschauen kann man sich dies in der finalen Livedemo 2.

Getestet habe ich dies allerdings nur im Firefox 1.0.7 (Win/Linux), Opera 8 (Win), IE6 (win) und im Konqueror (Linux). Andere Browser und Systeme standen mir leider nicht zur Verfügung.

Pavatar – Personal Avatar

Etwas großes hat Jeena vor wie ich gerade seinem Weblog entnehmen konnte: Einen Avatar-Service ähnlich gravatar.com. Dieser Service glänzte in letzter Zeit wohl eher durch nicht-Erreichbarkeit als durch alles andere.

Abhilfe schaffen soll dort Pavatar, die Bildchen werden dort nicht zentral auf einem Server gespeichert, sondern dezentral auf dem Server des kommentierten Blogs. An und für sich find ich die Idee sehr lobenswert und gut, weswegen ich auch hier darüber schreibe, durchgelesen habe ich mir die Spezifikation (welche wie ich belustigt feststellte sehr an das w3c angelehnt ist) noch nicht genauer, werde ich aber auf jeden Fall auch noch nachholen.

Wenn mich das ganze dann überzeugt werde ich mal schauen ob es mir die Zeit erlaubt ein WordPress Plugin zu schreiben, sofern das bis dahin nicht schon irgendwer anders getan hat.

Mehr dazu bei Jeena direkt. Viel Erfolg.

Web Essentials 05

So, nun muss auch ich was drüber schreiben. Dürfte zwar mittlerweile zu jedem vorgedrungen sein, aber nun möchte ich das Thema auch einmal kurz auffassen.

Ende September fanden in Sydney die Web Essentials 05 statt. Es wurden Vorträge von einigen bekannten Leuten über Webstandards, Usability, und das Web allgemein abgehalten. Diese Vorträge kann man sich auf der Seite zu den Essentials als Podcast runterladen. Zusätzlich zu allen Podcasts gibt es die jeweiligen Präsentationsslides zum mitlesen.

Habe mir gerade den Beitrag von Tantek Çelik über »The Elements of Meaningful XHTML« angehört, und muss sagen, eine super Sache. Sollte sich jeder der sich mehr oder weniger eingehend mit dem Thema befasst einmal zu Gemüte führen.

Zu finden sind die Podcasts unter http://we05.com/podcast

Ins Gedächtnis zurückgerufen wurde das ganze gerade dank Jens.

Ein Weblog in 15 Minuten …

Wer einmal sehen möchte wie man ein Weblog mit den allen nötigen Funktionen in gerade mal 15 Minuten codet, sollte sich mal dieses Video anschauen:
http://www.rubyonrails.com/media/video/rails_take2_with_sound.mov (Achtung, viele MB!)

Habe mich heute das erste Mal ein wenig genauer mit Ruby on Rails auseinandergesetzt. Muss sagen, ich bin echt begeistert. Gerade nach diesem Video. Hätt’ der Tag doch bloß 48 Stunden …

Addslashes in WordPress entfernen?

Kann mir jemand verraten wie ich bei dem Posting hiervor, bzw bei WordPress generell, diese escapeten Hochkommas so bekomme das die nich mehr escaped werden? Gibts da nen Hack? Ich will jetzt ungern selbst den WordPress-Codedschungel durchsuchen.

Einmal Erdgeschoss bitte!

Früher … Als man noch Tabellen benutzte um Internetseiten zu erstellen, war es an der Tagesordnung, dass eine Seite die volle Browserhöhe einnahm, und die Fußzeile es sich am unteren Bildrand bequem machte. Möglich war dies mittels <table height="100%"> und valign="bottom".

Seit CSS ist dies nicht mehr so ohne weiteres möglich, da es keine direkte Möglichkeit gibt ein Element in einem anderen unten-bündig auszurichten. Zwar existiert die Eigenschaft vertical-align: bottom;, dieses ist allerdings nur auf Text in inline-Elementen (also etwa <span><a><label> …) anwendbar. Um beispielsweise ein <div> unten bündig zu bekommen, bedarf es da schon einiger kleinerer Tricks.

Die Methode welche ich hier vorstelle, würde ich nicht als die semantisch Korrekteste bezeichnen, funktionierte bei meinen Tests jedoch in allen gängigen Browsern der neuen Generation – und auch im Internet Explorer 6 nahezu fehlerfrei. Lediglich Opera 8 hatte seine Problemchen beim Skalieren des Browserfensters. Hier musste die Seite nach dem Skalieren neu geladen werden. Ein Fehler über den man denke ich hinwegsehen kann.

Um 100 % Höhe und eine am unteren Browserrand positionierte Fußzeile zu ermöglichen, müssen zunächst einige Grundvoraussetzungen gegeben sein:
für die Elemente <html>, und <body> muss eine Höhe von 100% deklariert werden, da das <div> in welchem sich später die Fußzeile befindet sich auf die volle Höhe ausbreiten kann. Das <body>-Element muss zusätzlich ein margin: 0; (für IE, Firefox und Co) und ein padding: 0; (für Opera) erhalten, da der browserseitige Rand zur 100 % Höhenangabe dazugerechnet würde:

html, body {
    height: 100%;
}
body {
    margin: 0; padding: 0;
}

Soweit so ungewöhnlich. Kommen wir zum Markup:
Zunächst benötigen wir ein <div> in welches wir später die Fußzeile packen. Die Breite dieses divs kann variabel sein, der Wert für die Höhenangabe muss jedoch <em>mindestens 100%</em> betragen. Entscheidend dafür, dass wir innerhalb des #wrapper-div ein Element absolut nach unten ausrichten können, ist die Angabe einer Positionierungsart:
<div id="wrapper"></div>

#wrapper {min-height: 100%; position: relative;}

Da der Internet Explorer min-height nicht interpretiert, deklarieren wir für diesen nach den obigen Angaben zusätzlich:
* html #wrapper {height: 100%;}

Nun können wir innerhalb des Seiten-umschließenden divs die Fußzeile einfügen. Diese kann frei innerhalb des #wrapper platziert werden, am nahe liegendsten ist jedoch natürlich unten:

<div id="wrapper">
 Lorem Ipsum is simply dummy text of the printing
 and typesetting industry. Lorem Ipsum has been 
 the industry's standard dummy text ever since
 the 1500s, when an unknown printer took a galley 
 of type and scrambled it to make a type specimen book.
 <div id="footer">
  Erdgeschoss
 </div>
</div>

Testen wir dies, sehen wir (Livedemo 1), dass sich die Fußzeile nun zwar logischerweise unter dem Text befindet, jedoch nicht am unteren Bildschirmrand. Jetzt kommt das zweite Mal die Eigenschaft position zum Zuge: Wir positionieren die Fußzeile absolut am unteren Nullpunkt des sichtbaren Seitenbereiches (Viewport):
#footer {position: absolute; bottom: 0; left; 0;} – Schwupps: Text, darunter Fußzeile die sich am unteren Bildschirmrand befindet. Haben wir also schon fast das gewünschte Ergebnis.

Fast? Ja, zum Einen nimmt die Fußzeile nun nicht mehr die volle Breite des Eltern-Elements (hier: #wrapper) an. Das können wir ganz einfach lösen mittels #footer {width: 100%;} .

Zum Anderen wird es problematisch, wenn der Text länger wird als 100% der Seitenhöhe, dann nämlich, wird der Text vom Footer vom Fließtext überlagert. (Livedemo 2) Abhilfe gibt es hier auf verschiedene Wege. Sicherlich würde es bei einer einzeiligen Fußzeile fürs erste reichen, ein <br /> ans Ende des Textes zu setzen. Nur was tun, wenn die Fußzeile dann von einer, auf zwei Zeilen erweitert wird, oder ein padding bekommt?. <br /><br /> ? Pfui!

Ich habe mich für die Variante entschieden, bei dem ich den Text in einen weiteren Container packe, welchen ich mit einem margin-bottom versehe. Dies sähe in diesem konkreten Fall dann so aus:

<div id="wrapper">
 <div id="content">
  Lorem Ipsum is simply dummy text of the printing
  and typesetting industry. Lorem Ipsum has been 
  the industry's standard dummy text ever since
  the 1500s, when an unknown printer took a galley 
  of type and scrambled it to make a type specimen book.
 </div>
 <br style="clear: left;" />
 
 <div id="footer">
  Erdgeschoss
 </div>
</div>

#content {margin-bottom: 1.5em; float: left;}

So bleibt der Inhalt stets x[=Wert für margin-bottom] — y[=Höhe Fußzeile] von der Fußzeile entfernt.

Wer sich das ganze einmal in Live anschauen möchte, der klickt ein wenig hier im Weblog herum, oder schaut sich die finale Demo an.

google RSS-Reader

Generell braucht google nur etwas ankündigen, und in jedem zweitem Fachblog liest man etwas darüber. Diesmal sorgt google mit seinem RSS-Reader für Aufsehen. Ich habe die Sache, trotz sehr großer Skepsis gegenüber Online RSS-Readern, einfach mal getestet. Und ich muss sagen ich bin sehr positiv überrascht. Wie man es von google kennt, ist die ganze Sache wieder sehr AJAX-lastig, aber absolut simpel und in meinen Augen einfach nur gut gelöst.

Der einzige Nachteil den ich auf Anhieb gesehen habe ist, das alles ein wenig länger zum Laden braucht, da natürlich nichts gecached wird wie bei Offline Readern (was aber bei einer einigermaßen schnellen Internetleitung nicht allzu sehr ins Gewicht fallen sollte). Nach google-Talk, welches mich bisher garnicht überzeugen konnte, ist der google Reader auf jeden Fall mal wieder ein kleines Highlight im stetig wachsenden google-Portfolio.

Achtung, Spam-Prävention

Wie neulich hier erwähnt werde ich im Moment ziemlich häufig von Spambots heimgesucht. In den letzten 3 Tagen insgesamt über 200 Kommentare. Langsam reicht es mir. Da ich mit Captchas immernoch auf Kriegsfuß stehe, habe ich mich mal ein wenig nach Alternativen umgesehen.

Auf www.wp-plugins.net bin ich dann auch (hoffentlich) fündig geworden: »Owens Spam Action«, und »Bad Behavior« heißen die beiden Plugins die von nun an Ihren Dienst verrichten. Da ich schlecht alles alleine testen kann, biete ich Euch nun exklusiv hier die Möglichkeit, hemmungslos diesen Beitrag voll zu spammen, und mir danach, wenn Ihr so nett seid, zu berichten wieviele Eurer Kommentare »gefressen« wurden.

Wer noch andere gut funktionierende Alternativen gegen Spam hat, für WordPress 1.5, der schreibe mir dies bitte ebenfall als Kommentar, oder per eMail ;)

Immer nerviger werdender Spam

Spambots gehen mir ja eigentlich schon länger an einem gewissen, auf der hinteren Seite meines Körpers befindlichen Körperteil vorbei. Dachte ich bisher. Wenn über Nacht mal 30 neue Kommentare sind, klick ich einmal »Alle als Spam markieren«, moderieren, und gut is’. Seit 2 Wochen bekomme ich aber permanent Spam, der mir mal richtig derbe auf den Sack geht. Und zwar kommt der Spam erstmal vereinzelt rein (was dank Blacklist eigentlich auch kein allzugroßes Problem wäre), und die Spams sind absolut sinnlos. Es werden einfach wahllos irgendwelche Weblogs verlinkt. Kein Poker, kein Viagra, kein Paris Hilton. Nein, einfache dämliche Kommentare wie »brilliant site! happy to be here.« oder »Very informative site. Good job.«.

Neulich habe ich irgendwo gelesen das ein Angriff der Spammer auf zentrale Blacklists dahinterstecken soll. Weiß da jemand mehr drüber? Es ist einfach absolut nervig wenn man alle 1-2 Stunden eine eMail bekommt, denkt das wäre die eMail auf die man eh schon den ganzen Tag wartet, die Arbeit unterbricht, und dann ists lediglich mal wieder ein Hinweis von WordPress das sich ein Kommentar in der Moderation befindet.

Hier mal ein kleiner Einblick in die Anzahl der Kommentarspams alleine aus den letzten 10 Tagen:
Grafik: PHPMyAdmin, Spamkommentare

Gibt es immernoch keine neuen Anti-Spam-Methoden um diesen nervigen Dingern ein für alle mal (vorläufig) den Gar aus zu machen? Wenn doch, immer gerne her mit den Links!