http://www.tiptom.ch/homepage/
- Homepage-Tips von Thomas Lüthi
Alle Fragen und Antworten:
Mit CSS:body { margin:0; padding:0; }
Zudem muss der obere Aussenabstand des ersten Elements ggf. auf Null gesetzt werden:
CSS:
#element1 { margin-top:0; }
HTML:
<body>
<table id="element1"> <!-- u.s.w. -->
(Gemäss der CSS-2.0-Spezifikation [1998]
könnte man den CSS-Selektor "1. Kinds-Element von BODY" theoretisch
auch so schreiben:
body>*:first-child { /*...*/ }
Dies funktioniert aber nur in moderneren Browsern, z.B. MS Internet Explorer ab Version 7 oder Firefox,
wie diese Beispielseite zeigt.)
Wenn das erste Element immer die H1-Überschrift ist, geht es auch ohne ID bzw. Klasse:
CSS:
h1 { margin-top:0; }
HTML:
<body>
<h1>Überschrift</h1>
So sieht's aus:
Nur dieser FAQ-Eintrag:
http://www.tiptom.ch/homepage/faq.html?q=bodymargin
Das horizontale Zentrieren eines Block-Elements (z.B. einer Tabelle)
ist mit CSS ziemlich einfach zu lösen: Das umgebende Element
(z.B. body
), erhält für veraltete Browser (z.B. Netscape 4,
MS IE bis 5.5 sowie 6.0 im "Quirks" Modus)
text-align:center;
, das Element selbst
erhält - falls notwendig - eine Breitenangabe (width
),
zum zentrieren in guten Browsern die Angaben margin-left:auto; margin-right:auto;
sowie,
um den Inhalt wieder linksbündig auszurichten, text-align:left;
body
{
text-align:center; /* fuer Netscape 4 und MS IE */
}
table
{
width:30em;
margin-left:auto; margin-right:auto;
/* Fuer gute Browser */
text-align:left;
/* Text _in_ der Tabelle links ausrichten */
}
Hinweis: Dieser Teil der Lösung steht auch in der dciwam-FAQ und im Artikel "Ausrichtung von Block-Level-Elementen" in SelfHTML
Etwas kniffliger ist es mit dem vertikalen Zentrieren.
Mit zwei äusseren DIV
-Elementen,
von denen das äussere mit display:table
und das innere mit display:table-cell
ausgezeichnet wird, kann man auch
vertical-align:middle
anwenden und somit ein drittes, innerstes DIV
-Element
zentrieren. Alles ohne Tabellen.
html, body { width:100%; height:100%; margin:0; padding:0; }
div.aussentable
{ width:100%; height:100%; margin:0; padding:0; display:table; }
div.aussentd
{ width:100%; height:100%; margin:0; padding:0;
display:table-cell; vertical-align:middle; }
div.innen
{ width:30em; margin-left:auto; margin-right:auto; text-align:left; }
<body>
<div class="aussentable">
<div class="aussentd">
<div class="innen">
<h1>Überschrift</h1>
<p>Inhalt ...</p>
</div>
</div>
</div>
</body>
So sieht's aus: Beispielseite.
Dieses Beispiel funktioniert nur in modernen Browsern, z.B. in Firefox, MS Internet Explorer 8 und 9 oder Mozilla, aber nicht in veralteten Browsern wie MS Internet Explorer (bis Version 7) oder Netscape 4.
Mit der gleichen Methode kann man ein Bild oder einen Link als einzigen Inhalt einer Seite zentriert anzeigen: zentriertes Bild, zentrierter Link.
Eine veraltete, nicht sehr saubere und elegante, dafür recht "zuverlässige" Methode besteht darin, eine äussere Tabelle mit einer einzigen Zelle zu machen und den Inhalt dieser Zelle horizontal und vertikal zu zentrieren.
Wichtiger Hinweis: Dies ist ein "Missbrauch" von Tabellen zu Layout-Zwecken, verstösst gegen die Empfehlungen des World Wide Web Consortiums (W3C) und entspricht nicht der "reinen Lehre".
Damit die äussere
Tabelle die ganze Höhe und Breite des Browserfensters belegt,
muss man die Höhe und Breite für die diese Tabelle sowie die Elemente
HTML
und BODY
auf 100% setzen.
Für das innere, zentrierte Block-Level-Element muss man
margin-left:auto; margin-right:auto;
schreiben und ggf. eine Breitenangabe machen, z.B. wenn es
sich um ein DIV
-Element handelt, welches
sonst die ganze zur Verfügung stehende Breite einnähme.
html, body { width:100%; height:100%; }
table.aussen { width:100%; height:100%; }
table.aussen td { text-align:center; vertical-align:middle; }
div.innen
{
margin-left:auto; margin-right:auto;
width:30em; text-align:left;
}
<body>
<table class="aussen"><tr><td>
<div class="innen">Zentrierter DIV</div>
</td></tr></table>
</body>
So sieht's aus: Beispielseite mit zentrierter Tabelle und Beispielseite mit zentriertem DIV-Block (beide veraltet, aber valide).
Diese Beispiele "funktionieren" in Mozilla, MS Internet Explorer 5 und 6, Opera und den meisten anderen modernen Browsern.
Wenn man innerhalb eines zentrierten DIV-Blocks weitere Elemente
mit position:absolute;
ausrichten will, kann man die Regel für
DIV
noch ergänzen:
div.innen { position:relative; /*...*/ }
So sieht's aus: Beispielseite mit
zentriertem DIV-Block (zusätzlich mit position:relative
).
Der DIV-Block seinerseits enthält absolut positionierte Elemente.
(Veraltet, aber valide).
Wenn man auch für den veralteten, sehr seltenen Browser Netscape 4.x
ein vertikales Zentrieren erreichen will, muss man der äusseren
Tabelle ein height
-Attribut geben und hat
somit nicht nur veralteten, sondern auch nicht standardkonformen
HTML-Quellcode.
So sieht's aus: Beispielseite (veraltet, nicht valide!)
Eine Möglichkeit ist, der Tabelle, die zentriert werden soll, eine Höhenangabe in Prozent
sowie eine Mindest-Höhe in einer anderen Einheit (z.B. em
oder px
) zu geben
und den oberen und unteren Aussenabstand mit gleichen Prozent-Werten anzugeben.
table { height:60%; min-height:10em; margin-top:20%; margin-bottom:20%; }
(20 + 60 + 20 = 100).
Wenn der Inhalt der Tabelle bekannt ist, kann man die Höhe und die Breite
in Einheiten wie em
oder px
angeben
und nur den oberen und unteren Aussenabstand mit Prozentwerten, z.B. so:
table { height:10em; margin-top:20%; margin-bottom:20%; }
body
{
margin:0; border:0 none; padding:0;
text-align:center; /* fuer Netscape 4 und MS IE */
}
table
{
height:60%; min-height:10em;
width:30em;
margin-left:auto; margin-right:auto;
/* Fuer gute Browser */
margin-top:20%; margin-bottom:20%;
text-align:left; /* Text _in_ der Tabelle links ausrichten */
}
So sieht's aus: Beispielseite.
Dieses Beispiel "funktioniert" vermutlich nicht richtig, und auch wenn die Tabelle schön in der Mitte des Browserfensterst steht, ist das vielleicht nur der Fall, weil das Fenster gerade die richtige Höhe hat.
Bei wpdfd.com
gibt es ein weiteres Beispiel, wo eine "Box" mit (in Pixeln) festgelegter Grösse mit CSS (position
) zentriert wird:
Beispielseite
http://www.wpdfd.com/editorial/thebox/deadcentre3.html
Erklärung dazu
http://www.wpdfd.com/editorial/thebox/deadcentre4.html
Ebenfalls mit absoluter Positionierung arbeitet der Lösungsvorschlag im Beitrag
Wie kann ich Inhalte genau in der Mitte des Anzeigefensters positionieren?
http://de.selfhtml.org/navigation/faq.htm#mittig_zentrierte_inhalte
in der FAQ
zu SelfHTML
Im Artikel Horizontal und vertikal zentrieren mit XHTML
und CSS
http://suit.rebell.at/artikel/horizontal-und-vertikal-zentrieren-mit-xhtml-und-css
(Beispielseite)
schlägt Sigfried Arnold (suit) vor, oben an der Box, die zentriert werden soll, einen leeren DIV zu plazieren, der die halbe Höhe des
Browserfensters einnimmt und der unten einen negativen Abstand hat, der die Hälfte der Höhe der zu zentrierenden Box beträgt.
Nur dieser FAQ-Eintrag:
http://www.tiptom.ch/homepage/faq.html?q=tabzentriert
In HTML alle Leerzeilen und Zeilenumbrüche im Quelltext zwischen
<td>
und </td>
entfernen:
Statt so:
<td> <img src="..." alt="..."> <td>
oder so:
<td>
<img src="..." alt="...">
<td>
unbedingt so:
<td><img src="..." alt="..."><td>
Erklärung:
Sobald in der Zelle ein Leerzeichen vorkommt, setzen viele Browser die Höhe
auf den Wert einer Textzeile. (Dieser kann in CSS mit line-height
explizit gesetzt werden, sonst nehmen die Browser meist die implizite Zeilenhöhe
von ca. 1.20em.)
Zeilenumbrüche im HTML-Quelltext wirken bei der Anzeige wie ein Leerzeichen.
Mit CSS alle Rahmen und Abstände auf Null setzen sowie den Zelleninhalt nach unten ausrichten:
table { border:0 none; border-spacing:0; border-collapse:collapse; }
td { border:0 none; padding:0 none; }
td img { display:block; /* und/oder */ vertical-align:bottom; }
Erklärung für display:block
siehe:
Artikel
"Images, Tables, and Mysterious Gaps" von Eric A. Meyer.
https://meyerweb.com/eric/articles/devedge/img-table-gaps/
Wenn uralte Browser und solche mit abgeschaltetem CSS
auch berücksichtigt werden sollen, kann man in HTML zusätzlich noch
die (veralteten) Attribute im TABLE-Tag angeben:
<table border="0" cellspacing="0" cellpadding="0">
So sieht's aus: Beispielseite.
Nur dieser FAQ-Eintrag:
http://www.tiptom.ch/homepage/faq.html?q=tdimg
Gemäss der CSS 2.0 Spezifikation
kann man die Pseudoklasse :hover
für beliebige
Elemente verwenden, also z.B. auch für eine Tabellenzelle,
eine ganze Tabellenzeile oder auch für beliebige andere
Block-Level- und Inline-Elemente.
Mozilla, Opera (ab Version 7) und andere moderne Browser ändern dann die Farben und anderen angegebenen Eigenschaften, wenn der Mauszeiger über der Tabellenzelle bzw. über dem betreffenden Element ist.
Der MS Internet Explorer kann das bis Version 6.0 leider nicht.
Mit CSS kann man sagen, dass der Link die Tabellenzelle vollständig ausfüllen soll.
Eigentlich sollte dafür
td a { display:block }
reichen, aber für den MS Internet Explorer ist es oft
zusätzlich notwendig, auch noch width:100%;
hinzuzufügen.
Komplettes Beispiel:
HTML:
<td><a href="bla.html">Linktext</a></td>
CSS:
td a { display:block; width:100%; }
So sieht's aus: Beispiele.
Für moderne Browser (Mozilla, Opera 7) reicht für
den Farbwechsel einer Tabellenzelle:
td:hover { color:#660000; background-color:#ffff66; }
Der MS Internet Explorer kann das bis Version 6.0 leider nicht.
So sieht's aus: Beispiele.
HTML:
<td class="normal" onmouseover="this.className='spezial';" onmouseout="this.className='normal';">Text</td>
bzw.
<tr class="normal" onmouseover="this.className='spezial';" onmouseout="this.className='normal';"> <td>Text1</td> <td>Text2</td> </tr>
CSS:
.normal { color:#000000; background-color:#ffffff; }
.spezial { color:#660000; background-color:#ffff66; }
Erklärung:
Mit onmouseover="this.className='spezial';"
wechselt man
die Klasse der Zelle bzw. Zeile, solange der Mauszeiger sich über der Zelle/Zeile befindet.
Mit onmouseout="this.className='normal';"
setzt man wieder
die ursprüngliche Klasse, sobald die Maus die Zelle/Zeile verlässt.
HTML:
<td class="normal" onmouseover="this.className='spezial';" onmouseout="this.className='normal';" onclick="window.location.href='http://www.example.com/';">Text</td>
bzw.
<tr class="normal" onmouseover="this.className='spezial';" onmouseout="this.className='normal';" onclick="window.location.href='http://www.example.com/';"> <td>Text1</td> <td>Text2</td> </tr>
CSS:
.normal { color:#000000; background-color:#ffffff; }
.spezial { color:#660000; background-color:#ffff66; cursor:pointer; }
Erklärung:
Mit onclick="window.location.href='http://www.example.com/';"
wird die ganze Zelle bzw. Zeile zu einem "Link", d.h. wenn der Benutzer irgendwo
auf die Zelle/Zeile klickt, wird die Ziel-URL im gleichen Fenster geladen.
Mit der CSS-Angabe cursor:pointer
sagt man dem
Browser, dass er als Cursor das Symbol nehmen soll, das er auch
bei normalen Links anzeigt (oft eine Art "Händchen").
MS Internet Explorer kennt cursor:pointer
erst ab Version 6.0;
für ältere Versionen müsste man proprietären, nicht validen
CSS-Quellcode verwenden: cursor:hand
Um sowohl anständige Browser als auch MS Internet Explorer 5.x
zu bedienen, muss man offenbar folgendes schreiben:
{ cursor: pointer; cursor: hand; }
Siehe auch: Quirksmode.org - Cursor styles
http://www.quirksmode.org/css/cursor.html#pointer
Wichtig: Sorgen Sie dafür, dass alle Inhalte auch ohne CSS und JavaScript erreichbar sind! Bieten Sie auch ganz normale Links an, und verwenden Sie obige JavaScript-Spielereien (klickbare Zellen als "Link") nur in Ergänzung zu einer normalen Navigation.
So sieht's aus: Beispiele.
Nur dieser FAQ-Eintrag:
http://www.tiptom.ch/homepage/faq.html?q=zellelink
Durch Anwendung der CSS-Eigenschaften border, padding,
border-spacing
und border-collapse
auf die Elemente table
und td/th
.
table { border: ... }
border
.table { border-collapse: ... border-spacing: ... }
cellspacing
.table { border-collapse:collapse; border-spacing:0; }
table { border-collapse:separate; border-spacing:10px; }
border-spacing
noch nicht.
td, th { border: ... }
border
.td, th { padding: ...}
cellpadding
.So sieht's aus: Beispielseite mit verschiedenen Tabellen.
Links:
Hinweis: Tabellenzellen (td, th
) haben keinen margin
(siehe CSS 2 Specification).
Nur dieser FAQ-Eintrag:
http://www.tiptom.ch/homepage/faq.html?q=tableborder
Viele Wege führen zum Ziel:
Im STYLE
-Bereich im HEAD
der HTML-Datei
und in externen Stylesheet-Dateien:
@media screen { /* versteckte CSS-Anweisungen */ }
Beim Einbinden von externen Stylesheet-Dateien:
LINK
-Tag mit einem media
-Attribut,
das von media="screen"
verschieden ist. Zum Beispiel:<link media="screen,projection" rel="stylesheet" type="text/css/ href="stil.css" title="Mein Stil">
@import url("pfad/zum/stylesheet.css")
Link: Allgemeines zum Verstecken von CSS:
Nur dieser FAQ-Eintrag:
http://www.tiptom.ch/homepage/faq.html?q=nn4keincss
Betriebssystem | Name | ASCII dezimal | hexadezimal | oktal | PHP |
---|---|---|---|---|---|
Windows | CR LF (Carriage Return, Line Feed) | 13 10 | 0D 0A | 15 12 | \r\n |
Mac Classic (bis OS 9) | CR (Carriage Return) | 13 | 0D | 15 | \r |
Unix, Linux, Mac ab OS X | LF (Line Feed) | 10 | 0A | 12 | \n |
Ein Zeilenumbruch im HTML-Quellcode wird bei der Anzeige
normalerweise wie ein Leerzeichen behandelt und erzeugt
somit keinen sichtbaren Zeilenumbruch. Mehrere Zeilenumbrüche
und Leerzeichen werden normalerweise zu einem einzigen
Leerzeichen zusammengefasst.
Das ist so definiert in der HTML-4.01-Specification
im Abschnitt zu White Space
http://www.w3.org/TR/html401/struct/text.html#whitespace
(Nur zwischen <pre>
und </pre>
gelten andere Regeln - die meisten Browser verhalten sich
dort so: Alle Leerzeichen werden angezeigt,
umgebrochen wird nur dort, wo auch im HTML-Quelltext
ein Zeilenumbruch steht, und alle Buchstaben sind gleich breit.)
Um einen sichtbaren Zeilenumbruch zu kriegen, schreibt man
in HTML: <br>
in XHTML: <br />
Die Zuordnung in obiger Tabelle ("\n"
<=> LF, "\r"
<=> CR)
steht so im
PHP-Manual, Abschnitt zu Strings
http://www.php.net/manual/de/language.types.string.php#language.types.string.syntax.double
Diese Angaben betreffen vermutlich nur den
(üblichen) Fall, dass man mit einem PHP-Skript Text erzeugt
(z.B. HTML-Quelltext), der direkt an den Browser
ausgegeben wird.
In dem Fall reicht es normalerweise, "\n"
zu schreiben
(N.B. Es müssen doppelte Anführungszeichen sein.)
Anders sieht es aus, wenn man mit einem PHP-Skript
Dateien liest und schreibt. Dann kann
PHP den String "\n"
je nach Konfiguration auch in den Zeilenumbruch
des betreffenden Betriebssystems umwandeln.
Detaillierte Informationen siehe
PHP-Manual zu fopen()
http://www.php.net/manual/en/function.fopen.php
Wenn man also sicher sein will, dass ein Zeilenumbruch
z.B. im Windows-Format "CR LF" gespeichert wird,
muss man ihn über die numerischen Codes beschreiben,
z.B. mit chr(13).chr(10)
,
hexadezimal als "\x0D\x0A"
oder oktal als "\15\12"
.
In PHP gibt es die praktische Funktion nl2br()
(new line to break), die alle Vorkommen von "\n"
durch "<br />\n"
ersetzt.
Um in JavaScript-Ausgaben - z.B. bei alert()
- einen
Zeilenumbruch zu erzeugen, reicht meistens "Backslash n":
"\n"
Auch in Perl bewirkt "\n"
offenbar unter
Umständen, dass ein Zeilenumbruch im Stil des jeweiligen
Betriebssystems erzeugt wird. Das kann also
"CR LF", "CR" oder "LF" sein.
Wenn man mit Perl Dateien bearbeitet und sicher sein will, dass diese auf einem bestimmten Betriebssystem lesbar sind, ist es demzufolge - wie bei PHP - am sichersten, die Zeilenumbrüche mit ihren numerischen Codes zu codieren.
Im Februar 2004 gab es im Forum zu SelfHTML eine Diskussion zum Thema:
"(PROGRAMMIERTECHNIK) \r, \n oder \r\n ?"
http://forum.de.selfhtml.org/archiv/2004/2/71954/
Nur dieser FAQ-Eintrag:
http://www.tiptom.ch/homepage/faq.html?q=zeilenumbruch
Alle Rechte beim Autor: Thomas Lüthi. E-Mail: info@tomogramm.ch
Zuletzt bearbeitet am 10.01.2020
URL dieser Seite: http://www.tiptom.ch/homepage/faqs.html