2013-11-01 2 views
5

Ich versuche CSS für das folgende Layout zu erstellen. Dies ist einer Tabelle sehr ähnlich, aber ich verwende sie, um XML darzustellen, das keine Tabellendaten enthält.CSS: mehrspaltiges Layout mit Blöcken, die an einer horizontalen Regel ausgerichtet sind

Ich möchte zwei oder mehr Spalten und eine oder mehrere horizontale Regeln (unsichtbare Linien), die durch diese Spalten laufen. Der vertikale Abstand zwischen den Regeln wird genau wie die Zeilenhöhe einer Tabelle durch die maximale Höhe des Inhalts in den Zellen dieser Zeile bestimmt.

Alle "Zellen" in dieser "Tabelle" enthalten zwei optionale Blöcke. Der obere Block ist unterhalb der oberen Linie ausgerichtet. Der untere Block ist über der unteren Regel ausgerichtet. Hier ist eine Darstellung:

CSS goal

Die ober- und unterhalb Blöcke beide optional sind, so dass jeder „Zelle“ eine der folgenden Konfigurationen haben. Die Blöcke haben keine feste Höhe; Sie können Text enthalten, der abhängig von der Breite der "Zelle" umgebrochen wird.

All possible "cell" configurations

Da dies so viel wie ein Tisch, versuchte ich es mit display:table Rendering. Erstes Problem: Wie kann ich sowohl obere als auch untere Blöcke in einem einzigen table-cell erstellen? Hier ist meine first attempt.

Ich denke, das ist gleichbedeutend mit dem Problem, einen Block am Boden seines Behälters "schweben". Die angenommene Antwort auf this question schlägt vor, dass dies möglicherweise nicht möglich ist.

XML-Fragment

Hier ist eine vereinfachte Beispiel der XML ich zu machen bin versucht.

<block> 
    <horizontal-rule> 
     <column> 
      <above-rule>When in the Course of human events</above-rule> 
     </column> 
     <column> 
      <above-rule>to dissolve the political bands</above-rule> 
      <below-rule>it becomes necessary for one people</below-rule> 
     </column> 
     <column> 
      <below-rule>which have connected them with another</below-rule> 
     </column> 
    </horizontal-rule> 
</block> 

In dem Versuch, dies zu arbeiten, habe ich mit einer Änderung an meinem ursprünglichen XML-Schema experimentiert. In diesem zweiten XML-Beispiel versuche ich, statt nach der benachbarten horizontalen Regel zu gruppieren, eine "tabellenartige" Gruppierung nach Zeilen. In der Übersetzung wird <above-rule><cell-bottom> und <below-rule> wird <cell-top>. Ich bevorzuge das Original, aber ich habe mehr Fortschritte mit diesem gemacht.

<block> 
    <row> 
     <cell> 
      <cell-bottom>When in the Course of human events</cell-bottom> 
     </cell> 
     <cell> 
      <cell-top>it becomes necessary for one people</cell-top> 
      <cell-bottom>to dissolve the political bands</cell-bottom> 
     </cell> 
     <cell> 
      <cell-top>which have connected them with another</cell-top> 
     </cell> 
    </row> 
</block> 

Eine wirklich hässliche Lösung

ich eine Idee haben, die besonders hässlich ist. Ich kann mein XML-Schema ändern und benötige, dass das gesamte XML zweimal mit exakt demselben Inhalt wiederholt wird. Dann lege ich beide Kopien des in ein Wrapper-Element <block-wrapper> und ich definiere separate Stile für das erste Kind des Wrappers und das letzte Kind des Wrappers.

Das erste Kind richtet den Zellinhalt oben aus und blendet die <bottom> Blöcke aus. Das letzte Kind richtet den Zellinhalt unten aus und blendet die <top> Blöcke aus.

Ich verwende position:absolute, um die beiden gerenderten Tabellen genau überlappen zu lassen.

Hier ist ein implementation of this idea.

Fragen

  • Gibt es einen besseren Weg, dies zu tun?
  • Ich habe viele Debatten über Tabellen und CSS gelesen. Ist display:table ein kluger Ansatz?
  • Gibt es eine Möglichkeit, mein ursprüngliches XML-Schema zu verwenden?
  • Ich möchte in der Lage sein, nur das XML-Dokument zu verteilen, und ein Benutzer mit dem CSS kann es in einem Browser anzeigen. Aber wäre es besser, einen XML-Transformationsschritt einzufügen, um ein intermediäres XML-Schema zu erstellen, das einfacher mit CSS gerendert werden kann? (Meine hässliche Lösung ist in diesem Fall möglicherweise nicht so schlecht.)
+0

Eine Tabelle wie Struktur wird die einzige Möglichkeit sein, dies zu tun, denke ich. Für den Ausrichtungseffekt würden Sie Zellen und eine 'rowspan' benötigen, obwohl ich nicht sicher bin, ob dies ohne ein'

' Element gemacht werden kann? Diese Frage scheint es so zu sagen: [CSS - rowspan like effect] (http://stackoverflow.com/q/13585789) (Die "Position: absolute" Workaround in der Antwort ist hässlich IMO) –

+0

Ich vermute einen rowspan-like Effekt würde nicht funktionieren. Siehe hierzu [Beispiel] (http://dabblet.com/gist/7272902). – dlh

+0

Das Beispiel scheint in meinem Browser in Ordnung zu sein, vielleicht sehe ich das Problem nicht? –

Antwort

0

Sie müssen keine Tabellen verwenden. Probieren Sie dies (nur in Chrome getestet):

<html> 
<head> 
<title>CSS</title> 
</head> 


<style type="text/css"> 
div { 
    float: left; 
    width: 100px; 
    margin-left: 10px; 
    margin-right: 10px; 
    border-width: 1px; 
    border-style: solid; 
    visibility: visible; 
    height: 50%; 
    background-color: white; 
    position: relative; 
} 

div div { 
    background-color: grey; 
    z-index: 3; 
} 

div#OUTER { 
    width: 100%; 
    display: block; 
    height: 600px; 
    border: 0; 
} 

span { background-color: white; width: 100%; } 

.line { width: 100%; visibility: visible; z-index: 5; } 
.top { position: absolute; top: 10%; } 
.bottom { position: absolute; bottom: 10%; } 
.red-line { border: solid 2px red; } 
.blue-line { border: solid 2px blue; } 
.top-line { position: absolute; top: 2%; } 
.bottom-line { position: absolute; bottom: 50%; } 
</style> 

<body> 

    <div id="OUTER" style=""> 
     <hr class="line red-line top-line" /> 
     <hr class="line blue-line bottom-line" /> 
     <div> 
      <span class="top">11111<br>111111<br>111111111</span> 
     </div> 
     <div> 
      <span class="bottom">22222</span> 
     </div> 
     <div> 
      <span class="bottom">33333<br>33333<br>33333</span> 
     </div> 
     <div> 
      <span class="top">44444<br>44444<br>4444<br>4444</span> 
      <span class="bottom">55555<br>555555<br>5555<br>5555</span> 
     </div> 
    </div> 
</body> 
</html> 
+0

Danke für die Idee. Leider wird dadurch der vertikale Abstand zwischen den horizontalen Regeln nicht automatisch vergrößert. Wenn die Bereiche "4" oder "5" in Ihrer Lösung zu groß werden, überlappen sie sich stattdessen. – dlh

Verwandte Themen