webentwicklung-frage-antwort-db.com.de

Kann ich eine neue Zeile mit CSS-Tabellenzellen ohne Zeilenumbruchelement beginnen?

Gegebenes Markup wie folgt:

<div class="a">A</div>
<div class="b">B</div>
<div class="a">A</div>
<div class="b">B</div>
<div class="a">A</div>
<div class="b">B</div>

Ist es möglich, dieses Dokument so zu gestalten, dass es so aussieht:

|-------|---------|
|       |         |
|   A   |    B    |
|       |         |
|-------|---------|
|       |         |
|   A   |    B    |
|       |         |
|-------|---------|
|       |         |
|   A   |    B    |
|       |         |
|-------|---------|

(und wenn der Inhalt in A oder B länger ist, wächst sein Nachbarn entsprechend seiner Höhe)…

ohne zusätzliches markup?

Ich verstehe, dass .a und .b einen display-Wert von table-cell zu geben, nur diese eine große Zeile ergeben würde.

Was ist die Lösung?

21
Alan H.

Nicht ohne Flexbox , die noch nicht in mehreren großen Browsern gelandet ist, scheint der Konsens zu sein.

4
Alan H.

Nein, ich denke, es ist nicht möglich "ohne zusätzliche Aufschläge". Es braucht:

  • div wrapper mit display: table-row; mit A anb B "cells"
  • JavaScript mit Listenern für divs, wodurch die max der Höhen von A anb B in jedem Paar bestimmt und auf eine kleinere festgelegt wird

Lösung für die zweite:

CSS:

.a, .b {
    padding: 0.5em;
    float: left;
}
.a:nth-child(n+1) {
    clear: both;
}

jQuery:

$(function() {
    var max_width_a = 0, max_width_b = 0;
    $("div.a").each(function() {
        var elem_a = $(this),
            elem_b = elem_a.next("div.b"),
            height_a = elem_a.height(),
            height_b = elem_b.height(),
            pair = [elem_a, elem_b];

        max_width_a = Math.max(max_width_a, elem_a.width());    
        max_width_b = Math.max(max_width_b, elem_b.width());  
        $(pair).height(Math.max(height_a, height_b));
    }).width(max_width_a);
    $("div.b").width(max_width_b);
});

Ich habe deine Geige aktualisiert. Funktioniert das Dokument, müssen Sie es anpassen, wenn Sie dynamische Höhenänderungen bestimmen möchten.

Lass es mich wissen, wenn ich erklären muss, wie es funktioniert. Natürlich können Sie die Breite von div.a und div.b in CSS erzwingen und nicht mit jQuery auf maximale Breite prüfen (dann müssen Sie nur die maximale Höhe in jedem Paar bestimmen).

3
Wirone

nein, dies ist nicht möglich, ohne jeder Zeile einen Wrapper zu geben.

hier ist eine reine CSS-Lösung mit einem einzigen Wrapper (pro Zeile)

.row { 
    background-color: #ccc;
    float: left;
    margin: 10px 0;
    padding: 1em;
    width: 50%;
    }
.a {
    float: left;
    width: 45%;
    }
.b {
    float: right;
    width: 45%;
    }

und das html

<div class="row">
    <div class="a">Mofo break yo neck, yaonna chung fizzle, bizzle dizzle dang dolor boom shackalack augue. Fizzle izzle away sit its fo riz</div>
    <div class="b">Lorizzle hizzle dolizzle sit amet, brizzle adipiscing elizzle. Nullam i saw beyonces tizzles and my pizzle went crizzle shizzlin dizzle, fo shizzle mah nizzle fo rizzle, mah home g-dizzle sizzle, suscipit quizzle, i saw beyonces tizzles and my pizzle went crizzle vizzle, arcu. Break yo neck, yall shiznit tortor. Sed eros. Ma nizzle izzle you son of a bizzle dapibizzle turpishizzle. Integizzle check out this velit sed fo.</div>
</div>
<div class="row">
    <div class="a">Sizzle ullamcorpizzle. Shut the shizzle up sagittizzle dizzle a shiznit. Vestibulizzle you son of a bizzle ipsizzle primis izzle faucibus orci pot et ultrices posuere Dope Fo shizzle; Crazy vestibulizzle. Fo shizzle my nizzle habitant morbi tristique senectus ma nizzle netizzle izzle tellivizzle famizzle turpis hizzle. Donizzle tempor hendrerit hizzle. Aliquizzle erat volutpat. </div>
    <div class="b">Vivamizzle sagittis.rttitizzle izzle, boom shackalack hizzle, orci. Integizzle hizzle funky fresh lectus. </div>
</div>
<div class="row">
    <div class="a">Donizzle tempor hendrerit hizzle. Aliquizzle erat volutpat. Things crunk fizzle, scelerisque bizzle, daahng dawg the bizzle, crackalackin shiznit, arcu. Daahng dawg elizzle. Crazy fermentizzle, est izzlot purizzle , bibendizzle sizzle amizzle, fo shizzle vehicula, fo shizzle my nizzle malesuada, shizznit. Aenizzle fizzle ipsizzle izzle est ullamcorpizzle tincidunt. Cool quizzle. Mauris ligula urna, tempizzle shut th</div>
    <div class="b">Mofo break yo neck, yall fo shizzle izzle leo bibendum crackalackin. Vivamizzle shit tortor vizzle away. Brizzle malesuada fo magna. Dang commodo, nisl nizzle go to hizzle egestizzle, magna dolor w</div>
</div>

wenn Sie möchten, dass a und b unterschiedliche Hintergrundfarben haben, müssen Sie die Höhe verwenden: 100%

1
kristina childs

Ich habe ein jQuery-Plugin geschrieben, das dies erreicht. Es konvertiert ein float Layout in ein display:table Layout und behandelt die Zeilen für Sie. Zellbreiten werden automatisch behandelt ohne Skript (viel schneller). Es reagiert auch. Es heißt WRECKER !! Hahahaha !.

svachon.com/blog/wrecker-responsive-equal-height-columns-and-rows/

1
Steven Vachon

ich habe dies in einen Kommentar eingefügt, sollte aber wahrscheinlich nur eine Antwort geben. Hier erfahren Sie, wie Sie dasselbe tun (indem Sie Zeilen verwenden), um auch eine Höhe von 100% zu erzwingen

.row {
    background-color: #ccc;
    float: left;
    margin: 10px 0;
    padding: 1em;
    width: 50%;
}

#container_a {
    background-color: blue;
    float: left;
    position: relative;
    right: 50%;
    width: 100%;
}
#container_b {
    background-color: red;
    float: left;
    overflow: hidden;
    position: relative;
    right: 0;
    width: 100%;
}
#column_a {
    float: left;
    left: 50%;
    overflow: hidden;
    position: relative;
    width: 46%;
}
#column_b {
    float: left;
    left: 56%;
    overflow: hidden;
    position: relative;
    width: 46%;
}

und das html

<div class="row">
    <div id="container_b">
        <div id="container_a">
            <div id="column_a">Lorizzle hizzle dolizzle sit amet, brizzle adipiscing elizzle. Nullam i saw beyonces tizzles and my pizzle went crizzle shizzlin dizzle, fo shizzle mah nizzle fo rizzle, mah home g-dizzle sizzle, suscipit quizzle, i saw beyonces tizzles and my pizzle went crizzle vizzle, arcu. Break yo neck, yall shiznit tortor. Sed eros. Ma nizzle izzle you son of a bizzle dapibizzle turpishizzle. Integizzle check out this velit sed fo.</div>
            <div id="column_b">Vivamizzle sagittis.rttitizzle izzle, boom shackalack hizzle, orci. Integizzle hizzle funky fresh lectus. </div>
        </div>
    </div>
</div>
<div class="row">
    <div id="container_b">
        <div id="container_a">
            <div id="column_a">Lorizzle hizzle dolizzle sit amet, brizzle adipiscing elizzle. Nullam i saw beyonces tizzles and my pizzle went crizzle shizzlin dizzle, fo shizzle mah nizzle fo rizzle, mah home g-dizzle sizzle, suscipit quizzle, i saw beyonces tizzles and my pizzle went crizzle vizzle, arcu. Break yo neck, yall shiznit tortor. Sed eros. Ma nizzle izzle you son of a bizzle dapibizzle turpishizzle. Integizzle check out this velit sed fo.</div>
            <div id="column_b">Vivamizzle sagittis.rttitizzle izzle, boom shackalack hizzle, orci. Integizzle hizzle funky fresh lectus. </div>
        </div>
    </div>
</div>
<div class="row">
    <div id="container_b">
        <div id="container_a">
            <div id="column_a">Lorizzle hizzle dolizzle sit amet, brizzle adipiscing elizzle. Nullam i saw beyonces tizzles and my pizzle went crizzle shizzlin dizzle, fo shizzle mah nizzle fo rizzle, mah home g-dizzle sizzle, suscipit quizzle, i saw beyonces tizzles and my pizzle went crizzle vizzle, arcu. Break yo neck, yall shiznit tortor. Sed eros. Ma nizzle izzle you son of a bizzle dapibizzle turpishizzle. Integizzle check out this velit sed fo.</div>
            <div id="column_b">Vivamizzle sagittis.rttitizzle izzle, boom shackalack hizzle, orci. Integizzle hizzle funky fresh lectus. </div>
        </div>
    </div>
</div>
1
kristina childs

Sie können dies ohne Flexbox tun, aber Sie müssen nth-child () verwenden. Schauen Sie sich diese Antwort an: https://stackoverflow.com/a/12589629/740836

1
Nick Budden

Ich kann mir keinen Weg ohne Zeilenumbruch vorstellen, aber wenn Sie wissen, dass sich die exakte Breite des äußeren Div niemals ändern wird, ist es möglich, dies zu erreichen. Meine Problemumgehung besteht darin, dass die Wrappergröße a und b in dieselbe Zeile passt. Anschließend werden die nächsten a und b automatisch verschoben, sodass sie in die nächste Zeile übergehen. Wenn sich die Breite des Wrappers verringert, werden a und b jedoch nicht auf derselben Linie liegen.

<div id="wrapper">
  <div class="a">A</div>
  <div class="b">B</div>
  <div class="a">A</div>
  <div class="b">B</div>
</div>

<style>
#wrapper { width: 500px;}
.a { background-color:green; float:left; width:50%;}
 .b {background-color:red;float:left;width:50%;}
</style>

http://jsfiddle.net/Lf0arzkn/1/

0
eternal

Ja, mit display: contents ist es möglich, sich auf ein Kind (wie einen Textknoten oder ein Element, aber eigentlich in CSS-Formeln) in der Zelle kurz vor (oder nach dem Anpassen meiner Lösung) dem Umbruch zu beschränken.

<style>
#d1::after {
    content: "";
    display: table-row;
}
</style>
<div style="display: table">
<div id="d1" style="display: contents">aaaaaaaaaa</div>
<div style="display: table-cell">bbbbbbbbb</div>
</div>
0
ByteEater