1

In the code snippet below, you can see that I have a container element that has 3 children one, two and three.

Container has a height of 100vh, and children one and three take 50px each of that space and child two takes the rest of the space through flex: 1.

Now my question is how to prevent child two from growing if the content inside is takes more space than the remaining space it originally gets? Like imagine if I fill up child two with 100 <p>Hello</p> elements, I wouldn't want it to become bigger.

*, *:after, *:before {
    margin: 0;
    padding: 0;
    -webkit-box-sizing: border-box;
    box-sizing: border-box;
    text-decoration: none;
    list-style-type: none;
}
body {
    font-family: 'Roboto', 'Helvetica', 'Helvetica Neue', 'Arial', sans-serif;
}
.flex {
    display: flex;
}
.responsive-image {
    width: 100%;
    height: 100%;
}
.emoji {
    display: inline-block;
    width: 30px;
    height: 30px;
}
.chat {
    flex: 1;
    display: flex;
    flex-direction: column;
    background-color: #36393f;
    height: 100vh;
}
.chat-container {
    display: flex;
    flex-direction: column;
    height: 100%;
}
.selected-room-name {
    padding: 20px;
    color: #ffffff;
    font-weight: 500;
    font-size: 16px;
    border-bottom: 2px solid rgba(0, 0, 0, 0.2);
}
.image-container {
    width: 40px;
    height: 40px;
    border-radius: 50%;
    overflow: hidden;
    margin-right: 15px;
}
.messages {
    display: flex;
    flex-direction: column;
    justify-content: flex-end;
    flex: 1;
    padding: 20px;
    overflow: auto;
}
.message-body {
    display: flex;
    align-items: center;
}
.message {
    display: flex;
    align-items: center;
    background-color: #40444b;
    padding: 15px;
    border-radius: 10px;
    margin-bottom: 20px;
    color: #e0e0e0;
}
.message:last-child {
    margin-bottom: 0px;
}
.delete-message {
    display: none;
    margin-left: auto;
    cursor: pointer;
}
.message:hover > .delete-message {
    display: block;
}
.username-date-container {
    display: flex;
    margin-bottom: 10px;
}
.username {
    margin: 0 10px 0 0;
    font-weight: 500;
}
.date {
    display: flex;
    justify-content: center;
    align-items: center;
    font-size: 14px;
}
.form-container {
    display: flex;
    justify-content: center;
    align-items: center;
}
.emojis-button-container {
    position: relative;
    margin-right: 20px;
    background-color: #40444b;
    height: 46px;
    width: 46px;
    display: flex;
    justify-content: center;
    align-items: center;
    border-radius: 0px 5px 5px 0px;
}
.send-message {
    padding: 20px 0px 20px 20px;
    flex: 1;
}
.message-input {
    width: 100%;
    padding: 15px;
    outline: none;
    border: none;
    background-color: #40444b;
    color: #dcddde;
    font-size: 14px;
    border-radius: 5px 0 0 5px;
}
.emojis-button {
    cursor: pointer;
    height: 30px;
    width: 30px;
    filter: grayscale(100%);
    transition: all .2s ease-in-out;
}
.emojis-button:hover {
    filter: grayscale(0%);
    transform: scale(1.1);
}
.emojis-picker-container {
    position: absolute;
    top: -200px;
    right: 0;
    width: 100%;
    height: 200px;
    padding: 10px;
    display: flex;
    background-color: #2f3136;
}
<div class="chat">
        <div class='chat-container'>
            <p class='selected-room-name'>Server</p>
            <div class="messages">
                <div class='message'>
                    <div class="image-container">
                        <img class='responsive-image' src="https://api.adorable.io/avatars/100/BozhidarKabzamalov">
                    </div>
                    <div>
                        <div class="username-date-container">
                            <p class='username'>User</p>
                            <p class='date'>11111</p>
                        </div>
                        <p class='message-body'>Hey</p>
                    </div>
                    <i class="delete-message fas fa-times"></i>
                </div>
                <div class='message'>
                    <div class="image-container">
                        <img class='responsive-image' src="https://api.adorable.io/avatars/100/BozhidarKabzamalov">
                    </div>
                    <div>
                        <div class="username-date-container">
                            <p class='username'>User</p>
                            <p class='date'>11111</p>
                        </div>
                        <p class='message-body'>Hey</p>
                    </div>
                    <i class="delete-message fas fa-times"></i>
                </div>
<div class='message'>
                    <div class="image-container">
                        <img class='responsive-image' src="https://api.adorable.io/avatars/100/BozhidarKabzamalov">
                    </div>
                    <div>
                        <div class="username-date-container">
                            <p class='username'>User</p>
                            <p class='date'>11111</p>
                        </div>
                        <p class='message-body'>Hey</p>
                    </div>
                    <i class="delete-message fas fa-times"></i>
                </div>
<div class='message'>
                    <div class="image-container">
                        <img class='responsive-image' src="https://api.adorable.io/avatars/100/BozhidarKabzamalov">
                    </div>
                    <div>
                        <div class="username-date-container">
                            <p class='username'>User</p>
                            <p class='date'>11111</p>
                        </div>
                        <p class='message-body'>Hey</p>
                    </div>
                    <i class="delete-message fas fa-times"></i>
                </div>
<div class='message'>
                    <div class="image-container">
                        <img class='responsive-image' src="https://api.adorable.io/avatars/100/BozhidarKabzamalov">
                    </div>
                    <div>
                        <div class="username-date-container">
                            <p class='username'>User</p>
                            <p class='date'>11111</p>
                        </div>
                        <p class='message-body'>Hey</p>
                    </div>
                    <i class="delete-message fas fa-times"></i>
                </div>
<div class='message'>
                    <div class="image-container">
                        <img class='responsive-image' src="https://api.adorable.io/avatars/100/BozhidarKabzamalov">
                    </div>
                    <div>
                        <div class="username-date-container">
                            <p class='username'>User</p>
                            <p class='date'>11111</p>
                        </div>
                        <p class='message-body'>Hey</p>
                    </div>
                    <i class="delete-message fas fa-times"></i>
                </div>
                <div class='message'>
                    <div class="image-container">
                        <img class='responsive-image' src="https://api.adorable.io/avatars/100/BozhidarKabzamalov">
                    </div>
                    <div>
                        <div class="username-date-container">
                            <p class='username'>User</p>
                            <p class='date'>11111</p>
                        </div>
                        <p class='message-body'>Hey</p>
                    </div>
                    <i class="delete-message fas fa-times"></i>
                </div>
                <div class='message'>
                    <div class="image-container">
                        <img class='responsive-image' src="https://api.adorable.io/avatars/100/BozhidarKabzamalov">
                    </div>
                    <div>
                        <div class="username-date-container">
                            <p class='username'>User</p>
                            <p class='date'>11111</p>
                        </div>
                        <p class='message-body'>Hey</p>
                    </div>
                    <i class="delete-message fas fa-times"></i>
                </div>
                <div class='message'>
                    <div class="image-container">
                        <img class='responsive-image' src="https://api.adorable.io/avatars/100/BozhidarKabzamalov">
                    </div>
                    <div>
                        <div class="username-date-container">
                            <p class='username'>User</p>
                            <p class='date'>11111</p>
                        </div>
                        <p class='message-body'>Hey</p>
                    </div>
                    <i class="delete-message fas fa-times"></i>
                </div>
                <div class='message'>
                    <div class="image-container">
                        <img class='responsive-image' src="https://api.adorable.io/avatars/100/BozhidarKabzamalov">
                    </div>
                    <div>
                        <div class="username-date-container">
                            <p class='username'>User</p>
                            <p class='date'>11111</p>
                        </div>
                        <p class='message-body'>Hey</p>
                    </div>
                    <i class="delete-message fas fa-times"></i>
                </div>
                <div class='message'>
                    <div class="image-container">
                        <img class='responsive-image' src="https://api.adorable.io/avatars/100/BozhidarKabzamalov">
                    </div>
                    <div>
                        <div class="username-date-container">
                            <p class='username'>User</p>
                            <p class='date'>11111</p>
                        </div>
                        <p class='message-body'>Hey</p>
                    </div>
                    <i class="delete-message fas fa-times"></i>
                </div>
                <div class='message'>
                    <div class="image-container">
                        <img class='responsive-image' src="https://api.adorable.io/avatars/100/BozhidarKabzamalov">
                    </div>
                    <div>
                        <div class="username-date-container">
                            <p class='username'>User</p>
                            <p class='date'>11111</p>
                        </div>
                        <p class='message-body'>Hey</p>
                    </div>
                    <i class="delete-message fas fa-times"></i>
                </div>
            </div>
            <div class="form-container">
                <form class='send-message' >
                    <input class='message-input'  placeholder="Type a message">
                </form>
                <div>
                    <div class="emojis-picker-container" v-if='toggleEmojiWindow'>
                    </div>
                    <div class="emojis-button-container">
                    </div>
                </div>
            </div>
        </div>
    </div>
Onyx
  • 5,186
  • 8
  • 39
  • 86

1 Answers1

0

Add overflow: auto to child .two, so that a scrollbar is generated.

.container {
  display: flex;
  flex-direction: column;
  height: 100vh;
}

.one {
  height: 50px;
  flex-shrink: 0; /* disable flex shrink so the 50px height stays fixed */
  background-color: red;
}

.two {
  flex: 1;
  overflow: auto; /* KEY */
  background-color: green;
}

.three {
  height: 50px;
  flex-shrink: 0;
  background-color: blue;
}

body {
  margin: 0;
}
<div class='container'>
  <div class='one'></div>
  <div class='two'>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
    <p>text</p>
  </div>
  <div class='three'></div>
</div>
Michael Benjamin
  • 346,931
  • 104
  • 581
  • 701
  • Hey, while the changes on the basic example I've given work just fine, for some reason in my project, overflow: auto; doesn't make the div scrollable and instead it just outgrows its default remaining value. Any ideas what might possibly be causing this? – Onyx Sep 29 '20 at 04:01
  • Probably some conflicting code. Consider posting more from your project. – Michael Benjamin Sep 29 '20 at 04:07
  • I edited the code, it shows exactly what is happening on my side too. When I add overflow: auto, it doesn't show the scroll bar and I can't scroll the contents of the div. – Onyx Sep 29 '20 at 04:28