width: 100% of an absolute positioned element is bigger than the parent

By making any element position: absolute; means: place me to the first parent that is position: relative; which is not always equal to its parent element.

And if there are other children you need to remember that one of them will be places "under" the element posiotionated absolutely.


One reason an absolutely-positioned child element can stick out from its relatively-positioned parent is if the parent has padding.

Take the following example:

.parent {
  position: relative;
  padding: 50px;
  width: 250px;
  height: 50px;
  margin: auto;
  background-color: blue;
}
.child {
  position: absolute;
  width: 100%;
  height: 100%;
  background-color: #ff000099;
}
<div class="parent">
  <div class="child"></div>
</div>

As you can see, the actual width and height of the child is the same as the parent, however since the parent has padding-top and padding-left, the child's content is placed after the parent's padding. This makes the child stick out at the bottom and the right.

There are different ways to handle this, depending on the desired outcome.

If you want the child to perfectly cover the parent, either use bets's solution and set the top, right, bottom and left attributes on the child instead of the width and height, or just keep the width and height at 100% and set top and left to 0, like this:

.parent {
  position: relative;
  padding: 50px;
  width: 250px;
  height: 50px;
  margin: auto;
  background-color: blue;
}
.child {
  position: absolute;
  width: 100%;
  height: 100%;
  top: 0;
  left: 0;
  background-color: #ff000044;
}
<div class="parent">
  I am parent content
  <div class="child">I am child content</div>
</div>

If you want the child to occupy all the space within the padding on the parent, you can use calc() to remove the parent's padding from the child div:

.parent {
  position: relative;
  padding: 50px;
  width: 250px;
  height: 50px;
  margin: auto;
  background-color: blue;
}
.child {
  position: absolute;
  width: calc(100% - 100px);
  height: calc(100% - 100px);
  background-color: #ff000099;
}
<div class="parent">
  <div class="child"></div>
</div>

(Just remember to remove both the left and right padding from the child's width and the top and bottom from its height. That's why I am multiplying the padding by 2.)

Combining these, if you want the child to start after the top and left padding, but not stick out the right or bottom, only subtract the top and left paddings from the height and width of the child:

.parent {
  position: relative;
  padding: 50px;
  width: 250px;
  height: 50px;
  margin: auto;
  background-color: blue;
}
.child {
  position: absolute;
  width: calc(100% - 50px);
  height: calc(100% - 50px);
  background-color: #ff000099;
}
<div class="parent">
  <div class="child"></div>
</div>

Accepted answer didn't solve it for me. Parent element was already position: relative;.

This is what worked for me:

In the child element, instead of using height:100% use top:0; bottom:0; to fill up height, and left:0; right:0; to fill width up.

.child {
  top: 0; 
  bottom: 0;
  left: 0; 
  right: 0;
}

Tags:

Html

Css