Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Maintain equal width on flexbox columns when adding a margin

Tags:

html

css

flexbox

I have the following two-column layout using flexbox:

body {
  margin: 0;
}

.grid {
  display: flex;
}

.column {
  /* Equal width columns */
  flex: 1;
  /* Center content */
  display: flex;
  flex-direction: column;
  justify-content: center;
}

img {
  display: block;
  /* Site wide to make images responsive */
  max-width: 100%;
  height: auto;
  /* Cover column */
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: right center;
}

h2 {
  margin: 0 0 24px;
}

p {
  margin: 0 0 24px;
}

a,
a:hover,
a:visited,
a:focus {
  color: #000;
}
<div class="grid">
  <div class="column">
    <img src="https://hackernoon.com/hn-images/1*mONNI1lG9VuiqovpnYqicA.jpeg" alt="Bad Ass Cat">
  </div>
    <div class="column">
    <h2>Here's a Heading</h2>
    <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum aliquam ut ex at fermentum. Proin nec eros at elit mollis porttitor. Vivamus vestibulum luctus metus, ac gravida felis varius nec. Praesent non mauris et tortor lacinia cursus quis at turpis. Nullam scelerisque vitae leo nec convallis. Proin volutpat, est non iaculis facilisis, tellus tortor pulvinar lectus, eu porttitor diam dui eget enim. Praesent non ipsum dui.</p>
    <a href="#">Click Me</a>
  </div>
</div>

As you can see, the columns are equal in width and height at any viewport width.

I'd like to add a margin to the last column which contains text. Here's what I've tried:

body {
  margin: 0;
}

.grid {
  display: flex;
}

.column {
  /* Equal width columns */
  flex: 1;
  /* Center content */
  display: flex;
  flex-direction: column;
  justify-content: center;
}

.content {
  margin: 96px;
}

img {
  display: block;
  /* Site wide to make images responsive */
  max-width: 100%;
  height: auto;
  /* Cover column */
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: right center;
}

h2 {
  margin: 0 0 24px;
}

p {
  margin: 0 0 24px;
}

a,
a:hover,
a:visited,
a:focus {
  color: #000;
}
<div class="grid">
  <div class="column">
    <img src="https://hackernoon.com/hn-images/1*mONNI1lG9VuiqovpnYqicA.jpeg" alt="Bad Ass Cat">
  </div>
    <div class="column content">
      <h2>Here's a Heading</h2>
      <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum aliquam ut ex at fermentum. Proin nec eros at elit mollis porttitor. Vivamus vestibulum luctus metus, ac gravida felis varius nec. Praesent non mauris et tortor lacinia cursus quis at turpis. Nullam scelerisque vitae leo nec convallis. Proin volutpat, est non iaculis facilisis, tellus tortor pulvinar lectus, eu porttitor diam dui eget enim. Praesent non ipsum dui.</p>
      <a href="#">Click Me</a>
  </div>
</div>

In this example, I've added a margin to the .content column to give the text some breathing room. I assumed flexbox would account for the margin, but it doesn't.

Next, I tried the following:

body {
  margin: 0;
}

html {
	box-sizing: border-box;
}

.grid {
  display: flex;
}

.column {
  /* Equal width columns */
  flex: 1;
  /* Center content */
  display: flex;
  flex-direction: column;
  justify-content: center;
}

.content {
  margin: 96px;
}

img {
  display: block;
  /* Site wide to make images responsive */
  max-width: 100%;
  height: auto;
  /* Cover column */
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: right center;
}

h2 {
  margin: 0 0 24px;
}

p {
  margin: 0 0 24px;
}

a,
a:hover,
a:visited,
a:focus {
  color: #000;
}
<div class="grid">
  <div class="column">
    <img src="https://hackernoon.com/hn-images/1*mONNI1lG9VuiqovpnYqicA.jpeg" alt="Bad Ass Cat">
  </div>
    <div class="column">
      <div class="content">
        <h2>Here's a Heading</h2>
        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum aliquam ut ex at fermentum. Proin nec eros at elit mollis porttitor. Vivamus vestibulum luctus metus, ac gravida felis varius nec. Praesent non mauris et tortor lacinia cursus quis at turpis. Nullam scelerisque vitae leo nec convallis. Proin volutpat, est non iaculis facilisis, tellus tortor pulvinar lectus, eu porttitor diam dui eget enim. Praesent non ipsum dui.</p>
        <a href="#">Click Me</a>
      </div>
  </div>
</div>

In this example, I've added a <div class="content"> tag with a margin within the text column. The columns are now equal in width at any viewport and there's breathing room for the text. This is what I am trying to achieve.

My question: Unfortunately, I'm not able to access the backend for this project, so I'm not able to add a <div class="content"> tag to the text column. Is there a way to add a margin to the text column without adding a <div class="content"> tag? I guess I can add a margin to my <h2>, <p> and <a> elements, but I'm hoping there is a more efficient way.

like image 930
Sam Avatar asked Apr 19 '26 07:04

Sam


1 Answers

Maybe flex-basis can help:

body {
  margin: 0;
}

html {
	box-sizing: border-box;
}

.grid {
  display: flex;
}

.column {

  display: flex;
  flex-direction: column;
  justify-content: center;
}

.one {
  flex-basis: 50%
}

.two {
  flex: 1;
  margin: 0 10vw;
}

img {
  display: block;
  /* Site wide to make images responsive */
  max-width: 100%;
  height: auto;
  /* Cover column */
  width: 100%;
  height: 100%;
  object-fit: cover;
  object-position: right center;
}

h2 {
  margin: 0 0 24px;
}

p {
  margin: 0 0 24px;
}

a,
a:hover,
a:visited,
a:focus {
  color: #000;
}
<div class="grid">
  <div class="column one">
    <img src="https://hackernoon.com/hn-images/1*mONNI1lG9VuiqovpnYqicA.jpeg" alt="Bad Ass Cat">
  </div>
    <div class="column two">

        <h2>Here's a Heading</h2>
        <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum aliquam ut ex at fermentum. Proin nec eros at elit mollis porttitor. Vivamus vestibulum luctus metus, ac gravida felis varius nec. Praesent non mauris et tortor lacinia cursus quis at turpis. Nullam scelerisque vitae leo nec convallis. Proin volutpat, est non iaculis facilisis, tellus tortor pulvinar lectus, eu porttitor diam dui eget enim. Praesent non ipsum dui.</p>
        <a href="#">Click Me</a>

  </div>
</div>
like image 153
Liveindream Avatar answered Apr 21 '26 23:04

Liveindream



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!