CSS ohne HTML

Avatar of Mathias Bynens
Mathias Bynens am

DigitalOcean bietet Cloud-Produkte für jede Phase Ihrer Reise. Starten Sie mit 200 $ kostenlosem Guthaben!

Vor ein paar Tagen hat Chris getwittert

Wenn wir Pseudoelemente stapeln könnten (z.B. ::after::after), könnten wir eine ganze Website ohne HTML außer . bauen. Wahrscheinlich ist es gut, dass wir das nicht können.

Als Reaktion darauf erstellte ich diese kurze Demo (in Firefox oder Opera anzeigen), die veranschaulicht, dass man technisch gesehen gar kein HTML benötigt, um CSS zu verwenden.

Da diese Demo offenbar einige Verwirrung bei Tweeps verursachte, beschloss ich, einen Artikel darüber zu schreiben. Grundsätzlich tut diese magische Demo nur zwei knifflige kleine Tricks, von denen die meisten Leute anscheinend nichts wissen.

Einige HTML-Elemente sind implizit

Die öffnenden und schließenden Tags <html>, <head> und <body> sind in HTML nicht erforderlich. Das folgende Dokument ist perfekt gültig und konform

<!DOCTYPE html>
<title>Example</title>

Der Kürze halber verwendet dieses Codebeispiel den HTML5 DOCTYPE, aber lassen Sie sich davon nicht verwirren - wenn Sie zum HTML 4.01 DOCTYPE wechseln würden, würde das Dokument immer noch validieren. Offensichtlich hat XHTML eine viel strengere Syntax, die das Weglassen optionaler öffnender und/oder schließender Tags nicht zulässt. Aber es ist fast 2011, wer benutzt denn noch XHTML?

Wenn ein Browser unser Beispiel-Dokument rendert, bemerkt er, dass die Elemente , und im Quellcode fehlen und – warten Sie darauf – sie automatisch generiert. Sie können dies bestätigen, indem Sie die Demoseite öffnen und den generierten Quellcode mit Firebug, dem Web Inspector oder Opera Dragonfly inspizieren.

Da diese Elemente implizit sind, können sie auch über CSS gestylt werden, unabhängig davon, ob sie im Quellcode vorkommen oder nicht. Betrachten Sie das folgende Beispiel

<!DOCTYPE html>
<title>Example</title>
<style>
  html {
    background: red;
  }
  body {
    background: blue;
    margin: 0 auto;
    width: 30em;
  }
</style>

Auch wenn im HTML-Quellcode keine Rede von den Elementen <html> und <body> ist, können wir sie trotzdem stylen, da Browser sie automatisch generieren.

Im Grunde ist dies der erste Trick, den ich verwendet habe; ich habe ihn nur noch einen Schritt weiter getrieben. Ich habe mir nicht die Mühe gemacht, einen DOCTYPE anzugeben, geschweige denn einen <title>, und habe einfach gar kein HTML verwendet. Tun Sie das für eine echte Website niemals. Aufgrund des fehlenden DOCTYPE wird das Dokument im Quirks-Modus anstelle des Standardsmodus gerendert. Es versteht sich von selbst, dass das Dokument auch nicht validiert.

Selbst mit einem komplett leeren HTML-Dokument generieren Browser immer noch automatisch die impliziten HTML-Elemente.

Interessante Nebenbemerkung: Es ist auch möglich, Der Link: HTTP-Header.

RFC 5988 definiert den Link HTTP Header, der es Ihnen ermöglicht, <link> Elemente über HTTP-Header zu senden, anstatt sie in das HTML aufzunehmen. Um Ihnen ein Beispiel zu geben, können Sie ein Dokument mit dem folgenden HTTP-Header bedienen

Link: <some-document.html>;rel=prefetch

...was die gleiche Wirkung hätte wie das Einfügen dieses in Ihr HTML

<link href="some-document.html" rel="prefetch">

Ebenso macht RFC 5988 es möglich, Stylesheets in einem HTML-Dokument mithilfe von nichts anderem als einem HTTP-Header einzubinden

Link: <magic.css>;rel=stylesheet

Was dem entspricht...

<link href="magic.css" rel="stylesheet">

Nutzung

Wenn Sie also zu Hause damit herumspielen möchten, machen Sie Ihre Demoseite zu PHP und setzen Sie den Header ganz oben auf der Seite

<?php header('Link: <demo.css>;rel=stylesheet'); ?>

In dieser Demo wurde der Inhalt mithilfe von Pseudoelementen im CSS in die Seite eingefügt

html { 
   background: #666; 
   padding: 1em; 
}
body { 
   border: 5px dashed #eee; 
   color: #fff; 
   font: 3em/1.5 sans-serif;
   padding: 1em; 
   width: 30em; 
   margin: 0 auto; 
}
body::after { 
   content: 'O HAI! Have a look at my source code :)'; /* This needs to be on the ::after (and not just on `body`) for it to work in Firefox 3.6.x. */ 
}

Nun, das ist die Theorie. In der Praxis implementieren nicht viele Browser den Link Header. Zum Zeitpunkt des Schreibens unterstützen nur Opera und Firefox dieses kleine Juwel.

Wenn Sie daran interessiert sind, wie sich die Browserunterstützung für diese Funktion im Laufe der Zeit verbessern wird, können Sie die Fehlerberichte für WebKit (Chromium hat separate Fehler-Tickets für die CSS und die allgemeine Variante) und Internet Explorer abonnieren.

Haftungsausschluss

Wie erwähnt, sind diese Techniken lustige Tricks, und es ist definitiv gut zu wissen, dass sie existieren. Es wäre jedoch keine gute Idee, diese in der Praxis anzuwenden. Der „Hack“ ohne HTML ist allerhand böse, und kein Webentwickler würde ernsthaft in Erwägung ziehen, dies für eine echte Website zu verwenden.

Der Link HTTP-Header ist wesentlich interessanter. Der einzige Grund, warum dies noch nicht wirklich genutzt werden kann, ist die mangelnde Browserunterstützung. Vielleicht eines Tages...

Ein Lob an Anne van Kesteren dafür, dass er mir 2005 den Link Header beigebracht hat :)