'Set margin on bootstrap cols without affecting width
I am trying to display a list of card width boostrap. I made my html like so :
<div class="card-deck">
<div class="card card-widget col-sm-2 m-2">
<div class="card-body text-center">
TEXT
</div>
</div>
<div>
etc...
</div>
</div>
The problem is, margin seems to expand the cards' width. So it makes someting like that... (it should display 4 cols)
If I remove margins, it makes something like...
Thanks for your help !
Solution 1:[1]
Thanks for your answers. However it does not solve my problem :(
First solution : I cannot do that easily because I get them from a database so I don't know how many elements will be returned and I do really want to make a new deck card every 4 cards. The justify-content-center is not really elegant and it shifts the problem
Second solution : It looks like my second screen : https://i.stack.imgur.com/erkcT.jpg
Solution 2:[2]
You must use padding, don't margin if you don't want any cards size change.
change
<div class="card card-widget col-sm-2 m-2">
with this
<div class="card card-widget col-sm-2 p-2">
<div class="card-deck">
<div class="card card-widget col-sm-2 p-2">
<div class="card-body text-center">
TEXT
</div>
</div>
<div>
etc...
</div>
</div>
Solution 3:[3]
Margin can not increase the width of card like that. However, it will definitely increase container's width.
APPROACH 1: Check the code below. It will assign equal widths to the cards.
NOTE : It is working like row-column feature of bootstrap. So you have to add n number of card elements in a card-deck for n number of columns.
<div class="card-deck mx-2 mt-2">
<div class="card card-widget col m-2">
<div class="card-body text-center">
TEXT
</div>
</div>
<div class="card card-widget col m-2">
<div class="card-body text-center">
TEXT
</div>
</div>
<div class="card card-widget col m-2">
<div class="card-body text-center">
TEXT
</div>
</div>
<div class="card card-widget col m-2">
<div class="card-body text-center">
TEXT
</div>
</div>
</div>
<div class="card-deck mx-2">
<div class="card card-widget col m-2">
<div class="card-body text-center">
TEXT
</div>
</div>
<div class="card card-widget col m-2">
<div class="card-body text-center">
TEXT
</div>
</div>
<div class="card card-widget col m-2">
<div class="card-body text-center">
TEXT
</div>
</div>
<div class="card card-widget col m-2">
<div class="card-body text-center">
TEXT
</div>
</div>
</div>
APPROACH 2: In case you don't want to change card's width :
<div class="card-deck m-2 mb-0 justify-content-center">
<div class="card card-widget col-sm-2 m-2">
<div class="card-body text-center">
TEXT
</div>
</div>
<div class="card card-widget col-sm-2 m-2">
<div class="card-body text-center">
TEXT
</div>
</div>
<div class="card card-widget col-sm-2 m-2">
<div class="card-body text-center">
TEXT
</div>
</div>
<div class="card card-widget col-sm-2 m-2">
<div class="card-body text-center">
TEXT
</div>
</div>
</div>
Solution 4:[4]
(Bootstrap 5)
I was able to solve the problem by wrapping the card in a column first (which is what the documentation recommends). This appears to apply an mx-2 margin as a default, though I can't actually find out why this is the case. In any case it allowed me to get a margin between cards without breaking the grid.
<div class="container">
<div class="row">
<div class="col-lg-4 my-2">
<div class="card">
</div>
</div>
<div class="col-lg-4 my-2">
<div class="card">
</div>
</div>
...etc
</div>
</div>
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | |
| Solution 2 | VL93 |
| Solution 3 | |
| Solution 4 | unusualhabit |
