'How to keep a paragraph height even when there is no text in it?

The problem is that I have two skinny boxes as in the code below. Both of them have a child paragraph. The first paragraph has some text in it, the second one does not. Again, the problem is that when text is gone any paragraph loses its height, I wanna keep that somehow.

I wanna keep the height of the second paragraph as if there was one line of text (the font-size is defined), how can I do that using CSS ?

.drunk-container {
   display: flex;
}

.skinny-box {
  height: 70px;
  width: 300px;
  outline: 1px solid blue;
  
  padding: 10px;
  box-sizing: border-box;
}

p {
  font-size: 1.2rem;
  color: green;
  outline: 1px solid red;
}
<div class="drunk-container">

  <div class="skinny-box">
    <p>Some text ... </p>
  </div>

  <div class="skinny-box">
    <p></p>
  </div>
  
</div>


Solution 1:[1]

Add an empty element inside when it's empty. Works with any font-size

.drunk-container {
   display: flex;
  font-size: 1.2rem;
}

.skinny-box {
  width: 300px;
  outline: 1px solid blue;
  
  padding: 10px;
  box-sizing: border-box;
}

p {
  color: green;
  outline: 1px solid red;
}

p:empty::before {
  content:"";
  display:inline-block;
}
<div class="drunk-container">

  <div class="skinny-box">
    <p>Some text ... </p>
  </div>

  <div class="skinny-box">
    <p></p>
  </div>
  
</div>

<div class="drunk-container" style="font-size:2rem;">

  <div class="skinny-box">
    <p>Some text ... </p>
  </div>

  <div class="skinny-box">
    <p></p>
  </div>
  
</div>

Or like below that would support all the cases (even multi line)

.drunk-container {
   display: flex;
  font-size: 1.2rem;
}

.skinny-box {
  width: 300px;
  outline: 1px solid blue;
  display:flex; /* here */
  padding: 10px;
  box-sizing: border-box;
}

p {
  color: green;
  flex-grow:1; /* and here */
  outline: 1px solid red;
}
<div class="drunk-container">

  <div class="skinny-box">
    <p>Some text ... </p>
  </div>

  <div class="skinny-box">
    <p></p>
  </div>
  
</div>

<div class="drunk-container" style="font-size:2rem;">

  <div class="skinny-box">
    <p>Some text ... </p>
  </div>

  <div class="skinny-box">
    <p></p>
  </div>
  
</div>

<div class="drunk-container" style="font-size:2rem;">

  <div class="skinny-box">
    <p>Some<br> text ... </p>
  </div>

  <div class="skinny-box">
    <p></p>
  </div>
  
</div>

Solution 2:[2]

There are a lot of ways of doing this, I would add a min-height to the <p> like so:

p {
    min-height: 22px;
}

.drunk-container {
   display: flex;
}

.skinny-box {
  height: 70px;
  width: 300px;
  outline: 1px solid blue;
  
  padding: 10px;
  box-sizing: border-box;
}

p {
  font-size: 1.2rem;
  color: green;
  min-height: 22px;
  outline: 1px solid red;
}
<div class="drunk-container">

  <div class="skinny-box">
    <p>Some text ... </p>
  </div>

  <div class="skinny-box">
    <p></p>
  </div>
  
</div>

To support multi-line <p> I would suggest some JS:

const p1 = document.getElementById('p1');
const p2 = document.getElementById('p2');
p2.style.minHeight = p1.clientHeight + 'px';
.drunk-container {
   display: flex;
}

.skinny-box {
  height: 150px;
  width: 300px;
  outline: 1px solid blue;
  
  padding: 10px;
  box-sizing: border-box;
}

p {
  font-size: 1.2rem;
  color: green;
  outline: 1px solid red;
}
<div class="drunk-container">

  <div class="skinny-box">
    <p id='p1'>Some<br>mutliline<br>text</p>
  </div>

  <div class="skinny-box">
    <p id='p2'></p>
  </div>
  
</div>

Solution 3:[3]

Can you please check the below code? Hope it will work for you. You have to add min-height: calc(100% - 30px); to p tag and this 30px value is depend upon total margin of p tag.

Please refer to this link: https://jsfiddle.net/yudizsolutions/qax3egj5/2/

.drunk-container {
   display: flex;
}

.skinny-box {
  height: 70px;
  width: 300px;
  outline: 1px solid blue;
  
  padding: 10px;
  box-sizing: border-box;
}

p {
  font-size: 1.2rem;
  color: green;
  outline: 1px solid red;
  margin: 15px 0;
  min-height: calc(100% - 30px);
}
<div class="drunk-container">

  <div class="skinny-box">
    <p>Some text ... </p>
  </div>

  <div class="skinny-box">
    <p></p>
  </div>
  
</div>

Solution 4:[4]

You could simply define a minimum height to your paragraph on the css level like this min-height: 21px; check out the code below and let me know if it helps.

.drunk-container {
   display: flex;
}

.skinny-box {
  height: 70px;
  width: 300px;
  outline: 1px solid blue;
  
  padding: 10px;
  box-sizing: border-box;
}

p {
  font-size: 1.2rem;
  color: green;
  outline: 1px solid red;
  min-height: 21px;
}
<div class="drunk-container">

  <div class="skinny-box">
    <p>Some text ... </p>
  </div>

  <div class="skinny-box">
    <p></p>
  </div>
  
</div>

Solution 5:[5]

How about just adding some dummy "placeholder" text to the second para and making its colour the same as that of your background.

.drunk-container {
   display: flex;
}

.skinny-box {
  height: 70px;
  width: 300px;
  outline: 1px solid blue;
  
  padding: 10px;
  box-sizing: border-box;
}

p {
  font-size: 1.2rem;
  color: green;
  outline: 1px solid red;
}
<div class="drunk-container">

  <div class="skinny-box">
    <p>Some text ... </p>
  </div>

  <div class="skinny-box">
    <p style="color: white;">!</p>
  </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
Solution 3 Yudiz Solutions
Solution 4 mw509
Solution 5