I’m working on the following files:
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
background: #e4e4e4;
text-align: center;
}
.content {
background: #fff;
padding: 20px 40px;
width: 60%;
margin: 20px auto;
}
.container {
border: 1px solid black;
padding: 0 40px 40px 40px;
background: #fff;
}<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<link rel="stylesheet" href="style.css" />
<title>Document</title>
</head>
<body>
<div class="content">
<div id="d1" class="container">
1
<div id="d2" class="container">
2
<div id="d3" class="container">3</div>
</div>
</div>
</div>
</body>
</html>The result I want to achieve is that when I hover a certain div, its background changes to a #ccc grey color.
However what adds some difficulty is that I want only the area that belongs only to the innermost hovered div to change background color, not the child or parent.
Here is a picture to show the behavior I want for example when hovering the second div:
EDIT: I ALSO WANT THE BACKGROUND COLOR TO BE RESET TO WHITE WHEN THE MOUSE IS OUTSIDE AN AREA
EDIT 2: IS THIS DOABLE WITH ONLY CSS OR IS JAVASCRIPT MANDATORY?
Advertisement
Answer
Some magic using pseudo element and box-shadow:
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
background: #e4e4e4;
text-align: center;
}
.content {
background: #fff;
padding: 20px 40px;
width: 60%;
margin: 20px auto;
position:relative;
z-index:0; /* this is important */
overflow:hidden; /* hide the extra box-shadow */
}
.container {
border: 1px solid black;
padding: 0 40px 40px 40px;
position:relative; /* dont forget relative here */
background:#fff;
}
.container::before,
.container::after{
content:"";
position:absolute;
z-index:-1;
top:-1px;
left:-1px;
right:-1px;
bottom:-1px;
}
.container::before {
background:grey;
}
/* on hover */
.container:hover::after {
box-shadow:0 0 0 200vmax #fff; /* hide the upper div */
}
.container:hover {
background:transparent; /* make the hovered div transaprent to see the "before" element */
}
/**/<div class="content">
<div id="d1" class="container">
1
<div id="d2" class="container">
2
<div id="d3" class="container">3</div>
</div>
</div>
</div>
