15. Dezember 2005 in Journal » XHTML/CSS

CSS-Hack für Opera durch Kombinieren

Während meines Updates der CSS-File stieß ich auf folgendes Problem: Opera zeigte als einziger Browser den Inhalts-Container zu weit oben an und verdeckte somit die Hauptnavigation. Es musste also ein geeigneter CSS-Hack für Opera her. Ich glaube, ich habe dabei selbst einen kreiert - zumindest eine komplexe Kombination.

text/opera;charset=utf-8

Der Owen-Hack hätte mir nichts genutzt, da er nur auf Opera Versionen 6 und drunter anspringt. Dann entdeckte ich einen anderen Hack, dessen Namen ich leider nicht mehr herausfinden konnte: Bindet man eine CSS-Datei wie folgt ein, wird sie nur von Safari und Opera verarbeitet:

<link rel='stylesheet' type='text/opera;charset=utf-8' href='opera.css' />

Der W3C-Validator sieht dies übrigens als validen Code an!

Safari Bug Nummer 4249130

Nun konnte ich den Inhalts-Container auch in Opera richtig positionieren, jedoch wurde er dann im Safari falsch dargestellt. Daher musste ich versuchen, diese Style Sheet-Angaben für Safari auszublenden. Da kam mir der Safari-Bug, der von Andy Clarke entdeckt wurde, sehr gelegen und musste ihn nur ein bisschen umbasteln, da ich sonst wieder die Korrektur der Anzeige in Opera wieder aufhob.

@media all {
  @import url(cream.css);
  margin-top:80px;
}

Safari kann die Stile innerhalb @media all nicht verarbeiten, wenn sich darin auch noch eine @import-Anweisung befindet. Jedoch verarbeitet Safari die in der @import-Anweisung befindliche CSS-Datei sehr wohl ein. Ich feilte ein bisschen herum und hab es dann geschafft.

Das Ergebnis

Ruft man die @import-Anweisung erst nach der/den für Opera nötigen CSS-Regel(n) auf, springt Safari wieder auf die "Standard"-CSS-Regel an. Das würde dan so aussehen:

@media all { 
  html body #box #content #maincontent {
    margin-top:80px;
  }@import url(style.css); 
}

Somit wäre ein weiterer CSS-Hack für Opera aufgedeckt! Es ist zwar keine einwandfreie, semantisch korrekte und valide Lösung, jedoch spricht ja ein Hack sowieso schon gegen die Grundprinzipien der Erfinder.


17 Kommentare

Darren am 16. Dezember 2005 #

Hm sehr schön. Leider habe ich davon überhaupt keine Ahnung. ;-)

Allerdings finde ich einige deiner ObjectDock Bar Icons ganz stylisch. Kannst du mir mal sagen, wo du die her hast?

Lg, Michael

Martin Labuschin am 16. Dezember 2005 #

Das hättest du besser im Forum fragen können... Leider ist die Seite, von der ich die Icons hab, im Umbau. Ich sage dir wohl bescheid, wenn sie wieder erreichbar ist. Cheers

Darren am 16. Dezember 2005 #

Merci - und demnächst gehe ich mit solchen Anliegen ins Forum

Michael am 17. Dezember 2005 #

Danke für Deine Seite, Du hast hier sehr hilfreiche Infos.


Ich möchte nun doch mal folgendes aufgreifen:
Wenn man eine Webseite entwickelt, kommt man ja früher oder später zu Widersprüchen gegenüber einzelnen Browser-Interpretationen. Viele Probleme tauchen schon beim groben Layout auf, z.B. wenn man die Seite 2- oder 3spaltig einrichtet.
Ich persönlich bin teilweise wieder zurück zu den Tabellen gegangen.
Habe einfach keine Lust mehr auf 3 pixel gaps etc. etc. Daher setze ich wieder vermehrt Tabellen ein. Natürlich nur bei Bedarf und schön dokumentiert (hinter jedem Table/td/tr tag entspr. HTML-Kommentar).

Ist das nun verwerflich?
Wie gesagt, ich bevorzuge CSS-Positionierung, aber alles was kritisch ist oder wo Bugs/Workarounds zu erwarten sind und wo eine Tabelle das lösen kann, setze ich Tabellen ein. Den einzigen Nachteil den ich sehe sind minimal höhere Ladezeiten aufgr. evtl. minimal längerem Code. Ich habe hier keinen Spaghetti-Code, sondern beispielsweise 3-5 Tabellen auf der Seite. Letztendlich auch zukunftssicherer im Hinblick auf IE7.

Mich würde Eure Meinung interessieren: muss es wirklich ohne Tabellen sein, und dafür lieber zig Workarounds/Hacks in Kauf nehmen, die eh bald schon wieder obsolete sind?

Grüße, Michael

tonZen am 18. Dezember 2005 #

Da bin ich genau deiner Meinung.

schlage mich schon lange mit unterschiedlichen Darstellungen und div's rum ... um "möglichst guten Code" zu produzieren ... aber letztlich war ich bei den meisten Sachen so entnervt, das ich zu den guten alten Tabellen zurückgekehrt bin ... die machen wenigstens was ich will und (so gut wie) jeder moderne Browser zeigt's mir gleich an ... zudem kann ich die auch per CSS wunderbar anpassen um Quelltext zu sparen.


Warte ja schon auf den nächsten Standard, mit dem wieder kein Browser was anfangen kann ... ;-)

Jeriko One am 18. Dezember 2005 #

Sorry wenn ich das jetzt mal so sage, aber dann seid ihr zwei einfach nur faul. Tabellen sollten für das genutzt werden, was sie sind, nämlich Inhalte strukturiert anzuzeigen, und nicht als Entschuldigung, damit man sich Arbeit beim Layout spart. Was kommt als nächstes, der unsichtbare Pixel-Hack?


Nebenbei, habt ihr eure Webseiten auch mal in Textbrowsern a la w3m oder lynx angeschaut? Vermutlich nicht. Das was man da zu sehen bekommt, ist übrigens auch die Reihenfolge, in der Screenreader von Blinden die Website vorlesen. Mit Tabellen wird das nix.

Jedes noch so komplexe Layout lässt sich meiner Meinung nach in allen moderneren Browsern umsetzen, ohne dabei Standards zu verletzen, es erfordert eben nur ein bisschen Arbeit.

Aber das werdet ihr zwei wohl nicht verstehen. Irgendwo ist es ja auch bezeichnend dass ihr auf CSS rumhackt, aber selber keine eigene Website angebt. Tja naja...

Martin Labuschin am 19. Dezember 2005 #

Tja, Jeriko... Es gibt leider noch viel zu viele die sich lieber auf Bilder und Navigations-Links in tabellarischen Übersichten verlassen und statt Rändern einfach mal das |-Zeichen nutzen und Abstände mit mehreren Kilobyte an leeren Bildern realisieren.

Doch genau solche Leute ärgern sich, wenn ihre Kunden auf einmal auch ihre Seiten auf Handy sehen wollen, oder das Menü doch auf der anderen Seite haben möchten. Tja... Manche können HTML andere nicht...

http://labuschin.com/material/vorteile_von_css-design.html

tonZen am 19. Dezember 2005 #

na na na na .... das ist aber zum einen nicht besonders nett ... zum anderen ziemlich arrogant was ihr beide hier so von euch gebt.
Niemand hat auf CSS rumgehackt ... würde ich nie tun, dafür ist es viel zu hilfreich ... es geht lediglich um die Verwendung von Tabellen statt Divs im Layout, die per genauso per CSS gestylt werden - wo liegt euer Problem?

@Jeriko One:
1. kann schon sein das ich faul bin ... würde eher sagen, das ich mich auf andere Gebiete spezialisiert habe ... eher den technischen Bereich, den ich für mindestens genauso wichtig halte.
2. Konnte bisher nicht feststellen, das Lynx sich doof dabei anstellt meine Texte auszugeben?! Meinst du, das du mit XHTML & Divs & CSS da weiter kommst? Den Screenreader lasse ich gelten ... damit habe ich keine Erfahrung und kann es auch nicht testen ... wäre aber mal ne interessante Sache ....

3. hat schon seinen Grund warum ich meine Webseite hier nicht angebe ... hab keine Lust mich von euch "zerlegen" zu lassen ... schon mal den 10px Abstand am Seitenkopf deiner Seite bei deaktiviertem JS im Opera 7.5 gesehen? ;-))

@Martin Labuschin:
1. HTML != CSS ... das sind ja wohl 2 Paar Schuhe
2. du scheinst dann ja nach deinen Angaben dein Handwerk zu verstehen und ich nicht oder wie verstehe ich deine letzten Satz? Wieso kleben in der Navi FOLIO und GALERIE im Opera 7.5 zusammen?

Fehlt eigentlich bloss noch, das ihr beide das Ganze als "Programmierung" bezeichnet ... springt euch jeder Informatiker ins Gesicht ... gibt ausserdem noch ein paar mehr Fakten zu beachten, wenn man eine erfolgreiche Seite betreiben will - sie muss nicht nur in jedem Browser gut ausssehen ... z.B. 8 Backlinks wie auf labschin.com und 4 auf jeriko.l-tech.org sind ein bißchen mager. War nicht in einem anderen Posting von "Popularität" die Rede? Die hört wohl hinter der "Domain-Grenze" auf.

So, viel Erfolg noch weiterhin euch beiden mit euren Domains bzw. Subdomains!


PS: Suchfeld sieht im Opera 7.5 auch anders aus!

Martin Labuschin am 20. Dezember 2005 #

Ah.. wie ich sehe entwickelt sich hier gerade eine Standard-Disskusion!CSS ist keine Programmier-Sprache, sondern eine Formatierungsprache. HTML ist auch keine Programmiersprache, sondern eine Auszeichnungssprache. Und ich habe dies - meines Wissens nach - nie behauptet.Der Grund für die Behauptung, dass einige kein HTML können ist, dass sie einfach nicht die Bedeutung der Elemente verstehen und sie falsch einsetzen. Sie können nochnichtmal ihre heißgeliebten Tabellen richtig aufbauen. Beispiel:


<table>
  <tr><td colspan="2" class="banner"></tr>
  <tr><td class="left"></td><td class="right"></td></tr>
</table>



Wo ist caption?Wo ist thead?Wo ist tbody?Wo ist th? Diese Elemte der HTML-Tabelle werden selten richtig eingesetzt!
«HTML != CSS» ist ein guter Ansatzpunkt. Jedoch gestaltest du mit HTML... Warum? HTML ist doch eine Auszeichnungssprache, die Dokumente strukturieren soll. Um eine Box neben die andere zu setzen, nutzt man nunmal CSS und nicht anderes.
Und wie meinst du das mit den Backlinks? 127 Referer mit 1887 Hits, ca. 250 Besucher am Tag und insgesamt schon über 22200 Besucher sprechen meiner Meinung nach für einen "gewissen Bekanntheitsgrad" (und mehr habe ich nie behauptet... Zumindest muss ich mich nicht für meine Website schämen, auch wenn einige Fehler in einigen Browser auftauchen.

Jeriko One am 20. Dezember 2005 #

Zu tonZens Verteidigung müsste ich jetzt sagen, dass sich in deinem kleinen Markup-Beispiel ein Fehler eingeschlichen hat, aber das wäre dann wohl Klugscheisserei ;-)

Aber abgesehen davon stimme ich dir zu, HTML ist eine Auszeichnungssprache um Dokumente zu strukturieren. Nicht mehr und nicht weniger. CSS dagegen dient der Formatierung dieser Elemente. Nicht mehr und nicht weniger. Beides steht für sich und sollte auch so eingesetzt werden. HTML 4.0 bzw. XHTML 1.0 sind seit Jahren veröffentlichte Standards, die genau dies aussagen.

Bezüglich meiner Aussage über Textbrowser möchte ich anmerken, dass der Mensch zwar zeilenweise von links nach rechts liest (Arabien, China und so mal ausgenommen), ein komplettes Dokument von oben nach unten, und eben nicht, wie es mit einem Tabellendesign fest vorgeschrieben wird, häppchenweise pro Zelle. Gutes Design zeichnet sich heutzutage dadurch aus, dass die Inhalte zum einen in eine logische Reihenfolge gebracht und zum anderen optisch aufbereitet werden. Beispiel? labuschin.com ohne Stylesheet (Edit -> Page Style -> No Page Style im Feuerfuchs, wobei es mich ja nicht wundern würde, wenn ihr den IE benutzt...).


Ansonsten ist es natürlich sehr einfach auszuteilen, aber nicht einzustecken. Ich habe auch nie behauptet, dass meine Website frei von Fehlern ist, und herrje, man muss auch irgendwo mal einen Schlussstrich ziehen. Ich könnte mich jetzt nächtelang mit dem von dir angesprochenen Problem beschäftigen...oder ich lasse es, da es kein gravierender Fehler ist und konzentriere mich lieber auf die Inhalte. Aber mit einer Aussage zu kommen, die 2005 völlig überholt ist, aber dann nicht genug Courage zu haben, diese durch Preisgabe der eigenen Website zu untermauern...ist schon arm.

Nebenbei: Auch mir ist deine Milchmädchenrechnung nicht ganz klar: 17 Backlinks laut technorati.com, wobei diese mal so gar nichts aussagen. Die ca. 20.000 Besucher dagegen schon.

Michael Schmid am 29. Dezember 2005 #

Ich kann es gut verstehen, wenn sich Leute erstmal dafür entscheiden, eine kritische Situation über eine Tabelle zu lösen. Die Betonung liegt auf "erst einmal". Letztendlich sollte jeder das Ziel haben, CSS dafür einzusetzen wofür es gedacht ist.

Mir sind genügend Sourcecodes untergekommen, wo mit 100erten divs gearbeitet wurde: div hier, div da, div überall. Da finde ich dann Tabellen noch übersichtlicher :-). Leute die so agieren haben CSS und das XHTML-Modell in keinster Weise verstanden.
Jedenfalls: um z.B. den oben erwähnten 3-Pixel-Gap mit einer Tabelle zu lösen, sehe ich nix verwerfliches (obwohl da meist height: 1em reicht). Es kommt immer auch auf die Zielgruppe der Seite an. Manche Browser-Bugs sind nun mal schwierig zu behandeln, und da sehe ich es gerade privaten Webmastern nach, hier und da doch eine Tabelle zu verwenden, obwohl Tabellen völlig widersprüchlich sind im Kontext dieser Verwendung. Wenn allerdings wer beruflich / kommerziell auftritt, dann hege ich einen anderen Anspruch, und schau mir genau an, was der-/diejenige da fabriziert hat.

Michael Schmid am 29. Dezember 2005 #

Noch was:
Nicht zu vergessen: die bestehenden CM-Systeme. Beispielsweise Joomla/Mambo. Hier erfolgt die Ausgabe nach wie vor via Tabellen, d.h. selbst wenn das Grundgerüst sauber gelöst wurde, erfolgt die Füllung unsauber. Dies kann auch wieder Nebenwirkungen haben, kennt jeder der in Joomla schon mal versucht hat, verschachtelte Tabellen in einem CSS-Layout zu bändigen. Auch hier schlagen wieder Browser-Bugs zu (z.B. IE in Verbindung mit Styles auf Tabellen).
Eigentlich eine Frechheit, dass CMS wie Joomla/Mambo dies heutzutage noch machen. Z.B. Wordpress als Weblogsystem ist da vorbildlich und zeigt wie es anders geht.

Chris am 4. Januar 2006 #

Hallo Martin,

um wieder auf das Ursprungsthema zurückzukommen:
Dieser Hack ist genau das, was ich gesucht habe! Leider kann ich in der Site, die ich bearbeite, kein Javascript einsetzen, sonst hätte ich etwas wie auf http://my.opera.com/community/forums/topic.dml?id=103779 verwendet.

Vielen Dank...

Jo am 30. Mai 2006 #

Funktioniert bei mir einfach nicht, absolut nicht, und da gibt es ja nichts falsch zu machen.

Martin Labuschin am 30. Mai 2006 #

Ist der Selektor bei dem kompletten Sytslesheet villeicht stärker als der in der CSS-File für Opera? Das könnte ein Problem sein. Ansonsten kann ich dir ohne dein Beispiel nicht weiterhelfen.

Rechtsanwalt Strafrecht am 19. April 2007 #

Funktioniert bei mir auch nicht. Ich weiss aber auch nicht was ich falsch mache. JO: Hast Du die Probleme gelöst?

Marc am 9. Juni 2007 #

Laut RFC müssen @import Regeln immer am Anfang einer CSS Datei stehen und dürfen nicht in @meda Regeln verschachtet werden... Nur mal so am Rande. Folglich hat der Safari mit diesem Code natürlich auch Probleme.

Diskussion geschlossen

Die Kommentarfunktion dieses Artikels wurde deaktiviert. Private Mitteilungen an Martin bitte per E-Mail an martin@labuschin.com. Danke.