Pour définir la distance minimale entre les éléments flexbox que j'utilise margin: 0 5px
sur .item
et margin: 0 -5px
sur le conteneur. Pour moi, cela ressemble à un hack, mais je ne peux pas trouver de meilleure façon de le faire.
#box {
display: flex;
width: 100px;
margin: 0 -5px;
}
.item {
background: gray;
width: 50px;
height: 50px;
margin: 0 5px;
}
<div id='box'>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
<div class='item'></div>
</div>
row-gap: 5px
- fait.gap
propriété sur les conteneurs flexibles ( caniuse )Réponses:
border-spacing
tableaux (à l'exception de la propriété CSSgap
qui n'est pas bien prise en charge dans la plupart des navigateurs, caniuse )Par conséquent, réaliser ce que vous demandez est un peu plus difficile.
D'après mon expérience, la manière la plus "propre" qui n'utilise pas
:first-child
/:last-child
et fonctionne sans aucune modificationflex-wrap:wrap
est de mettrepadding:5px
sur le conteneur etmargin:5px
sur les enfants. Cela produira un10px
écart entre chaque enfant et entre chaque enfant et ses parents.Démo
la source
order
propriété était définie?:first-child/:last-child
ne fonctionnera pas comme prévu.Ce n'est pas un hack. La même technique est également utilisée par le bootstrap et sa grille, bien qu'au lieu de la marge, le bootstrap utilise un remplissage pour ses colonnes.
la source
height:100%; width:100%
ignore le rembourrage de l'élément.flex-basis
valeurs ne tiennent pas comptebox-sizing: border-box
, donc un enfant avec un remplissage ou une bordure va déborder le parent (ou envelopper dans ce cas). SourceFlexbox et css calc avec prise en charge de plusieurs lignes
Bonjour, voici ma solution de travail pour tous les navigateurs prenant en charge flexbox. Pas de marges négatives.
Démo de violon
Notez que ce code peut être plus court en utilisant SASS
Mise à jour 2020.II.11 Colonnes alignées sur la dernière ligne à gauche
Update 2020.II.14 Suppression de la marge en bas de la dernière ligne
la source
justify-content
.justify-content: space-evenly;
oujustify-content: space-around;
.Vous pouvez utiliser des bordures transparentes.
J'ai envisagé ce problème en essayant de créer un modèle de grille flexible qui peut se replier sur un modèle tableaux + cellules de tableau pour les navigateurs plus anciens. Et les bordures pour gouttières m'ont semblé être le meilleur choix approprié. c'est-à-dire que les cellules du tableau n'ont pas de marges.
par exemple
Notez également que vous avez besoin
min-width: 50px;
de Flexbox. Le modèle flex ne prendra pas en charge les tailles fixes, sauf si vous le faitesflex: none;
sur l'élément enfant particulier que vous souhaitez fixe et donc exclu de l'être"flexi"
. http://jsfiddle.net/GLpUp/4/ Mais toutes les colonnes avecflex:none;
n'est plus un modèle flexible. Voici quelque chose de plus proche d'un modèle flex: http://jsfiddle.net/GLpUp/5/Vous pouvez donc utiliser les marges normalement si vous n'avez pas besoin du repli de cellule de tableau pour les anciens navigateurs. http://jsfiddle.net/GLpUp/3/
Le réglage
background-clip: padding-box;
sera nécessaire lors de l'utilisation d'un arrière-plan, sinon le fond coulera dans la zone de bordure transparente.la source
background-clip: padding-box
Cette solution fonctionnera pour tous les cas, même s'il y a plusieurs lignes ou un certain nombre d'éléments. Mais le compte de la section doit être le même que vous voulez 4 dans la première ligne et 3 dans la deuxième ligne, cela ne fonctionnera pas de cette façon, l'espace pour le 4e contenu sera vide, le conteneur ne remplira pas.
Nous utilisons
display: grid;
et ses propriétés.L'inconvénient de cette méthode est dans Mobile Opera Mini ne sera pas pris en charge et dans PC, cela ne fonctionne qu'après IE10 .
Remarque pour une compatibilité complète du navigateur, y compris IE11, veuillez utiliser le préfixe automatique
RÉPONSE ANCIENNE
Ne pensez pas que c'est une ancienne solution, c'est toujours l'une des meilleures si vous ne voulez qu'une seule ligne d'éléments et cela fonctionnera avec tous les navigateurs.
Cette méthode est utilisée par la combinaison de frères et sœurs CSS , vous pouvez donc la manipuler de nombreuses autres manières également, mais si votre combinaison est incorrecte, cela peut également causer des problèmes.
Le code ci-dessous fera l'affaire. Dans cette méthode, il n'est pas nécessaire de donner
margin: 0 -5px;
au#box
wrapper.Un échantillon de travail pour vous:
la source
grid-template-columns
définition que nous ne définissons pas dynamiquement. Donc, si vous donnez la valeur à1fr 1fr 1fr 1fr
alors il divisera le div en4fractions
et essaiera de remplir les éléments enfants dans chacunfractions
, à ma connaissance c'est le seul moyengrid
. Ce que j'ai déclaré dans la réponse, c'est que si l'utilisateur a besoin de diviser le div en 4 et de les utiliser avec de nombreux éléments, même pour plusieurs lignes, legid
sera utile.Vous pouvez utiliser
& > * + *
comme sélecteur pour émuler unflex-gap
(pour une seule ligne):Si vous devez prendre en charge le flex wrapping , vous pouvez utiliser un élément wrapper:
la source
*
opérateur n'augmente pas la spécificité comme vous pouvez vous y attendre. Ainsi, selon votre CSS existant, vous devrez peut-être augmenter la spécificité du.flex > *
sélecteur ou ajouter!important
à la règle s'il existe d'autres sélecteurs appliquant une marge à cet élément.Disons que si vous souhaitez définir un
10px
espace entre les éléments, vous pouvez simplement définir.item {margin-right:10px;}
pour tous et le réinitialiser sur le dernier.item:last-child {margin-right:0;}
Vous pouvez également utiliser le frère général
~
ou le+
sélecteur de frère suivant pour définir la marge gauche sur les éléments à l'exclusion du premier.item ~ .item {margin-left:10px;}
ou utiliser.item:not(:last-child) {margin-right: 10px;}
Flexbox est si intelligent qu'il recalcule automatiquement et distribue également la grille.
Si vous souhaitez autoriser le bouclage flexible , consultez l'exemple suivant.
la source
:last-child
cela n'affecte pas chaque dernier enfant à la fin d'une ligne, n'est-ce pas?J'ai trouvé une solution basée sur le sélecteur général de frères et sœurs,
~
et permettant une imbrication infinie.Voir ce stylo code pour un exemple de travail
Fondamentalement, à l'intérieur des conteneurs de colonnes, chaque enfant précédé d'un autre enfant obtient une marge supérieure. De même, à l'intérieur de chaque conteneur de lignes, chaque enfant précédé d'un autre obtient une marge gauche.
la source
En passant de la réponse de sawa, voici une version légèrement améliorée qui vous permet de définir un espacement fixe entre les éléments sans la marge environnante.
http://jsfiddle.net/chris00/s52wmgtq/49/
La version Safari "-webkit-flex" est également incluse.
la source
Selon #ChromDevSummit, il existe une implémentation de la
gap
propriété pour Flexbox, bien qu'à l'heure actuelle (14 novembre 2019), elle ne soit prise en charge que dans Firefox mais devrait être implémentée dans Chrome bientôt:Démo en direct
Je mettrai également à jour ma réponse une fois qu'elle arrivera sur Chrome.
la source
Je l'ai utilisé pour les colonnes enveloppées et à largeur fixe. La clé ici est
calc()
Échantillon SCSS
Échantillon Codepen complet
la source
Un conteneur flexible avec une marge -x (négative) et des éléments flexibles avec une marge x (positive) ou un rembourrage conduisent tous deux au résultat visuel souhaité: les éléments flexibles ont un espace fixe de 2x uniquement entre eux.
Il semble que ce soit simplement une question de préférence, qu'il s'agisse d'utiliser une marge ou un rembourrage sur les éléments flexibles.
Dans cet exemple, les éléments flexibles sont mis à l'échelle dynamiquement afin de préserver l'écart fixe:
la source
Finalement, ils ajouteront la
gap
propriété à flexbox. Jusque-là, vous pouvez utiliser à la place une grille CSS qui a déjà lagap
propriété et avoir une seule ligne. Plus agréable que de gérer les marges.la source
CSS
gap
Propriété :Il existe une nouvelle
gap
propriété CSS pour les dispositions multi-colonnes, flexbox et grille qui fonctionne maintenant dans certains navigateurs! (Voir Puis-je utiliser le lien 1 ; lien 2 ).Au moment de l'écriture, cela ne fonctionne malheureusement que dans Firefox. Il fonctionne actuellement dans Chrome si vous activez «Activer les fonctionnalités expérimentales de la plate-forme Web» dans
about:flags
.la source
En utilisant Flexbox dans ma solution, j'ai utilisé la
justify-content
propriété de l'élément parent (conteneur) et j'ai spécifié les marges à l'intérieur de laflex-basis
propriété des éléments. Vérifiez l'extrait de code ci-dessous:la source
Avec Flexbox, la création de gouttières est pénible, en particulier lorsque l'emballage est impliqué.
Vous devez utiliser des marges négatives ( comme indiqué dans la question ):
... ou modifiez le HTML ( comme indiqué dans une autre réponse ):
... ou autre chose.
Dans tous les cas, vous avez besoin d'un hack laid pour le faire fonctionner car flexbox ne fournit pas de fonctionnalité "
flex-gap
" ( du moins pour l'instant ).Le problème des gouttières, cependant, est simple et facile avec CSS Grid Layout.
La spécification de grille fournit des propriétés qui créent de l'espace entre les éléments de la grille, tout en ignorant l'espace entre les éléments et le conteneur. Ces propriétés sont:
grid-column-gap
grid-row-gap
grid-gap
(le raccourci pour les deux propriétés ci-dessus)Récemment, la spécification a été mise à jour pour se conformer au module CSS Box Alignment , qui fournit un ensemble de propriétés d'alignement à utiliser sur tous les modèles de boîtes. Les propriétés sont donc maintenant:
column-gap
row-gap
gap
(sténographie)Cependant, tous les navigateurs prenant en charge Grid ne prennent pas en charge les nouvelles propriétés, donc j'utiliserai les versions originales dans la démo ci-dessous.
De plus, si un espacement est nécessaire entre les articles et le conteneur,
padding
le conteneur fonctionne très bien (voir le troisième exemple dans la démo ci-dessous).De la spécification:
Plus d'information:
la source
Pourquoi ne pas le faire comme ça:
Il utilise le sélecteur frère adjacent pour donner à tous les
.item
éléments, sauf le premier amargin-left
. Grâce à flexbox, cela donne même des éléments tout aussi larges. Cela pourrait également être fait avec des éléments positionnés verticalement etmargin-top
, bien sûr.la source
Voici ma solution, qui ne nécessite pas de définir de classes sur les éléments enfants:
Usage:
La même technique peut être utilisée pour les lignes et colonnes flexibles normales en plus de l'exemple en ligne donné ci-dessus, et étendue avec des classes d'espacement autres que 4px.
la source
J'utilise souvent l'opérateur + pour de tels cas
la source
Je trouve que la façon la plus simple de le faire est d'utiliser des pourcentages et de laisser la marge correspondre à votre largeur
Cela signifie que vous vous retrouvez avec quelque chose comme ça si vous utilisez votre exemple
Cela signifie que vos valeurs sont basées sur la largeur, ce qui pourrait ne pas être bon pour tout le monde.
la source
Voici une grille d'éléments d'interface utilisateur de carte avec un espacement complété à l'aide d'une boîte flexible:
J'étais frustré par l'espacement manuel des cartes en manipulant le remplissage et les marges avec des résultats douteux. Voici donc les combinaisons d'attributs CSS que j'ai trouvées très efficaces:
J'espère que cela aide les gens, présents et futurs.
la source
Columnify - Une classe solo pour N colonnes
Flexbox et SCSS
Flexbox et CSS
Jouez avec sur JSFiddle .
la source
la source
Utilisez simplement le
.item + .item
sélecteur pour faire correspondre la seconde.item
la source
En supposant:
Définissez une marge gauche sur chaque élément sauf le 1er, le 5e, le 9e élément, etc. et définissez une largeur fixe sur chaque article. Si la marge de gauche est de 10 pixels, chaque ligne aura une marge de 30 pixels entre 4 éléments, le pourcentage de largeur de l'élément peut être calculé comme suit:
Il s'agit d'une solution de contournement décente pour les problèmes impliquant la dernière ligne de flexbox.
la source
Il existe en effet un moyen agréable, bien rangé et uniquement CSS de faire cela (que l'on peut considérer comme "meilleur").
De toutes les réponses publiées ici, je n'ai trouvé qu'une seule qui utilise avec succès calc () (par Dariusz Sikorski). Mais lorsque posé avec: "mais il échoue s'il n'y a que 2 éléments dans la dernière ligne", il n'y a pas eu de solution développée.
Cette solution répond à la question du PO avec une alternative aux marges négatives et résout le problème posé à Dariusz.
Remarques:
calc()
permet au navigateur de faire les calculs comme il le souhaite -100%/3
(bien que 33,3333% devraient fonctionner aussi bien) , et(1em/3)*2
(bien que 0,66em devrait également bien fonctionner) .::after
pour remplir la dernière ligne s'il y a moins d'éléments que de colonnesÉgalement sur https://codepen.io/anon/pen/rqWagE
la source
Vous pouvez utiliser la nouvelle propriété
gap
. Je copie-colle l'explication que j'ai trouvée dans cet article , ainsi que plus d'informationsMalheureusement pour le moment, seul FireFox prend en charge l'écart dans les dispositions flexibles.
la source
gap
a déjà été recommandé dans une réponse ici stackoverflow.com/a/58041749/2756409 En outre, ce n'est pas CSS.Cela ne fonctionnera pas dans tous les cas, mais si vous avez des largeurs enfants flexibles (%) et connaissez le nombre d'éléments par ligne, vous pouvez spécifier très clairement les marges des éléments nécessaires en utilisant le
nth-child
/ les sélecteur / s.Cela dépend en grande partie de ce que vous entendez par «mieux». De cette façon, ne nécessite pas de balisage wrapper supplémentaire pour les éléments enfants ou les éléments négatifs - mais ces choses ont toutes les deux leur place.
la source
J'ai rencontré le même problème plus tôt, puis suis tombé sur la réponse à cela. J'espère que cela aidera les autres pour référence future.
réponse longue et courte, ajoutez une bordure à vos articles flexibles pour enfants. vous pouvez ensuite spécifier des marges entre les éléments flexibles à votre guise. Dans l'extrait, j'utilise du noir à des fins d'illustration, vous pouvez utiliser «transparent» si vous le souhaitez.
la source
L'astuce de marge négative sur le conteneur de boîte fonctionne très bien. Voici un autre exemple qui fonctionne très bien avec l'ordre, l'emballage et ce qui ne fonctionne pas.
la source