Clean CSS for Various Browsers with Conditional Comments

I was asked if I could explain a comment I left on 10 best CSS practices to improve your code on Webdesigner Depot some months ago.

The suggestion there was…

10. Keep a tidy house

Separate browser-specific CSS to its own individual style sheet, and include as needed with Javascript, server-side code or conditional comments. Use this method to avoid dirty CSS hacks in your main style sheets. This will keep your base CSS clean and manageable.

and I added…

I prefer to have all “browser tweaks” in the main CSS file, too. I use conditional comments to add a DIV around the whole page content identify IE browsers and then have…

.ie6 h1 {font-size: 20px} /* just an example */

… in the CSS file especially for IE6 tweaks.

Conditional comments allow you to have HTML in your page which is only visible to Internet Explorer or even only to Internet Explorer if it has a specific version.

By writing this you could load a CSS File only if the page is loaded in Internet Explorer 6:

<!--[if IE 6]>-->
<link rel="stylesheet" type="text/css" href="ie6.css" />
<![endif]-->

So if you follow rule 10 on Webdesigner Depot, you end up having several different CSS files which have almost the same content. But that means, that if you change something, you’ll have to apply those changes to every CSS file – and if you forget one of the files, users with a specific browser version will get a broken layout.

My suggestion is to stay with just one (slightly bigger) CSS file and have all those minor browser tweaks in there – in a clean way, not with CSS hacks.

...

<!--[if lte IE 6]><div class="ie6"><![endif]-->
<!--[if IE 7]><div class="ie7"><![endif]-->
<!--[if IE 8]><div class="ie8"><![endif]-->
... do your html here
<!--[if IE 8]></div><![endif]-->
<!--[if IE 7]></div><![endif]-->
<!--[if lte IE 6]></div><![endif]-->


You’ll end up with a „full page container“ of the Internet Explorer version as class. Now, if you need some specific code for one version of IE, you can just say so in your CSS:

/* All other browsers */
div.box {height: 94px; width: 194px; padding: 2px; border: 1px solid red;}

/* Internet Explorer 6 */
.ie6 div.box {height: 100px; width: 200px; border: 1px solid green;}

Note that „padding: 2px“ is not overwritten and also applies to IE6. So if you decide to go to 3 pixels it’s just one location to change that.

There might be cases where you are better off with a seperate CSS for every browser – especially for pixel-exact designs. But in my experience it’s just small tweaks for old browser versions to fix major problems.

This approach has worked for me for some years now. Just give it a try and see yourself if you like it 🙂

(BTW: It would be nice to see some other browsers to support conditional comments, too. They are just „tweaks“, but they are quite helpful.)

Die eigene Webseite als OpenID Identifier

Ich bin momentan dabei, mich in die OpenID Thematik einzuarbeiten. Die Idee dahinter ist so einfach wie genial: Nur noch ein einziger Login, also nur noch ein einziges Passwort, für alle Webseiten. Um sich bei beliebigen Webseiten einzuloggen wird man dazu zu einer persönlich ausgewählten Seite weitergeleitet, bei der man sich mit seinem Username und seinem Passwort einloggt. Diese kommuniziert dann im Hintergrund mit der Webseite, auf der man sich einloggen möchte, und schon kann man dort aktiv loslegen.

Die Vorteile sind eindeutig: Für die User bedeutet das nur noch ein einziges Passwort, das man sich merken muss. Für die Webseiten-Betreiber, auf deren Seite man sich einloggen muss (Relying Party), entfällt das Thema „Passwort-Sicherheit“, das momentan nur durch das teure Bezahlen eines SSL-Zertifikats für die Webseite sicherzustellen war. Die Verschlüsselung übernimmt die Webseite, die die Passwort-Prüfung übernimmt, der OpenID Provider.

Ich habe als meinen primären OpenID Provider Yahoo gewählt. Wer einen Yahoo-Account hat, der bekommt auf Wunsch automatisch eine OpenID.

Allerdings möchte ich mich nicht überall mit „https://me.yahoo.com/USERNAME“ einloggen, sondern fände es schicker, statt dessen die Adresse einer meiner persönlichen Webseiten nutzen zu können. Gar kein Problem.

Alles, was man tun muss, um eine beliebige URL als OpenID-Kennung zu nutzen, ist in den Header der entsprechenden Seite folgende zwei Tags einzubauen:

<link rel="openid2.provider openid.server" href="https://open.login.yahooapis.com/openid/op/auth" />

<link rel="openid2.local_id openid.delegate" href="https://me.yahoo.com/USERNAME" />

Die openid2.local_id ist die Kennung, die man vom OpenID Provider bekommen hat, also die ID, mit der man sich sonst einloggen würde.

Den openid2.provider findet man heraus, indem man diese URL im Browser aufruft und sich den Quelltext der Datei anschaut und dort den openid2.provider herausliest. Für Yahoo ist dies der eben genannte „https://open.login.yahooapis.com/openid/op/auth“.

Andere OpenID-Provider findet man auf der offiziellen Webseite oder auch bei Wikipedia aufgelistet: List of OpenID providers bzw. OpenID.

Druckst du Knopf!

Enter Validation CodeIch hab mal wieder einen aus der Kategorie „wie man’s nicht macht“ gefunden:

Habe mich bei einer Webseite angemeldet. Das übliche Prozedere: Daten eingeben und absenden. Dann auf die Mail mit dem Aktivierungscode warten und auf den Link darin klicken.

Daraufhin bekam ich die nebenstehende Seite angezeigt…

Ja, richtig: Der hat mir die Zahl aus dem Link noch mal rot hervorgehoben angezeigt und ich sollte diesen Code dann manuell in das Eingabefeld unten eintragen…

Sehr sinnig…