CSS wielokolumnowy układ elementów listy nie wyrównuje się poprawnie w Chrome

Buduję System menu prezentowany użytkownikowi w formacie wielokolumnowym. Właściwość column-count w CSS3 daje mi 90% tej drogi, ale mam problemy z wyrównaniem pod Chrome.

Menu jest stosunkowo proste:

  • Lista nieuporządkowana podzielona na wiele kolumn przez właściwość column-count
  • kolumny powinny wypełniać się kolejno, więc column-fill: auto
  • elementy menu są reprezentowane jako pozycje listy
  • każdy element listy ma klikalny znacznik kotwicy, rozszerzony w pełni Poprzez display: block

Problem z wyrównaniem, który mam, jest najbardziej zauważalny przy górnej krawędzi i niektórych kolorowaniach tła na każdym elemencie listy. W przeglądarce Firefox elementy listy są zawsze wyrównane w sposób czysty w każdej kolumnie, nigdy nie krwawiąc do poprzedniej / następnej kolumny. W Chrome wyrównanie jest crapshoot, różni się od tego, ile elementów listy jest obecnych i jakakolwiek wyściółka / margines właściwości.

Umieściłem kod do prostego przypadku testowego tutaj: http://pastebin.com/Ede3JwdG

Problem powinien być natychmiast widoczny: w Chrome pierwsza pozycja listy w drugiej kolumnie wraca do pierwszej kolumny. Gdy usuniesz elementy listy (kliknij na nie), zobaczysz, że wyrównanie ulegnie dalszemu rozkładowi.

Próbowałem dostosować padding / margines dla elementów listy bez skutku: Chrome wydaje się mieć wadliwy algorytm przepływu treści w układzie wielokolumnowym.

Główny powód, dla którego nie porzuciłem całkowicie column-count (na rzecz ręcznego generowania / Columnizer / etc.) jest to, że system menu obejmuje również funkcję przeciągania i upuszczania w wielu pod-menu, a posiadanie danych menu ułożonych jako spójna hierarchia oparta na liście sprawia, że czysty kod.

Czy Jest jakiś sposób na naprawienie problemu z wyrównaniem w Chrome czy mam zrezygnować z column-count dla teraz?

Dodany:

Author: TylerH, 2011-03-15

10 answers

Każdy element w kolumnie musi być wyświetlony jako "inline-block". To rozwiąże twój problem bez potrzeby używania jQuery.

Dodatkowo, każdy element może mieć width: 100% w celu uzyskania przez niego pełnej szerokości wierszy.

Oto działający przykład:

$(document).ready(function() {
    for( var i = 0; i < 24; i++ ) {
        $("ul.newslist").append("<li><a href='#'>Item</a></li>");
    }
    $("ul.newslist > li").click(function() {
        $(this).remove();
    })
});
ul.newslist {
    columns: 5;
    background-color: #ccc;
    padding: 16px 0;
    list-style: none;
}

ul.newslist > li {
    display: inline-block;
    width: 100%;
    border-top: 1px solid #000;
}

ul.newslist > li > a {
    display: block;
    padding: 4px;
    background-color: #f6b;
    text-decoration: none;
    color: inherit;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<ul class="newslist"></ul>
 82
Author: asiby,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-02-19 16:13:05

Udało mi się zrównoważyć nierówne kolumny wyrównane pionowo, stosując właściwości margin-* do elementów wewnątrz kontenera wielokolumnowego.

.content {
  column-width: 15em; /* or could be column-count, however you want to set up multi columns */
}
.content > section {
  -webkit-margin-before: 0;
  -webkit-margin-after: 0;
}
 22
Author: kmerc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-13 04:09:01

Grałem również i kilka źródeł, które widziałem w internecie, sprawiają, że wydaje się to być znany problem z webkit. Dobry podział można znaleźć tutaj: http://zomigi.com/blog/deal-breaker-problems-with-css3-multi-columns/

Pewnego dnia, CSS 3!

Może spróbuj wtyczki jQuery jak http://welcome.totheinter.net/columnizer-jquery-plugin / ?

 16
Author: Jack Lawson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-15 16:46:35

Co do wycieku marginesów pionowych. Margines można zastąpić pseudoelementem. Następnie ustaw jego wysokość na żądaną wartość marginesu. Musisz również ustawić -webkit-column-break-inside: avoid; na elemencie zawierającym pseudo-element, aby nie został przeniesiony do innej kolumny. Zrób to tylko dla webkit za pomocą css-hack (niezalecane) lub js-detection (najlepszy sposób). Oto CSS:

.element {
  -webkit-column-break-inside: avoid;
}
.element:after {
  content: '';
  display: block;
  height: 20px;
}
 14
Author: Andrey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:07

Miałem problem z wyrównaniem pionowym na liście wielokolumnowej. Okazało się, że problem polegał na tym, że używałem dolnego paddingu na mojej liście li-zmieniłem styl li, aby zamiast tego użyć dolnego marginesu, a kolumny ponownie wyrównały się do góry.

 7
Author: Julie Olson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-13 23:38:25

Moim pożądanym rezultatem była chęć uzyskania dużej listy linków do wyświetlenia w 3 kolumnach. Samo użycie column-break-inside:avoid; nie zadziałało w webkit.

HTML

<div class="links">
  <ol>
    <li><a>link</a></li> <!-- x 50 -->
  </ol>
</div>

Css:

.links ol {
  -webkit-column-count: 3;
  -moz-column-count: 3;
  column-count: 3;
}

.links li {
  display: block;
  border: 1px solid $background-colour; //to appear invisible
  -moz-column-break-inside:avoid;
  -webkit-column-break-inside:avoid;
  column-break-inside:avoid;
}

.links a {
  display: block;
  margin-bottom: 10px;
}

Solution (quirk if you will)

Dodałem obramowanie 1px wokół elementów listy, które wydawało się zawierać marginesy jego dzieci i każda kolumna następnie wyrównane do góry.

Edit: to wydaje się być wymagane tylko wtedy, gdy używasz global border-box

html {
  box-sizing: border-box;
}
*, *:before, *:after {
  box-sizing: inherit;
}
 3
Author: Kiee,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-11-18 09:31:42

Rozwiązałem to, usuwając pionowe marginesy na elementach potomnych, a następnie zwiększając wysokość linii dzieci, aby odtworzyć żądane odstępy.

Zauważyłem również, że mogę naprawić ten problem z wyrównaniem pionowym, usuwając marginesy potomne i konwertując je na padding wnuka.

 2
Author: Eleanor Zimmermann,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-19 22:25:25

Walczę z tym również, dla systemu raportowania z wieloma wieloma danymi i tytułami z wypełnieniem / marginesem, które muszę przepływać na kilku kolumnach dla szerszych ekranów.

Pracowałem wokół mojego pierwszego big deal-breaker, padding początkowego elementu title, z pseudo-klasą :first-child (jest to wliczone w regułę @ media dla szerokich ekranów nie pokazanych tutaj):

Definicja kolumny:

.dimSlider .multicol {
  -moz-columns: 4;
  -webkit-columns: 4;
  columns: 4;
}

Anulowanie wyściółki na górze, gdy w .multicol

.dimSlider .multicol h3 {
  padding-top: 0;
}

Anulowanie padding and margin for the first element (color: blue; is so that I see if the rule catches):

.dimSlider .multicol .criteria:first-child h3 {
  padding: 0 2%;
  margin: 0;
  color: blue;
}

Jak na razie wygląda to znacznie lepiej w moim Firefoksie. Zobaczę, czy jest jeszcze coś do zrobienia, ale obecnie w Firefoksie tekst wygląda wyrównany na górze, co jest najważniejsze.

Edytuj : Problem wydaje się znacznie gorszy w przypadku przeglądarek opartych na webkit. Aby rozwiązać go całkowicie, zmodyfikowałem szablon, aby mieć <div></div>wokół wszystkich tytułowych sekcji, dzięki czemu mogę dodać padding / margines na końcu div, a nie na początku tytułów. Teraz w przeglądarkach webkit też wygląda dobrze.

BTW, używanie procentów w wielokolumnach jest dość trudne, ponieważ procent wydaje się obliczany na szerokość kolumny, a nie globalną Szerokość elementu nadrzędnego. Zmieniłem to dodając padding w elemencie nadrzędnym kolumn.

Ale największą trudnością jest to, że Firefox nie obsługuje żadnych właściwości rozpiętości kolumn lub włamania, więc kiedy ma bardzo mało treści, jest rozłożona na kolumnach, podobnie jak jedna lub dwie linie na każdej. Znowu Smarty na ratunek:

{if $element|@count <= 10}
<div class="nocol"> 
{/if} 

Jak na razie to działa dla mnie...

 0
Author: Joel.O,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-10-26 18:07:25

Szukając informacji na ten temat natknąłem się na twoje pytanie i dzisiaj sprawdzałem elementy listy.

Stwierdziłem, że element UL stosuje margines tylko w pierwszej kolumnie.

Po prostu zastosuj 0 padding i margin w css i będą one wyrównane

margin:0;
padding:0;

Hope it helps

 0
Author: Rui Pedro,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-05 19:39:51

Jest to rozwiązanie problemu przestrzeni wielokolumnowej

ul li { line-height:40px; }
 -2
Author: Swati,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-20 12:30:11