Reputation: 49220
I want to add slide-up and slide-down animation when I hover over a div card.
Initial card:
When I hover over the card:
The yellow part should slide-up and when I remove the hover it should slide-down till it's not visible.
I'm able to show and hide yellow part on hover but I'm not able to animate it. I guess because of top: 182px; bottom: auto;
(use to hide yellow part and position purple part at bottom) and top:auto;bottom:0;
(to completely show yellow card irrespective of it's height)
Here's the code:
.card{
margin-right:20px;
display: inline-block;
padding: 0;
border-radius: 19px;
box-shadow: 0 6px 10px 0 rgba(0, 0, 0, 0.2);
overflow: hidden;
height: 200px;
background-color:#2196f3;
position:relative;
text-align:center;
}
.image{
padding:50px;
}
.content{
border-radius: 0 0 19px 19px;
background-color: #673AB7;
position: absolute;
width: 100%;
top: 182px;
bottom: auto;
}
.desc{
background-color:#ffeb3b;
}
.card:hover .content{
top: auto;
transition: all 2s ease;
bottom: 0px;
}
<div class='card'>
fixed height card
<div class='image'>
fixed height image
</div>
<div class='content'>
<div class='title'>
fixed height title
</div>
<div class='desc'>
=:variable height description:= Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut
labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud the end.
</div>
</div>
</div>
<div class='card'>
fixed height card
<div class='image'>
fixed height image
</div>
<div class='content'>
<div class='title'>
fixed height title
</div>
<div class='desc'>
=:variable height description:= Lorem ipsum dolor sit amet, consectecing elit, sed do eiusmod tempor incididunt ut the end.
</div>
</div>
</div>
Here's the JSFiddle to play around: http://jsfiddle.net/JerryGoyal/63c8hbr5/
I'm open to ideas as long as it can be done with CSS only!
Upvotes: 3
Views: 1731
Reputation: 64164
You are right inabout needing to use always the same position technique.
You need to stick to bottom, and then set a translateY
.card {
margin-right: 20px;
display: inline-block;
padding: 0;
border-radius: 19px;
box-shadow: 0 6px 10px 0 rgba(0, 0, 0, 0.2);
overflow: hidden;
height: 200px;
background-color: #2196f3;
position: relative;
text-align: center;
}
.image {
padding: 50px;
}
.content {
border-radius: 0 0 19px 19px;
background-color: #673AB7;
position: absolute;
width: 100%;
bottom: 18px;
transform: translateY(100%);
transition: all 2s ease;
}
.desc {
background-color: #ffeb3b;
}
.card:hover .content {
bottom: 0px;
transform: translateY(0%);
}
<div class='card'>
fixed height card
<div class='image'>
fixed height image
</div>
<div class='content'>
<div class='title'>
fixed height title
</div>
<div class='desc'>
=:variable height description:= Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud the end.
</div>
</div>
</div>
<div class='card'>
fixed height card
<div class='image'>
fixed height image
</div>
<div class='content'>
<div class='title'>
fixed height title
</div>
<div class='desc'>
=:variable height description:= Lorem ipsum dolor sit amet, consectecing elit, sed do eiusmod tempor incididunt ut the end.
</div>
</div>
</div>
Upvotes: 4
Reputation: 13407
Changed the transition to work on desc
div instead of content
. Also transitions don't work on auto
property. Try using max-height property like i have shown. The max-height should be some very large height that your div can get.
Updated CSS
.card {
margin-right: 20px;
display: inline-block;
padding: 0;
border-radius: 19px;
box-shadow: 0 6px 10px 0 rgba(0, 0, 0, 0.2);
overflow: hidden;
height: 200px;
background-color: #2196f3;
position: relative;
text-align: center;
}
.image {
padding: 50px;
}
.content {
border-radius: 0 0 19px 19px;
background-color: #673AB7;
position: absolute;
width: 100%;
bottom: 0;
}
.desc {
background-color: #ffeb3b;
max-height: 0;
transition: all 2s ease;
}
.card:hover .desc {
max-height: 500px;
}
.card {
margin-right: 20px;
display: inline-block;
padding: 0;
border-radius: 19px;
box-shadow: 0 6px 10px 0 rgba(0, 0, 0, 0.2);
overflow: hidden;
height: 200px;
background-color: #2196f3;
position: relative;
text-align: center;
}
.image {
padding: 50px;
}
.content {
border-radius: 0 0 19px 19px;
background-color: #673AB7;
position: absolute;
width: 100%;
bottom: 0;
}
.desc {
background-color: #ffeb3b;
max-height: 0;
transition: all 2s ease;
}
.card:hover .desc {
max-height: 500px;
}
<div class='card'>
fixed height card
<div class='image'>
fixed height image
</div>
<div class='content'>
<div class='title'>
fixed height title
</div>
<div class='desc'>
=:variable height description:= Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud the end.
</div>
</div>
</div>
<div class='card'>
fixed height card
<div class='image'>
fixed height image
</div>
<div class='content'>
<div class='title'>
fixed height title
</div>
<div class='desc'>
=:variable height description:= Lorem ipsum dolor sit amet, consectecing elit, sed do eiusmod tempor incididunt ut the end.
</div>
</div>
</div>
Upvotes: 2
Reputation: 203
You may use keyframes to add animation on your hover content.
.card{
margin-right:20px;
display: inline-block;
padding: 0;
border-radius: 19px;
box-shadow: 0 6px 10px 0 rgba(0, 0, 0, 0.2);
overflow: hidden;
height: 200px;
background-color:#2196f3;
position:relative;
text-align:center;
}
.image{
padding:50px;
}
.content{
border-radius: 0 0 19px 19px;
background-color: #673AB7;
position: absolute;
width: 100%;
top: 182px;
bottom: auto;
animation-name: slideFromTop;
-webkit-animation-name: slideFromTop;
animation-duration: 800ms;
-webkit-animation-duration: 800ms;
animation-timing-function: ease-out;
-webkit-animation-timing-function: ease-out;
animation-fill-mode: forwards;
-webkit-animation-fill-mode: forwards;
}
.desc{
background-color:#ffeb3b;
}
.card:hover .content{
top: auto;
bottom: 0px;
animation-name: slideFromBottom;
-webkit-animation-name: slideFromBottom;
animation-duration: 800ms;
-webkit-animation-duration: 800ms;
animation-timing-function: ease-in;
-webkit-animation-timing-function: ease-in;
animation-fill-mode: forwards;
-webkit-animation-fill-mode: forwards;
}
@keyframes slideFromBottom {
0%{
opacity:0;
-webkit-transform: translateY(100%);
-moz-transform: translateY(100%);
-ms-transform: translateY(100%);
-o-transform: translateY(100%);
transform: translateY(100%);
}
100%{
opacity: 1;
-webkit-transform: translateY(0px);
-moz-transform: translateY(0px);
-ms-transform: translateY(0px);
-o-transform: translateY(0px);
transform: translateY(0px);
display: block;
}
}
@keyframes slideFromTop {
0%{
opacity:1;
-webkit-transform: translateY(0px);
-moz-transform: translateY(0px);
-ms-transform: translateY(0px);
-o-transform: translateY(0px);
transform: translateY(0px);
}
100%{
opacity: 0;
-webkit-transform: translateY(100%);
-moz-transform: translateY(100%);
-ms-transform: translateY(400%);
-o-transform: translateY(100%);
transform: translateY(100%);
}
}
<div class='card'>
fixed height card
<div class='image'>
fixed height image
</div>
<div class='content'>
<div class='title'>
fixed height title
</div>
<div class='desc'>
=:variable height description:= Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut
labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud the end.
</div>
</div>
</div>
<div class='card'>
fixed height card
<div class='image'>
fixed height image
</div>
<div class='content'>
<div class='title'>
fixed height title
</div>
<div class='desc'>
=:variable height description:= Lorem ipsum dolor sit amet, consectecing elit, sed do eiusmod tempor incididunt ut the end.
</div>
</div>
</div>
You may check this link for JSFiddle
Hope It Helps you!
Cheers!
Upvotes: 0