Based solely on the screenshot, I'd implement this as two elements: 2 and 3 would be a single div with a very large blue top border and a gray background color; the text-containing div would be inside it with a negative top margin to cause it to overlap the blue border:
#container {
padding: 2em;
background-color: lightgray;
border-top: 2em solid darkblue;
}
#inner {
background-color: white;
margin-top: -3em;
padding: 1em;
}
<div id="container">
<div id="inner">
Lorem ipsum dolor sit etcetera. Lorem ipsum dolor sit etcetera. Lorem ipsum dolor sit etceteraLorem ipsum dolor sit etcetera. Lorem ipsum dolor sit etceteraLorem ipsum dolor sit etcetera. Lorem ipsum dolor sit etcetera.
Lorem ipsum dolor sit etcetera. Lorem ipsum dolor sit etcetera. Lorem ipsum dolor sit etceteraLorem ipsum dolor sit etcetera. Lorem ipsum dolor sit etceteraLorem ipsum dolor sit etcetera. Lorem ipsum dolor sit etcetera.
Lorem ipsum dolor sit etcetera. Lorem ipsum dolor sit etcetera. Lorem ipsum dolor sit etceteraLorem ipsum dolor sit etcetera. Lorem ipsum dolor sit etceteraLorem ipsum dolor sit etcetera. Lorem ipsum dolor sit etcetera.
</div>
</div>
Normal, unmodified document flow will give you the resizing you want, as the container will naturally resize to fit its contents.
(In general, position:absolute
is to be avoided precisely because it interferes with the normal document flow; once you start specifying the exact absolute position of elements, you start having to do it for everything else around that element too. Gets ugly fast once you start having to take different screen sizes into account.)