Existe-t-il un moyen de faire une coupure de ligne dans une flexbox à plusieurs lignes?
Par exemple, pour casser après chaque 3ème élément dans ce CodePen .
.container {
background: tomato;
display: flex;
flex-flow: row wrap;
align-content: space-between;
justify-content: space-between;
}
.item {
width: 100px;
height: 100px;
background: gold;
border: 1px solid black;
font-size: 30px;
line-height: 100px;
text-align: center;
margin: 10px;
}
.item:nth-child(3n) {
background: silver;
}
<div class="container">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
<div class="item">7</div>
<div class="item">8</div>
<div class="item">9</div>
<div class="item">10</div>
</div>
Comme
.item:nth-child(3n){
/* line-break: after; */
}
Réponses:
La solution la plus simple et la plus fiable consiste à insérer des éléments flexibles aux bons endroits. S'ils sont suffisamment larges (
width: 100%
), ils forceront un saut de ligne.Afficher l'extrait de code
Mais c'est moche et pas sémantique. Au lieu de cela, nous pourrions générer des pseudo-éléments à l'intérieur du conteneur flexible et les utiliser
order
pour les déplacer aux bons endroits.Afficher l'extrait de code
Mais il y a une limitation: le conteneur flexible ne peut avoir qu'un
::before
et un::after
pseudo-élément. Cela signifie que vous ne pouvez forcer que 2 sauts de ligne.Pour résoudre ce problème, vous pouvez générer les pseudo-éléments à l'intérieur des éléments flexibles plutôt que dans le conteneur flex. De cette façon, vous ne serez pas limité à 2. Mais ces pseudo-éléments ne seront pas des éléments flexibles, ils ne pourront donc pas forcer les sauts de ligne.
Mais heureusement, CSS Display L3 a introduit
display: contents
(actuellement uniquement pris en charge par Firefox 37):Vous pouvez donc appliquer
display: contents
aux enfants du conteneur flexible et envelopper le contenu de chacun dans un emballage supplémentaire. Ensuite, les éléments flexibles seront ces enveloppes supplémentaires et les pseudo-éléments des enfants.Afficher l'extrait de code
Alternativement, selon Fragmenting Flex Layout et CSS Fragmentation , Flexbox autorise les interruptions forcées en utilisant
break-before
,break-after
ou leurs alias CSS 2.1:Afficher l'extrait de code
Les sauts de ligne forcés dans Flexbox ne sont pas encore largement pris en charge, mais cela fonctionne sur Firefox.
la source
break-after
solution, qui ne nécessiterait que la modification d'un sélecteur dans la feuille de style.display: block;
aux classes.container
::before
et::after
pseudo pour faire fonctionner la solution numéro deux dans IE. YMMV!De mon point de vue, il est plus sémantique d'utiliser des
<hr>
éléments comme sauts de ligne entre les éléments flexibles.Testé dans Chrome 66, Firefox 60 et Safari 11.
la source
gap: 10px;
la distance entre les lignes est en fait20px
. Pour adresse, spécifier un intervalle de rangée de la moitié de cette taille:gap: 5px 10px;
.border
devrait être défini surnone
, au lieu de0
border:0;
est tout aussi valide queborder:none;
. Voir: stackoverflow.com/questions/2922909/…@Oriol a une excellente réponse, malheureusement en octobre 2017, ni l'un ni l'
display:contents
autrepage-break-after
n'est largement pris en charge, il vaut mieux dire qu'il s'agit de Firefox qui le supporte mais pas des autres joueurs, j'ai trouvé le "hack" suivant que je considère mieux que difficile coder dans une pause après chaque 3ème élément, car cela rendra très difficile la convivialité de la page mobile.Comme dit, c'est un hack et l'inconvénient est que vous devez ajouter pas mal d'éléments supplémentaires pour rien, mais il fait l'affaire et fonctionne sur plusieurs navigateurs même sur le IE11 daté.
Le "hack" consiste simplement à ajouter un élément supplémentaire après chaque div, qui est défini sur
display:none
puis utilisé le CSSnth-child
pour décider lequel de ceux-ci doit être rendu visible en forçant un frein de ligne comme ceci:la source
.container>p
. Ensuite, toutes ces<p></p>
balises n'auraient pas besoin de l'class
attribut. Pas important bien sûr. Juste mon cerveau paresseux qui trouve un petit ajustement peu encombrant à votre solution intelligente. Bien sûr, il repose également sur le fait que l'utilisateur n'a pas d'autres<p>
balises en tant qu'enfants directs de la.container
div. Techniquement, vous pourriez faire de même avec tous les autres<div>
enfants, mais vous avez beaucoup plus de chances d'avoir d'autres<div>
s dans le s.container
que vous<p>
, donc ce n'est probablement pas un choix judicieux.Vous voulez un saut de ligne sémantique?
Pensez ensuite à utiliser
<br>
. W3Schools peut vous suggérer queBR
c'est juste pour écrire des poèmes (le mien arrive bientôt) mais vous pouvez changer le style pour qu'il se comporte comme un élément de bloc de 100% de largeur qui poussera votre contenu à la ligne suivante. Si «br» suggère une pause, cela me semble plus approprié que d'utiliserhr
ou 100%div
et rend le HTML plus lisible.Insérez l'
<br>
endroit où vous avez besoin de sauts de ligne et stylisez-le comme ceci.Vous pouvez désactiver
<br>
avec les requêtes multimédias , en définissantdisplay:
surblock
ounone
selon le cas (j'ai inclus un exemple de cela mais je l'ai laissé en commentaire).Vous pouvez également utiliser
order:
pour définir la commande si nécessaire.Et vous pouvez en mettre autant que vous le souhaitez, avec différentes classes ou noms :-)
Pas besoin de vous limiter à ce que dit W3Schools:
la source
<br class="2col">
après chaque deuxième élément,<br class="3col">
après chaque troisième. Ensuite, appliquez une classecols-2
au conteneur et créez css pour activer uniquement les sauts de ligne appropriés pour ce nombre de colonnes. par exemple.br { display: none; } .cols-2 br.2col { display: block; }
br
n'est pas pour les éléments de saut de ligne , c'est pour le texte : developer.mozilla.org/en-US/docs/Web/HTML/Element/br ... stackoverflow.com/questions/3937515/…break-*
montré dans la réponse acceptée) bien que malheureusement il n'ait pas encore atteint les navigateurs croisés , donc le deuxième meilleur est d'utiliser un élément qui remplit nativement la largeur de son parent et de pousser tous les frères et sœurs suivants sur une ligne d'eux-mêmes, ce qui est à nouveau donné dans la réponse acceptée. Donc, en utilisant tout autre élément qu'un bloc comme celui-ci serait pire, sémantiquement, comme lebr
.Je pense que la méthode traditionnelle est flexible et assez facile à comprendre:
Marquage
Créez le fichier grid.css :
J'ai créé un exemple (jsfiddle)
Essayez de redimensionner la fenêtre sous 400px, c'est réactif !!
la source
Une autre solution possible qui ne nécessite pas d'ajouter de balisage supplémentaire consiste à ajouter une marge dynamique pour séparer les éléments.
Dans le cas de l'exemple, cela peut être fait à l'aide de
calc()
, simplement en ajoutantmargin-left
etmargin-right
à l'élément 3n + 2 (2, 5, 8)Exemple d'extrait
la source
calc
comme indiqué dans cette réponse.margin-right: 1px
l'article, et cela fera commencer l'article suivant à une nouvelle ligne.Pour les questions futures, il est également possible de le faire en utilisant la
float
propriété et en l'effaçant dans chacun des 3 éléments.Voici un exemple que j'ai fait.
la source
display: flex;
nondisplay: inline-block;
.cell:nth-child(3n + 1)
placeJ'ai essayé plusieurs réponses ici, et aucune n'a fonctionné. Ironiquement, ce qui a fonctionné était l'alternative la plus simple à celle que l'
<br/>
on pourrait essayer:<div style="flex-basis: 100%;"></div>
ou vous pouvez également faire:
<div style="width: 100%;"></div>
Placez-le où vous voulez une nouvelle ligne. Il semble fonctionner même avec des adjacents
<span>
, mais je l'utilise avec des adjacents<div>
.la source
flex-basis
.vous pouvez essayer d'envelopper les éléments dans un élément dom comme ici. Avec cela, vous n'avez pas besoin de connaître beaucoup de CSS simplement avoir une bonne structure résoudra le problème.
la source
display: block
et créer ces nouvelles flexbox de divs de niveau 2. Cela fonctionne pour les lignes. Remplacez les divs par des étendues lorsque vous utilisez le mode colonne.