Gibt es eine Möglichkeit, bei einer Tabelle, die z.B. in der ersten Zeile 100 Zellen und in der zweiten Zeile 50 Zellen hat, die jeweils per border=„1“ rules=„all“ optisch von einander getrennt werden, den Rahmen um die leere Fläche nach den 50 Zellen der zweiten Zeile wegzulassen?
Der Code, mit dem die Tabelle generiert wird, sieht so aus:
[PHP]
echo ‚
‘;[/PHP]
$zahlen ist dabei ein Array frei wählbarer Größe, muss also nicht zwingend ein Vielfaches von $zeilenumbruch sein. Dadurch entsteht leider oben genannter Rahmen um nicht belegten Platz zwischen der letzten Zelle der letzten Zeile und dem rechten Rand aller vorangegangenen Zeilen. Das sieht dann z.B. so aus (100 Zellen pro Zeile, 150 Zahlen abgefragt):
Der HTML Code dürfte nach wie vor nicht Gültig sein.
Ich würde einfach den Zellen Klassen geben. Einmal .zahl für den Rahmen und .primzahl für den Hintergrund. Das ist einfacher als mit inline Styles zu arbeiten, ausserdem kannst du dann einfacher das HTML Tabellengerüst in eine gültige Form bringen.
Den Rahmen brauchen alle Zellen, die Einfärbung aber nur ausgewählte. Ich habe es jetzt mal mit 3 Klassen gemacht:
[HTML]
.td_border{
border: 1px solid black;
width: 7px;
height: 10px
}
.td_prime_red{
background-color: red;
}
.td_prime_white{
background-color: white;
}
[/HTML]
Welche der td_prime_red/white-Klassen verwendet wird, frage ich unmittelbar vor der Ausgabe ab:
[PHP]
if($zahlen[$i]!=„“){
$color=„red“;
}
else{
$color=„white“;
}
[/PHP]
Die Abfrage wird dann so weiterverarbeitet, damit die Primzahlen markiert werden:
[HTML][/HTML]
An der Fehldarstellung der Zeilenabschlüsse ändert das aber leider nichts. Edit: Ich hatte es bisher nur im Firefox 6.0.1 probiert, ein Test im IE6 hat mir gerade fehlerfreie Tabellenrahmen geliefert.
Hapert es deiner Meinung nach noch an anderen Stellen oder nur bei den Inline-Styles?
Die letzte Reihe hat immer zu wenig Zellen, wenn die Maximale Anzahl der Spalten nicht teilbar ist mit der maximalen anzahl der Zellen. Ausserem hasat du am Schluss immer […] das ist ungültiges HTML. Du brauchst nur ZWEI Klassen.
Leider kann ich nicht gut genug PHP um dir das mal eben zu zeigen, in Perl würde das so aussehen:
[code]#!/usr/bin/perl -w
use strict;
use CGI qw(-no_xhtml);
use constant NL => „\n“;
Schon klar, aber damit hast du ungültigen HTML Code.
Hier mal das Perl Skript: Untitled Document (ich habe hier table border=1 benutzt, damit du siehst wie die Tabelle aufgefüllt wird, wenn diese Angabe wegfällt, siehst du diese Zellen nicht mehr.)
Ich habe den Code jetzt so erweitert, dass die letzte Zeile automatisch mit leeren -Blöcken aufgefüllt wird, wenn ich kein Vielfaches der Spaltenanzahl anzeigen will. Wahrscheinlich noch viel zu kompliziert (ich habe jetzt jeweils eine Klasse für rote und weiße Zellen sowie für umrahmte und nicht umrahmte, also 4 wo du 2 hast), aber es geht.
Dein Perl-Script habe ich bisher noch nicht wirklich durchschaut, aber auf den ersten Blick scheint es mehrere CSS-Klassen bei Bedarf zusammenzufassen (if($prim{$i}) { $class .= ’ prim’;}), richtig?
Bleibt noch das Problem des nicht korrekt angezeigten Rahmens im Firefox, der IE6 scheint mit den Tabellen kein Problem zu haben. Das sind im Moment die einzigen beiden Browser, die ich testen kann.
der IE6 als Browser ohne Probleme, kannte ich bisher eher anders herum.
füge in deine leeren ein ein (nbsp =nonbreaking space = Leerzeichen ohne Umbruch), dann sollten die leeren Zellen auch korrekt mit dem CSS Rahmen angezeigt werden.
Ein ändert leider (wie jede andere Ausgabe innerhalb der Zellen), außer dass es die Höhenbegrenzung von 10px ignoriert und jede Zelle 22px hoch ausgibt, nichts am fehlerhaften Rahmen.
Ich weiß nicht von was für einen Fehlerhaften Rahmen du sprichst?
Ich hab mein Skript nochmal umgebaut, dass die Vorgaben von dir umgesetzt werden und sehe keinen Fehler im Firefox.
Von dieser Fehldarstellung am rechten Rand rede ich:
Die gesamte Tabelle bekommt diese Klasse verpasst:
[HTML]
.table_collapse{
border-collapse: collapse;
}
[/HTML]
Die einzelnen Zellen jeweils eine td_border_1/0 und eine td_prime_0/1:
[HTML]
}
.td_border_1{
border: 1px solid #000000;
width: 7px;
height: 10px;
}
.td_border_0{
border: 0px;
width: 7px;
height: 10px;
}
.td_prime_1{
background-color: red;
}
.td_prime_0{
background-color: white;
}
[/HTML]
Wenn ich in der Tabellen-Klasse border-collapse:separate einstelle wird zwar im Firefox (der IE zeigt dann gar keine Rahmen mehr) alles formal richtig dargestellt, mir gefallen die Zwischenräume zwischen den einzelnen Zellen allerdings nicht.
Hier ist mal mein gesamter Code (inkl. einer weiteren Tabelle, die Primzahlen ausgibt, aber hier nicht Thema ist, da sie so ist, wie sie sein soll), kannst ja mal probieren, ob er bei dir richtig ausgeführt wird oder ob du einen Fehler findest.
<? for($i=1;$i<=$td_bis_ver;$i++){
// Umrahme jede Zelle, wenn sie innerhalb der angegebenen Obergrenze liegt
if($i<=$ende){
$border = "1";
}
else{
$border = "0";
}
// Markiere alle Primzahlen Rot
if($zahlen[$i]!=""){
$prime="1";
}
else{
$prime="0";
} ?>
<? // Zeilenumbruch nach X geprüften Zahlen
if($i>0 && $i<$td_bis_ver && $i%$zeilenumbruch_ver==0){?>
<?}
}?>
<?}
}
// Meldung, wenn eingegebener Wert kleiner 1 ist
else{
echo "Bitte einen Wert größer gleich 1 eingeben";
}
}
// Meldung, wenn nicht nur Ziffern eingegeben wurden
else{
echo "Bitte ausschließlich Ziffern eingeben.";
}
}
// Meldung, wenn keine Eingabe gemacht wurde
else{
echo "Bitte zuerst eine Obergrenze zur Darstellung von Primzahlen festlegen.";
}
if(!$_POST['prim_tab'] && !$_POST['prim_ver'] && $_POST['prim_ende']){
echo "Bitte aktivieren Sie mindestens eine Checkbox zur Anzeige der Primzahltabelle oder -verteilung.";
}?>
[/CODE]
Dann wird es wohl ein lokales Code-Problem sein, damit kann ich zumindest etwas besser leben als mit einem nicht zu behebendem Problem im Code. Damit kann der Thread hier dann zu den Akten gelegt werden.