La mise en page multi-colonnes des éléments de la liste CSS ne s'aligne pas correctement dans Chrome

je construis un système de menu présenté à l'utilisateur dans le format de plusieurs colonnes. La propriété colonne-count dans CSS3 m'obtient 90% du chemin là-bas, mais j'ai des difficultés avec l'alignement sous Chrome.

le menu est relativement simple:

  • une liste non ordonnée divisée en plusieurs colonnes par la colonne - nombre de biens
  • Les colonnes
  • doivent être remplies l'une après l'autre, so colonne-remplir: auto
  • les éléments de menu sont représentés comme des éléments de liste
  • chaque élément de la liste a une étiquette d'ancrage cliquable, étendue entièrement via affichage: bloc

le problème d'alignement que j'ai est le plus visible avec une bordure supérieure et un peu de coloration de fond sur chaque élément de la liste. Dans Firefox, les éléments de liste sont toujours alignés proprement à travers chaque colonne, ne saignant jamais dans la colonne précédente/suivante. Dans Chrome, l'alignement est un raccourci, variant selon le nombre d'éléments de liste présents et les propriétés de rembourrage/marge.

j'ai posté le code pour un simple cas test ici: http://pastebin.com/Ede3JwdG

le problème doit être immédiatement évident: dans Chrome, le premier élément de la liste dans la deuxième colonne saigne à nouveau dans la première colonne. Lorsque vous supprimez des éléments de la liste (cliquez sur eux), vous pouvez voir que l'alignement se dégrade encore.

j'ai essayé de modifier le rembourrage/marge pour les éléments de la liste en vain: Chrome semble avoir un algorithme défectueux pour la façon dont il s'écoule le contenu à travers une mise en page à plusieurs colonnes.

la principale raison pour laquelle je n'ai pas abandonné colonne-compte tout à fait (en faveur de la génération manuelle / Columnizer / etc.) est que le système de menu implique également la fonctionnalité de glisser-déposer à travers plusieurs sous-menus, et avoir les données de menu une hiérarchie cohérente basée sur des listes rend le code propre.

y a-t-il un moyen de corriger le problème D'alignement dans Chrome ou devrais-je simplement abandonner colonne-count pour l'instant?

ajouté:

40
demandé sur TylerH 2011-03-15 19:24:07

9 réponses

vous avez besoin que chaque élément de la colonne soit affiché comme"inline-block". Cela résoudra votre problème sans avoir besoin d'utiliser jQuery.

37
répondu asiby 2017-02-20 16:22:22

j'ai réussi à équilibrer les colonnes alignées verticalement inégales en appliquant les propriétés margin-* aux éléments à l'intérieur du conteneur multicolumn.

.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;
}
17
répondu kmerc 2015-10-13 04:09:01

j'ai joué aussi bien, et plusieurs sources que j'ai vu en ligne le font sembler être un problème connu avec webkit. Une bonne répartition peut être trouvée ici: http://zomigi.com/blog/deal-breaker-problems-with-css3-multi-columns/

un jour, CSS 3!

peut-être essayer un plugin jQuery comme http://welcome.totheinter.net/columnizer-jquery-plugin / ?

16
répondu Jack Lawson 2011-03-15 16:46:35

comme pour les fuites de marges verticales. Vous pouvez remplacer marge par pseudo-élément. Ensuite, réglez sa hauteur à la valeur de marge désirée. Vous devez aussi mettre -webkit-column-break-inside: avoid; sur l'élément contenant le pseudo-élément pour qu'il ne soit pas déplacé vers une autre colonne. Faites cela seulement pour webkit avec l'aide de CSS-hack (non recommandé) ou js-detection (meilleure façon). Voici CSS:

.element {
  -webkit-column-break-inside: avoid;
}
.element:after {
  content: '';
  display: block;
  height: 20px;
}
13
répondu Andrey 2017-05-23 10:31:07

j'avais des problèmes avec l'alignement vertical sur une liste à plusieurs colonnes. Il s'est avéré que le problème était que j'utilisais le rembourrage du bas sur ma liste de li -- j'ai changé le style de li pour utiliser une marge du bas à la place, et les colonnes alignées vers le haut à nouveau.

5
répondu Julie Olson 2015-03-13 23:38:25

j'ai résolu cela en enlevant les marges verticales sur les éléments enfants, puis en augmentant la ligne-hauteur des enfants pour répliquer l'espacement désiré.

j'ai aussi remarqué que je pouvais corriger ce problème d'alignement vertical en enlevant les marges des enfants et en les convertissant en rembourrage pour petits-enfants.

2
répondu Eleanor Zimmermann 2016-12-19 22:25:25

mon résultat souhaité était de vouloir obtenir une grande liste de liens à afficher en 3 colonnes. Le simple fait d'utiliser column-break-inside:avoid; seul ne fonctionnait pas dans 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 si vous voulez)

j'ai ajouté une bordure 1px autour des éléments de la liste qui semblait contenir les marges de ses enfants et chaque colonne ensuite alignée sur le haut.

Edit: Cela semble être nécessaire si vous utilisez mondial border-box

html {
  box-sizing: border-box;
}
*, *:before, *:after {
  box-sizing: inherit;
}
1
répondu Kiee 2016-11-18 09:31:42

je me bats avec cela aussi, pour un système de rapport avec beaucoup de données et de titres avec rembourrage/marge que je dois faire circuler sur plusieurs colonnes pour des écrans plus larges.

j'ai travaillé autour de mon premier big deal-breaker, le remplissage de l'élément de titre initial, avec la pseudo-classe :first-child (ceci est inclus dans une règle @media pour les écrans larges non montré ici):

les colonnes définition:

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

Annulation de rembourrage sur le dessus lors de .multicol

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

annulation du rembourrage et de la marge pour le premier élément ( color: blue; est de sorte que je vois si la règle attrape):

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

pour l'instant, ça a l'air bien plus net dans mon Firefox. Je vais voir s'il y a plus de bricolage à faire mais actuellement dans Firefox le texte semble aligné sur le dessus, ce qui est le plus important.

EDIT : Le problème semble bien pire avec les navigateurs webkit en effet. Pour le résoudre entièrement, j'ai modifié le modèle afin d'avoir un <div></div> autour de toutes les sections intitulées de sorte que je puisse ajouter le rembourrage / marge à la fin des divs et non pas au début des titres. Maintenant dans les navigateurs webkit il semble très bien aussi.

BTW, en utilisant des mesures de pourcentages dans multicolumns est assez délicat parce que le pourcentage semble calculé à la largeur de la colonne et non à la largeur globale de l'élément parent. J'ai changé ce en ajoutant du rembourrage dans l'élément parent des colonnes.

mais la plus grande difficulté est que Firefox ne supporte pas les propriétés colonne-span ou break-in, donc quand j'ai très peu de contenu, il est réparti sur les colonnes néanmoins, comme une ou deux lignes sur chaque. Encore une fois, Smarty à la rescousse:

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

Jusqu'à présent ça marche maintenant pour moi...

0
répondu Joel.O 2016-10-26 18:07:25

c'est la solution pour multicolonnes de l'espace problème

ul li { line-height:40px; }
-1
répondu Swati 2017-07-20 12:30:11