Flexbox может хорошо работать для этого макета.
body,
html {
padding: 0;
margin: 0;
}
.main-wrapper {
position: absolute;
top: 0;
bottom: 0;
right: 0;
left: 0;
display: flex;
flex-direction: column;
justify-content: space-between;
}
.messages {
background: cornflowerblue;
overflow-y: scroll;
}
.input-wrapper {
padding: 30px;
background: cadetblue;
}
.sent {
background: cyan;
padding: 30px;
}
.sent+.sent {
margin-top: 20px;
}
input {
display: block;
}
<div class="main-wrapper">
<div class="messages">
<div class="sent">test</div>
<div class="sent">test</div>
<div class="sent">test</div>
<div class="sent">test</div>
<div class="sent">test</div>
<div class="sent">test</div>
</div>
<div class="input-wrapper">
<input type="text">
<button>Send</button>
<button>Audio</button>
</div>
</div>
Или даже сетка
body,
html {
padding: 0;
margin: 0;
}
.main-wrapper {
position: absolute;
top: 0;
bottom: 0;
right: 0;
left: 0;
display: grid;
grid-template-rows: 1fr auto;
}
.messages {
background: cornflowerblue;
overflow-y: scroll;
}
.input-wrapper {
padding: 30px;
background: cadetblue;
}
.sent {
background: cyan;
padding: 30px;
}
.sent+.sent {
margin-top: 20px;
}
input {
display: block;
}
<div class="main-wrapper">
<div class="messages">
<div class="sent">test</div>
<div class="sent">test</div>
<div class="sent">test</div>
<div class="sent">test</div>
<div class="sent">test</div>
<div class="sent">test</div>
</div>
<div class="input-wrapper">
<input type="text">
<button>Send</button>
<button>Audio</button>
</div>
</div>
Вам придется прокручивать контейнер .messages
до конца каждый раз, когда новое сообщение отправляется.
Примечание: Я склоненизбегайте использования vh для таких макетов, если это возможно, из-за проблем с ios safari.