it-swarm.com.de

2 Spalten automatisch mit CSS fließen lassen

Ich habe den folgenden Code:

<p>This is paragraph 1. Lorem ipsum ... </p>
<p>This is paragraph 2. Lorem ipsum ... </p>
<p>This is paragraph 3. Lorem ipsum ... </p>
<p>This is paragraph 4. Lorem ipsum ... </p>
<p>This is paragraph 5. Lorem ipsum ... </p>
<p>This is paragraph 6. Lorem ipsum ... </p>

Ich möchte, wenn möglich, ohne Textauszug veranlassen, dass dieser Text in zwei Spalten fließt (1-3 links, 4-6 rechts). Der Grund für mein Zögern, eine Spalte mit einem <div> hinzuzufügen, besteht darin, dass dieser Text vom Client über einen WYSIWYG-Editor eingegeben wird. Daher werden alle Elemente, die ich einspreche, wahrscheinlich später oder unerklärlich beendet.

60
Joseph Mastey

JQuery verwenden

Erstellen Sie eine zweite Spalte und bewegen Sie sich über die Elemente, die Sie benötigen.

<script type="text/javascript">
  $(document).ready(function() {
    var size = $("#data > p").size();
 $(".Column1 > p").each(function(index){
  if (index >= size/2){
   $(this).appendTo("#Column2");
  }
 });
  });
</script>

<div id="data" class="Column1" style="float:left;width:300px;">
<!--   data Start -->
<p>This is paragraph 1. Lorem ipsum ... </p>
<p>This is paragraph 2. Lorem ipsum ... </p>
<p>This is paragraph 3. Lorem ipsum ... </p>
<p>This is paragraph 4. Lorem ipsum ... </p>
<p>This is paragraph 5. Lorem ipsum ... </p>
<p>This is paragraph 6. Lorem ipsum ... </p>
<!--   data Emd-->
</div>
<div id="Column2" style="float:left;width:300px;"></div>

Update:

Oder Da die Anforderung nun besteht, dass sie gleich groß sind. Ich würde vorschlagen, die vorgefertigten jQuery-Plugins zu verwenden: Columnizer-jQuery-Plugin

http://jsfiddle.net/dPUmZ/1/

35
Glennular

Verwenden Sie CSS3

.container {
   -webkit-column-count: 2;
      -moz-column-count: 2;
           column-count: 2;

   -webkit-column-gap: 20px;
      -moz-column-gap: 20px;
           column-gap: 20px;
}

Browser-Unterstützung

  • Chrome 4.0+ (-webkit-)
  • IE 10.0+
  • Firefox 2.0+ (-moz-)
  • Safari 3.1+ (-webkit-)
  • Opera 15.0+ (-webkit-)
106
Glennular

Das automatische Verschieben zweier Spalten nebeneinander ist derzeit nicht nur mit CSS/HTML möglich. Zwei Möglichkeiten, dies zu erreichen:

Methode 1: Wenn es keinen fortlaufenden Text gibt, nur viele nichtbezogene Absätze:

Verschieben Sie alle Absätze nach links, geben Sie ihnen die halbe Breite des übergeordneten Elements und legen Sie nach Möglichkeit eine feste Höhe fest.

<div id="container">
  <p>This is paragraph 1. Lorem ipsum ... </p>
  <p>This is paragraph 2. Lorem ipsum ... </p>
  <p>This is paragraph 3. Lorem ipsum ... </p>
  <p>This is paragraph 4. Lorem ipsum ... </p>
  <p>This is paragraph 5. Lorem ipsum ... </p>
  <p>This is paragraph 6. Lorem ipsum ... </p>
</div>

#container { width: 600px; }
#container p { float: left; width: 300px; /* possibly also height: 300px; */ }

Sie können auch Clearer-Divs zwischen Absätzen einfügen, um zu vermeiden, dass Sie eine feste Höhe verwenden müssen. Wenn Sie two -Spalten möchten, fügen Sie zwischen zwei und zwei Absätzen ein klareres Div ein. Dadurch werden die beiden nächsten Absätze oben ausgerichtet, und es wirkt aufgeräumter. Beispiel:

<div id="container">
  <p>This is paragraph 1. Lorem ipsum ... </p>
  <p>This is paragraph 2. Lorem ipsum ... </p>
  <div class="clear"></div>
  <p>This is paragraph 3. Lorem ipsum ... </p>
  <p>This is paragraph 4. Lorem ipsum ... </p>
  <div class="clear"></div>
  <p>This is paragraph 5. Lorem ipsum ... </p>
  <p>This is paragraph 6. Lorem ipsum ... </p>
</div>

/* in addition to the above CSS */
.clear { clear: both; height: 0; }

Methode 2: Wenn der Text fortlaufend ist

Fortgeschrittener, aber es kann gemacht werden.

<div id="container">
  <div class="contentColumn">
    <p>This is paragraph 1. Lorem ipsum ... </p>
    <p>This is paragraph 2. Lorem ipsum ... </p>
    <p>This is paragraph 3. Lorem ipsum ... </p>
  </div>
  <div class="contentColumn">
    <p>This is paragraph 4. Lorem ipsum ... </p>
    <p>This is paragraph 5. Lorem ipsum ... </p>
    <p>This is paragraph 6. Lorem ipsum ... </p>
  </div>
</div>

.contentColumn { width: 300px; float: left; }
#container { width: 600px; }

Wenn es um die Benutzerfreundlichkeit geht: Keine davon ist für nicht-technische Kunden wirklich einfach. Sie könnten versuchen, ihm/ihr zu erklären, wie er dies richtig macht, und ihm/ihr erklären, warum. Das Erlernen von sehr einfachem HTML-Code ist ohnehin keine schlechte Idee, wenn der Client die Webseiten in Zukunft über einen WYSIWYG-Editor aktualisiert.

Oder Sie könnten versuchen, eine Javascript-Lösung zu implementieren, die die Gesamtzahl der Absätze zählt, diese in zwei Hälften teilt und Spalten erstellt. Dies wird sich auch für diejenigen, die JavaScript deaktiviert haben, nachlassen. Eine dritte Option besteht darin, dass all diese Aufsplittungsspaltenaktion serverseitig ausgeführt wird, wenn dies eine Option ist.

(Methode 3: CSS3-Layout mit mehreren Spalten)

Sie können über die Vorgehensweise von CSS3 nachlesen , dies ist jedoch für eine Produktions-Website nicht wirklich praktisch. Zumindest noch nicht. 

22
Arve Systad

Hier ist ein Beispiel für eine einfache zweispaltige Klasse:

.two-col {
       -moz-column-count: 2;
       -moz-column-gap: 20px;
       -webkit-column-count: 2;
       -webkit-column-gap: 20px;
}

Davon würden Sie sich wie folgt auf einen Textblock anwenden:

<p class="two-col">Text</p>

Kein Experte hier, aber das habe ich getan und es hat funktioniert

<html>
<style>
/*Style your div container, must specify height*/
.content {width:1000px; height:210px; margin:20px auto; font-size:16px;}
/*Style the p tag inside your div container with half the with of your container, and float left*/
.content p {width:490px; margin-right:10px; float:left;}
</style>

<body>
<!--Put your text inside a div with a class-->
<div class="content">
            <h1>Title</h1>
            <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus gravida laoreet lectus. Pellentesque ultrices consequat placerat. Etiam luctus euismod tempus. In sed eros dignissim tortor faucibus dapibus ut non neque. Ut ante odio, luctus eu pharetra vitae, consequat sit amet nunc. Aenean dolor felis, fringilla sagittis hendrerit vel, egestas eget eros. Mauris suscipit bibendum massa, nec mattis lorem dignissim sit amet. </p>
            <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer eget dolor neque. Phasellus tellus odio, egestas ut blandit sed, egestas sit amet velit. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae;</p>
</div>     
</body>
</html>

Sobald der Text in den <p>-Tags die Höhe des Container-Divs erreicht hat, wird der andere Text rechts neben dem Container angezeigt.

3
Abner M

Im Folgenden habe ich einen statischen und dynamischen Ansatz für die Kolumnisierung von Absätzen entwickelt. Der Code ist ziemlich selbstdokumentiert. 

Vorwärts

Nachfolgend finden Sie die folgenden Methoden zum Erstellen von Spalten:

  1. Statisch (2-spaltig)
  2. Dynamisch mit JavaScript + CSS (n-Spalten)
  3. Dynamisch mit JavaScript + CSS3 (n-Spalten)

Statisch (2-spaltig)

Dies ist ein einfaches 2-Spalten-Layout. Basierend auf Glennular 's 1. Antwort .

$(document).ready(function () {
    var columns = 2;
    var size = $("#data > p").size();
    var half = size / columns;
    $(".col50 > p").each(function (index) {
        if (index >= half) {
            $(this).appendTo(".col50:eq(1)");
        }
    });
});
.col50 {
    display: inline-block;
    vertical-align: top;
    width: 48.2%;
    margin: 0;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="data" class="col50">
    <!-- data Start -->
    <p>This is paragraph 1. Lorem ipsum ...</p>
    <p>This is paragraph 2. Lorem ipsum ...</p>
    <p>This is paragraph 3. Lorem ipsum ...</p>
    <p>This is paragraph 4. Lorem ipsum ...</p>
    <p>This is paragraph 5. Lorem ipsum ...</p>
    <p>This is paragraph 6. Lorem ipsum ...</p>
    <p>This is paragraph 7. Lorem ipsum ...</p>
    <p>This is paragraph 8. Lorem ipsum ...</p>
    <p>This is paragraph 9. Lorem ipsum ...</p>
    <p>This is paragraph 10. Lorem ipsum ...</p>
    <p>This is paragraph 11. Lorem ipsum ...</p>
    <!-- data End-->
</div>
<div class="col50"></div>

Dynamisch mit JavaScript + CSS (n-Spalten)

Mit diesem Ansatz erkenne ich im Wesentlichen, ob der Block in Spalten konvertiert werden muss. Das Format ist col-{n}. n ist die Anzahl der Spalten, die Sie erstellen möchten.

$(document).ready(function () {
    splitByColumns('col-', 4);
});

function splitByColumns(prefix, gap) {
    $('[class^="' + prefix + '"]').each(function(index, el) {
        var me = $(this);
        var count = me.attr("class").split(' ').filter(function(className) {
            return className.indexOf(prefix) === 0;
        }).reduce(function(result, value) {
            return Math.max(parseInt(value.replace(prefix, '')), result);
        }, 0);
        var paragraphs = me.find('p').get();
        me.empty(); // We now have a copy of the children, we can clear the element.
        var size = paragraphs.length;
        var percent = 1 / count;
        var width = (percent * 100 - (gap / count || percent)).toFixed(2) + '%';
        var limit = Math.round(size / count);
        var incr = 0;
        var Gutter = gap / 2 + 'px';
        for (var col = 0; col < count; col++) {
            var colDiv = $('<div>').addClass('col').css({ width: width });
            var css = {};
            if (col > -1 && col < count -1) css['margin-right'] = Gutter;
            if (col > 0 && col < count)     css['margin-left'] = Gutter;
            colDiv.css(css);
            for (var line = 0; line < limit && incr < size; line++) {
                colDiv.append(paragraphs[incr++]);
            }
            me.append(colDiv);
        }
    });
}
.col {
    display: inline-block;
    vertical-align: top;
    margin: 0;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="data" class="col-6">
    <!-- data Start -->
    <p>This is paragraph 1. Lorem ipsum ...</p>
    <p>This is paragraph 2. Lorem ipsum ...</p>
    <p>This is paragraph 3. Lorem ipsum ...</p>
    <p>This is paragraph 4. Lorem ipsum ...</p>
    <p>This is paragraph 5. Lorem ipsum ...</p>
    <p>This is paragraph 6. Lorem ipsum ...</p>
    <p>This is paragraph 7. Lorem ipsum ...</p>
    <p>This is paragraph 8. Lorem ipsum ...</p>
    <p>This is paragraph 9. Lorem ipsum ...</p>
    <p>This is paragraph 10. Lorem ipsum ...</p>
    <p>This is paragraph 11. Lorem ipsum ...</p>
    <!-- data End-->
</div>

Dynamisch mit JavaScript + CSS3 (n-Spalten)

Dies wurde von Glennular 's 2. Antwort abgeleitet. Es verwendet die Regeln column-count und column-gap CSS3.

$(document).ready(function () {
    splitByColumns('col-', '4px');
});

function splitByColumns(prefix, gap) {
    var vendors = [ '', '-moz', '-webkit-' ];
    var getColumnCount = function(el) {
        return el.attr("class").split(' ').filter(function(className) {
            return className.indexOf(prefix) === 0;
        }).reduce(function(result, value) {
            return Math.max(parseInt(value.replace(prefix, '')), result);
        }, 0);
    }
    $('[class^="' + prefix + '"]').each(function(index, el) {
        var me = $(this);
        var count = getColumnCount(me);
        var css = {};
        $.each(vendors, function(idx, vendor) {
            css[vendor + 'column-count'] = count;
            css[vendor + 'column-gap'] = gap;
        });
        me.css(css);
    });
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="data" class="col-3">
    <!-- data Start -->
    <p>This is paragraph 1. Lorem ipsum ...</p>
    <p>This is paragraph 2. Lorem ipsum ...</p>
    <p>This is paragraph 3. Lorem ipsum ...</p>
    <p>This is paragraph 4. Lorem ipsum ...</p>
    <p>This is paragraph 5. Lorem ipsum ...</p>
    <p>This is paragraph 6. Lorem ipsum ...</p>
    <p>This is paragraph 7. Lorem ipsum ...</p>
    <p>This is paragraph 8. Lorem ipsum ...</p>
    <p>This is paragraph 9. Lorem ipsum ...</p>
    <p>This is paragraph 10. Lorem ipsum ...</p>
    <p>This is paragraph 11. Lorem ipsum ...</p>
    <!-- data End-->
</div>

1
Mr. Polywhirl

Diese Lösung teilt sich in zwei Spalten auf und teilt den Inhalt in eine Zeile in die andere. Dies ist praktisch, wenn Sie mit Daten arbeiten, die in die erste Spalte geladen werden, und möchten, dass sie jedes Mal gleichmäßig fließen. :). Sie können mit dem Betrag spielen, der in die erste Spalte gesetzt wird. Dies funktioniert auch mit Listen.

Genießen.

<html>
<head>
<title>great script for dividing things into cols</title>



    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.js"></script>
    <script>
$(document).ready(function(){

var count=$('.firstcol span').length;
var selectedIndex =$('.firstcol span').eq(count/2-1);
var selectIndexafter=selectedIndex.nextAll();


if (count>1)
{
selectIndexafter.appendTo('.secondcol');
}

 });

</script>
<style>
body{font-family:arial;}
.firstcol{float:left;padding-left:100px;}
.secondcol{float:left;color:blue;position:relative;top:-20;px;padding-left:100px;}
.secondcol h3 {font-size:18px;font-weight:normal;color:grey}
span{}
</style>

</head>
<body>

<div class="firstcol">

<span>1</span><br />
<span>2</span><br />
<span>3</span><br />
<span>4</span><br />
<span>5</span><br />
<span>6</span><br />
<span>7</span><br />
<span>8</span><br />
<span>9</span><br />
<span>10</span><br />
<!--<span>11</span><br />
<span>12</span><br />
<span>13</span><br />
<span>14</span><br />
<span>15</span><br />
<span>16</span><br />
<span>17</span><br />
<span>18</span><br />
<span>19</span><br />
<span>20</span><br />
<span>21</span><br />
<span>22</span><br />
<span>23</span><br />
<span>24</span><br />
<span>25</span><br />-->
</div>


<div class="secondcol">


</div>


</body>

</html>
0
namretiolnave

Vielleicht eine etwas engere Version? Mein Anwendungsfall gibt College-Majors aus, die mit einem Json-Array von Majors (Daten) versehen sind.

var count_data      = data.length;

$.each( data, function( index ){
    var column = ( index < count_data/2 ) ? 1 : 2;
    $("#column"+column).append(this.name+'<br/>');
});

<div id="majors_view" class="span12 pull-left">

  <div class="row-fluid">
    <div class="span5" id="column1"> </div>
    <div class="span5 offset1" id="column2"> </div>
  </div>

</div>
0
sjskier