I am trying to place one overlay div over another so that on hover on the card div displays overlay div above it. But on hover, I don't know why there is some bug which creates a fluctuating effect before displaying the overlay div.
.overlay {
	opacity: 0;
	z-index: -2;
	height: 290px;
	width: 240px;
	background: #000;
	border-radius: 30px; 
	/*display: inline-block;*/
	position: relative;
	top: -310px;
	transition: all .4s ease;
}
.card:hover + .overlay {
	opacity: 1;
	z-index: 1;
	transition: all .4s ease;
}
	<div class="card" style="background: #fff; height: 290px; width: 240px; border-radius: 30px; display: inline-block; margin:20px; box-shadow: 0 2px 6px rgba(112,112,112,0.2);"><img src="thumb.png" height="60%;"></div>
	<div class="overlay"></div>
What am I doing wrong here?
That's because the z-index of the overlay increases by hovering the .card. But now you no longer hovering the .card, you are hovering the .overlay and so it disappears.
To fix this, you should add a .overlay:hover style too:
.overlay {
	opacity: 0;
	z-index: -2;
	height: 290px;
	width: 240px;
	background: #000;
	border-radius: 30px; 
	/*display: inline-block;*/
	position: relative;
	top: -310px;
	transition: all .4s ease;
}
.card:hover + .overlay, .overlay:hover {
	opacity: 1;
	z-index: 1;
	transition: all .4s ease;
}
<div class="card" style="background: #fff; height: 290px; width: 240px; border-radius: 30px; display: inline-block; margin:20px; box-shadow: 0 2px 6px rgba(112,112,112,0.2);"><img src="thumb.png" height="60%;"></div>
<div class="overlay"></div>
Another idea is to prevent the overlay from catching events (hover in this case) by using pointer-events: none; so that you don't lose the initial hover applied to the card:
.overlay {
  opacity: 0;
  z-index: -2;
  height: 290px;
  width: 240px;
  background: #000;
  border-radius: 30px;
  pointer-events: none;
  position: relative;
  top: -310px;
  transition: all .4s ease;
}
.card:hover+.overlay {
  opacity: 1;
  z-index: 1;
  transition: all .4s ease;
}
.card {
  background: red;
  height: 290px;
  width: 240px;
  border-radius: 30px;
  display: inline-block;
  margin: 20px;
  box-shadow: 0 2px 6px rgba(112, 112, 112, 0.2);
}
<div class="card"></div>
<div class="overlay"></div>
You can also simplify your code using pseudo element:
.card:before {
  content:"";
  position: absolute;
  opacity: 0;
  z-index: -2;
  top:20px;
  right:20px;
  left:-20px;
  bottom:-20px;
  background: #000;
  border-radius: 30px;
  pointer-events: none;
  transition: all .4s ease;
}
.card:hover::before {
  opacity: 1;
  z-index: 1;
  transition: all .4s ease;
}
.card {
  position:relative;
  background: red;
  height: 290px;
  width: 240px;
  border-radius: 30px;
  display: inline-block;
  margin: 20px;
  box-shadow: 0 2px 6px rgba(112, 112, 112, 0.2);
}
<div class="card"></div>
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With