Michal333
Michal333

Reputation: 65

Css how to override child margin with parent padding?

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

Answers (5)

Growyour GK
Growyour GK

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

Mamun
Mamun

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

Temani Afif
Temani Afif

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

Andy Hoffman
Andy Hoffman

Reputation: 19109

You can chain the negation pseudo-class and include left and right margin for every other matching child element.

Update

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

gavgrif
gavgrif

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

Related Questions