Reputation: 65
Can you somehow turn off margin of child which touches parent container?
For example i have 4 div with margin set to 20 px in one line in div with padding 10 px. can first and last div dont use thier left or right margin?
what i want: 10px [div] 40px [div] 40px [div] 40px [div] 10px
instead of: 30px [div] 40px [div] 40px [div] 40px [div] 30px
html
<div class='parent'>
<div class='child'></div>
<div class='child'></div>
<div class='child'></div>
<div class='child'></div>
</div>
css
.parent{
display: flex;
padding: 10px;
}
.child{
maring 20px;
width: 100px;
height: 100px;
}
Edit: What about having more rows of such divs in there any easy way to make every first and last div to behave in such a way?
Upvotes: 2
Views: 7926
Reputation: 463
All you need to depend on :first-child css pseudo-selectors to remove margin from first element.
.parent{display: flex; padding: 10px; border:solid 1px red;}
.parent .child{margin:20px 0px 20px 40px; width: 100px; height: 100px; border:solid 1px green;}
.parent .child:first-child{margin-left:0;}
<div class='parent'>
<div class='child'>h</div>
<div class='child'>1</div>
<div class='child'>2</div>
<div class='child'>3</div>
</div>
Upvotes: 0
Reputation: 145
You just use .child:first-child and .child:last-child pseudo selector
.parent{
display: flex;
padding: 10px;
}
.child{
margin: 20px;
width: 100px;
height: 100px;
}
.child:first-child {
margin-left: 0;
}
.child:last-child {
margin-right: 0;
}
<div class='parent'>
<div class='child'>dfgdfg</div>
<div class='child'>dfgdfg</div>
<div class='child'>dfgdfg</div>
<div class='child'>dgfdg</div>
</div>
Upvotes: 0
Reputation: 272965
This is more suitable for CSS grid where you can consider gaps:
.parent{
display: grid;
grid-template-columns:repeat(auto-fit,minmax(100px,1fr));
grid-column-gap:40px;
padding:10px;
border:1px solid;
}
.child{
height: 100px;
background:red;
}
<div class='parent'>
<div class='child'></div>
<div class='child'></div>
<div class='child'></div>
<div class='child'></div>
<div class='child'></div>
<div class='child'></div>
<div class='child'></div>
</div>
Upvotes: 0
Reputation: 19109
You can chain the negation pseudo-class and include left and right margin
for every other matching child element.
Unless I misunderstand you, the CSS
I've already written will work with n
parent/child pairs. I added a few more parent/child pairs to show you that it's working as described.
.parent {
display: flex;
padding: 10px;
}
.child {
margin-top: 20px;
margin-bottom: 20px;
width: 100px;
height: 100px;
}
.child:not(:first-child):not(:last-child) {
margin-left: 20px;
margin-right: 20px;
}
<div class='parent'>
<div class='child'>1</div>
<div class='child'>2</div>
<div class='child'>3</div>
<div class='child'>4</div>
</div>
<div class='parent'>
<div class='child'>1</div>
<div class='child'>2</div>
<div class='child'>3</div>
<div class='child'>4</div>
</div>
<div class='parent'>
<div class='child'>1</div>
<div class='child'>2</div>
<div class='child'>3</div>
<div class='child'>4</div>
</div>
Upvotes: 0
Reputation: 15509
You can use :first-child and :last-child css pseudo-selectors to remove tthe margin on these items. Note that I have added borders to show the items.
.parent{
display: flex;
padding: 10px;
border: solid 1px red;
}
.child{
margin: 20px;
width: 100px;
height: 100px;
border: solid 1px blue;
}
.child:first-child {
margin-left: 0;
}
.child:last-child {
margin-right: 0;
}
<div class='parent'>
<div class='child'>test 1</div>
<div class='child'>test 2</div>
<div class='child'>test 3</div>
<div class='child'>test 4</div>
</div>
Alternatively - you can use the sibling combinator to add margins between adjacent .child elements
.parent{
display: flex;
padding: 10px;
border: solid 1px red;
}
.child{
margin: 20px 0;
width: 100px;
height: 100px;
border: solid 1px blue;
}
.child + .child{
margin-left: 40px;
}
<div class='parent'>
<div class='child'>test 1</div>
<div class='child'>test 2</div>
<div class='child'>test 3</div>
<div class='child'>test 4</div>
</div>
Upvotes: 2