Reputation: 7250
I am using bootstrap
cards
with following styles:
height
and width
of .card
are set to be 500px
.card-header
is flexbox to align its content left
, right
and center
as shown in code..card-body
is overflowing with content so I have set it to be overflow-y: scroll
Problem:
Given above style constraints, if I want to set height
of .card-header
(example 100px
), its not working. However this height
setting will work fine if I remove flexbox from .card-header
I would like to know why this problem is occuring.
Code:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.2/css/bootstrap.min.css" integrity="sha384-Smlep5jCw/wG7hdkwQ/Z5nLIefveQRIY9nfy6xoR1uRYBtpZgI6339F5dgvm/e9B" crossorigin="anonymous">
</head>
<style>
.card{
width: 500px;
height: 500px;
}
.card-header{
height: 100px;/*remove this and header height will be 100px*/
display: flex;
justify-content: space-between;
align-items: center;
}
.card-body{
overflow-y: scroll;
}
.border-red{
border: 1px solid red;
}
</style>
<body>
<div class="card text-center">
<div class="card-header border-red ">
<div>left</div>
<div>center</div>
<div>right</div>
</div>
<div class="card-body">
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
</div>
</div>
</body>
</html>
Upvotes: 1
Views: 2519
Reputation: 5060
Card-header is a card's flex item so we have to work with its flex property. Try this:
Edit to explain why the following code works:
.card
is flex box with flex-direction:column
.card
is having two flex-item: .card-header
and .card-body
flexbox
, stated problem won't occur. But the moment it surpasses flexbox
height, flex-shrink
property of both flex-items come into play and shrinks the height of both of the items in equal proportion.flex-shrink
for .card-header
0
, meaning its height won't change when the height of .card-body
increases (beyond overflow)<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.1.2/css/bootstrap.min.css" integrity="sha384-Smlep5jCw/wG7hdkwQ/Z5nLIefveQRIY9nfy6xoR1uRYBtpZgI6339F5dgvm/e9B" crossorigin="anonymous">
</head>
<style>
.card{
width: 500px;
height: 500px;
}
.card-header{
flex: 1 0 100px;
display: flex;
justify-content: space-between;
align-items: center;
}
.card-body{
overflow-y: scroll;
}
.border-red{
border: 1px solid red;
}
</style>
<body>
<div class="card text-center">
<div class="card-header border-red ">
<div>left</div>
<div>center</div>
<div>right</div>
</div>
<div class="card-body">
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
<div>overflow</div>
</div>
</div>
</body>
</html>
Upvotes: 1