2017-06-10 35 views
1

Ich versuche, die Anzahl der Spalten zu verwenden, um eine Art Kalenderwoche zu Benutzeraufgaben zu machen.Css column-count sollte nur das erste Kind respektieren

Das Hauptdiv der Woche hat die Eigenschaft der Spaltenzählung bis 7 und IMMER wird es 7 Kinder. Die sieben Tage dieser Woche. In diesen Tagen gibt es die Aufgaben, aber die Anzahl der Aufgaben ist variabel und es bricht die Spaltenanzahl Logik.

Warum Spaltenzählung nicht nur die ersten childs darin berücksichtigen?

Hier ist ein Beispiel dafür, was ich sagen will: https://jsfiddle.net/nby5ctb2/

Auf der zweite Liste, wollte ich die Aufgaben 1, 1.1 und 1.2 auf dem jeweils anderen, und wenn es keine Childs ist gerade diesen Tag überspringe.

Die CSS-I verwendet wurde, war nur dieses:

.week { 
    -moz-column-count: 7; 
    -webkit-column-count: 7; 
    column-count: 7; 
} 

Dank weit fortgeschritten, dass

+0

Könnten Sie bitte den ([MCVE]) HTML- und CSS-Code zeigen, den Sie verwenden, damit wir sehen können, womit Sie es zu tun haben, und hoffentlich Ihre Frage verstehen. –

+0

Oh, das habe ich vergessen. Ich werde ein Beispiel geben. Entschuldigung ^^ – Cechinel

+0

Sie müssen die Anzeige auf childs zurücksetzen, um zu vermeiden, dass sie die Spalten überspannt. Die durchschnittliche CSS-Regel funktioniert nicht, display: inline-block erledigt die Aufgabe, Sie müssen auch Breite hinzufügen, um die gesamte Spaltenbreite zu füllen.https://jsfiddle.net/nby5ctb2/2/ –

Antwort

2

Sie scheinen den Zweck column-count zu haben falsch verstanden und daher ist es missbräuchlich.

Es ist Zweck, etwas Inhalt zu nehmen und es in die gegebene Anzahl von Spalten mit so nahe an gleichen Mengen von Inhalt wie möglich zu teilen. Das einzige Werkzeug, das Sie haben, ist break-inside:avoid, um "blockartigen" Inhalt zusammen zu halten.

Aber wenn Sie tun verwenden es eine Spalte größer als die anderen zu machen, Ihr machen alle Spalten die gleiche Höhe, weil das ist, was CSS Spalten tut. Wenn Sie also beispielsweise break-inside:avoid auf .day. verwenden, werden andere kürzere .day s in derselben Spalte angehäuft. Es würde nur funktionieren, wenn Tage in Ihrer Woche gleiche Mengen an Inhalten hätten, was eindeutig nicht der Fall ist.

Die erste Frage, die Ihnen in den Sinn kommt, ist: Warum nicht Flex verwenden? Da Sie wahrscheinlich möchten, dass die Breiten Ihres Tages gleich sind, müssen Sie den Kindern width hinzufügen. Standardmäßig haben display:flex Kinder flex: 0 1 auto, was sie je nach Inhalt flexibel macht.

.week { 
    display: flex; 
} 
.week > * { 
    width: calc(100%/7) 
} 

Fiddle.

+0

Wow. Es ist unglaublich. Ich wusste nichts über den Display-Flex. Vielen Dank. Es ist genau das, was ich will ^^ – Cechinel

+0

Wenn der Inhalt überläuft, wollen Sie auch 'overflow: hidden' haben ... und/oder' word-break: break-all' wenn Sie lange Wörter oder nur Text erwarten kann lange Wörter haben) – LGSon

+0

@LGSon Von wo ich es überfließenden Inhalt sehe, ist ein völlig anderes Problem, das nicht mit diesem verwandt ist. Meine Kommentare zu 'flex-width' bezogen sich auf Fälle, in denen 1 Tag 20 Wörter enthält und ein weiterer Tag 1 Wort enthält. Ohne Beschränkung auf "width" macht flexbox das ".day" mit mehr Inhalten breiter als das mit weniger Inhalt. Einverstanden? Und ja, "flex-grow: 0" ist eine Option, um dies auch zu verhindern. Aber da es "1" ist, muss es eingestellt werden :). –

1

CSS Spalte ist nicht die beste Lösung zu erreichen. Es strebt an, den Inhalt von links nach rechts zu spalten, und was Sie verlangen, ist dagegen anzukämpfen.

Ich empfehle Ihnen, z. B. Flexbox, die das sehr einfach und mit besserer Browser-Unterstützung tut.

.week { 
 
    display: flex; 
 
    flex-wrap: wrap; 
 
} 
 
.week .day { 
 
    flex-basis: calc(100%/7); 
 
    word-break: break-all; 
 
    overflow: hidden; 
 
}
This works 
 
<div class='week'> 
 
    <div class="day"> 
 
     <div class="task" >Task 1</div> 
 
    </div> 
 
    <div class="day"> 
 
     <div class="task" >Task 2</div> 
 
    </div> 
 
    <div class="day"> 
 
     <div class="task" >Task 3</div> 
 
    </div> 
 
    <div class="day"> 
 
     <div class="task" >Task 4</div> 
 
    </div> 
 
    <div class="day"> 
 
     <div class="task" >Task 5</div> 
 
    </div> 
 
    <div class="day"> 
 
     <div class="task" >Task 6</div> 
 
    </div> 
 
    <div class="day"> 
 
     <div class="task" >Task 7</div> 
 
    </div> 
 
</div> 
 

 
<br /> 
 
<br /> 
 

 
This <strike>doesn't</strike> work too, now 
 
<div class='week'> 
 
    <div class="day"> 
 
     <div class="task" >Task 1</div> 
 
     <div class="task" >Task 1.1</div> 
 
     <div class="task" >Task 1.2</div> 
 
    </div> 
 
    <div class="day"> 
 
     <div class="task" >Task 2</div> 
 
    </div> 
 
    <div class="day"> 
 
    </div> 
 
    <div class="day"> 
 
    </div> 
 
    <div class="day"> 
 
     <div class="task" >Task 5</div> 
 
     <div class="task" >Task 5.1</div> 
 
    </div> 
 
    <div class="day"> 
 
    </div> 
 
    <div class="day"> 
 
    </div> 
 
</div>

+0

GTMA, LGSon. :). Vielleicht möchten Sie die Kinder flex: 0 0 calc (100%/7) ', wie man erwartet, dass die Wochen untereinander die gleiche Breite für Tage haben. Also dachte ich, "Breite" sei hier prägnanter. Beachten Sie auch, dass IE Probleme mit "calc" in "flex-basis" hat. Nicht sicher, ob es immer noch ein Problem ist, es war vor ein paar Monaten. –

+0

@AndreiGheorghiu Doing 'flex: 0 0 calc (100%/7)' gemacht IE Kollaps der Spalten ... wie es jetzt ist, funktioniert gut, danke für die Notiz obwohl – LGSon

+0

So hat es nur ein Problem mit 'calc' auf 'flex-basis' wenn' flex-basis' in Kurzform angegeben wird? Das wusste ich nicht. Ich erinnere mich an einen Fall, in dem ich wirklich 'calc' in' flex-basis' brauchte, aber es kam mir nie in den Sinn, von der Kurzschreib-Syntax zu separaten Eigenschaften zu wechseln. Gut zu wissen, dass ich es immer noch benutzen kann. Vielen Dank. Flex-basis zu verwenden, wird aber immer noch dazu führen, dass Tage ungleiche Breiten haben, abhängig vom Inhalt, oder? Es war nicht erforderlich, aber es ist eine vernünftige Erwartung von einer wöchentlichen Anzeige. Du brauchst also 'max-width' hier. –

Verwandte Themen