Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Margin-bottom not working in flexbox

I have an issue where I have a flexbox, but I don't exactly want every single element to be spaced according to the properties given, so I want to play with margins.

I have a header at the top of the box but I want spacing between it and the rest of the elements.

So I want my list of p elements to be grouped together but spaced farther away from the heading.

However, when I do margin-bottom it isn't having an effect (when I increase or decrease margin-bottom nothing changes).

I was originally doing it in percents and changed it to pixels but that doesn't seem to be the issue either.

In the snippet I would have no problem with how it looks but on a bigger browser there's hardly any space between the heading and the p elements which is the issue.

.container {
  display: flex;
  position: relative;
  flex-wrap: wrap;
  justify-content: flex-start;
  align-items: stretch;
  min-height: 70vh;
  width: 70%;
  margin: 5% auto 8% auto;
  background-color: white;
}
.container p {
  margin-bottom: 2%;
}
.container h2 {
  color: orange;
  font-size: 34px;
}
.middle p:first-child {
  margin-top: 8%;
}
.bspace {
  margin-bottom: 50px;
}
.box h2 {
  color: orange;
  text-align: center;
}
.left {
  display: flex;
  flex-flow: row wrap;
  align-items: center;
  justify-content: space-around;
  order: 1;
  width: 30%;
}
.middle {
  display: flex;
  flex-flow: column wrap;
  order: 2;
  width: 45%;
  height: 100%;
}
<div class="container">
  <div class="left">
    <img src="home.jpg" alt="Picture of kid">
    <img src="catering.jpg" alt="Picture of kid">
  </div>
  <div class="middle">
    <h2 class="bspace"> Some Text </h2>
    <p>Sample</p>
    <p>Sample</p>
    <p>Sample</p>
    <p>Sample</p>
  </div>
</div>
like image 634
Shinji-san Avatar asked Sep 03 '16 15:09

Shinji-san


1 Answers

Remove the height declaration from the flex item (also a nested flex container):

.middle {
    display: flex;
    flex-flow: column wrap;
    order: 2;
    width: 45%;
    /* height: 100%;  <-- REMOVE */
}

This is overriding the default align-items: stretch on the container, which will naturally give the element full height.

Because you're using height: 100% improperly, it's not working as you expect. It's computing to height: auto (content height) because you haven't specified a height on the parent. Hence, there was no space available for the <p> elements to move further away. Just get rid of it. Flex height is simpler and easier.

Then, to space the <p> elements away from the header, use a flex auto margin.

.bspace {
    margin-bottom: auto;  /* previous value `50px` in your code */
}

Alternatively, you could use margin-top: auto on the first <p>, which will have the same effect.

.container {
  display: flex;
  position: relative;
  flex-wrap: wrap;
  justify-content: flex-start;
  align-items: stretch;
  min-height: 70vh;
  width: 70%;
  margin: 5% auto 8% auto;
  background-color: lightyellow;
}
.container p {
  margin-bottom: 2%;
}
.container h2 {
  color: orange;
  font-size: 34px;
}
.middle p:first-child {
  margin-top: 8%;
}
.bspace {
  /* margin-bottom: 50px; */
  margin-bottom: auto;
  /* new */
}
.box h2 {
  color: orange;
  text-align: center;
}
.left {
  display: flex;
  flex-flow: row wrap;
  align-items: center;
  justify-content: space-around;
  order: 1;
  width: 30%;
  border: 1px dashed red;
}
.middle {
  display: flex;
  flex-flow: column wrap;
  order: 2;
  width: 45%;
  /* height: 100%; */
  border: 1px dashed green;
}
<div class="container">
  <div class="left">
    <img src="home.jpg" alt="Picture of kid">
    <img src="catering.jpg" alt="Picture of kid">
  </div>
  <div class="middle">
    <h2 class="bspace"> Some Text </h2>
    <p>Sample</p>
    <p>Sample</p>
    <p>Sample</p>
    <p>Sample</p>
  </div>
</div>

jsFiddle

like image 197
Michael Benjamin Avatar answered Oct 20 '22 02:10

Michael Benjamin