Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Masking - Show div only on top of certain div?

I am trying to create an "eye blink" animation with HTML and CSS.

What I would want, is that when the eyes blink, the eyeballs are not showing.

As you can see from the code, the eyes consists of 4 elements.

Div "eyes" is the container where the eyes are.

Div "eye1" and "eye2".

Div "eyemask", that has the blinking effect.

Div "eyeball1" and "eyeball2". These should only show on top of the "eyemask", not on top of the "eye1" and "eye2".

Could someone help me to achieve this?

body {
  margin: 0px;
}

#container {
  position: absolute;
  z-index: 100;
  width: 300px;
  height: 300px;
  background: lightblue;
  display: flex;
  justify-content: center;
  align-items: center;
}

#eyes {
  position: absolute;
  z-index: 12;
  width: 120px;
  height: 100px;
  display: flex;
  justify-content: space-between;
  align-items: center;
}

#eye1,
#eye2 {
  z-index: 12;
}

#eye1,
#eye2,
#eyemask {
  position: absolute;
  width: 50px;
  height: 50px;
  background: #eee;
  display: flex;
  justify-content: center;
  align-items: center;
  clip-path: circle(50% at 50% 50%);
}

#eye2 {
  transform: translateX(60px);
}

#eyemask {
  background: #fff;
  animation-name: blink;
  animation-duration: 5s;
  animation-iteration-count: infinite;
}

@keyframes blink {
  0% {
    transform: scaleY(1);
  }
  20% {
    transform: scaleY(1);
  }
  30% {
    transform: scaleY(0);
  }
  40% {
    transform: scaleY(1);
  }
  100% {
    transform: scaleY(1);
  }
}

#eyeball1,
#eyeball2 {
  position: absolute;
  z-index: 11;
  width: 10px;
  height: 10px;
  background: #000;
  clip-path: circle(50% at 50% 50%);
}
<head>
  <link rel="stylesheet" type="text/css" href="Eyes.css">
</head>

<body>
  <div id="container">
    <div id="eyes">
      <div id="eye1">
        <div id="eyemask"></div>
        <div id="eyeball1"></div>
      </div>
      <div id="eye2">
        <div id="eyemask"></div>
        <div id="eyeball2"></div>
      </div>
    </div>
  </div>
</body>

Could someone here help me to achieve this?

like image 262
Tane Avatar asked Oct 11 '19 09:10

Tane


2 Answers

You can simplify your code like below and rely on a clip-path animation:

.eyes {
  padding:20px;
  background: lightblue;
  display: inline-flex;
}

.eyes span{
  width: 80px;
  height: 80px;
  background:grey;
  border-radius:50%;
  margin:10px;
  position:relative;
}
.eyes span:before {
  content:"";
  position:absolute;
  top:0;
  left:0;
  right:0;
  bottom:0;
  background:radial-gradient(black 7px, white 8px);
  animation:blink 0.8s linear infinite alternate;
}
@keyframes blink {
  from {
    clip-path: ellipse(50% 50% at 50% 50%);  
  }
  to {
    clip-path: ellipse(50%  0% at 50% 50%);
  }
}
<div class="eyes">
  <span></span>
  <span></span>
</div>
like image 106
Temani Afif Avatar answered Nov 15 '22 05:11

Temani Afif


Make the #eyeball inside the #eyemask and that should do it

body {
  margin: 0px;
}

#container {
  position: absolute;
  z-index: 100;
  width: 300px;
  height: 300px;
  background: lightblue;
  display: flex;
  justify-content: center;
  align-items: center;
}

#eyes {
  position: absolute;
  z-index: 12;
  width: 120px;
  height: 100px;
  display: flex;
  justify-content: space-between;
  align-items: center;
}

#eye1,
#eye2 {
  z-index: 12;
}

#eye1,
#eye2,
#eyemask {
  position: absolute;
  width: 50px;
  height: 50px;
  background: #eee;
  display: flex;
  justify-content: center;
  align-items: center;
  clip-path: circle(50% at 50% 50%);
}

#eye2 {
  transform: translateX(60px);
}

#eyemask {
  background: #fff;
  animation-name: blink;
  animation-duration: 5s;
  animation-iteration-count: infinite;
}

@keyframes blink {
  0% {
    transform: scaleY(1);
  }
  20% {
    transform: scaleY(1);
  }
  30% {
    transform: scaleY(0);
  }
  40% {
    transform: scaleY(1);
  }
  100% {
    transform: scaleY(1);
  }
}

#eyeball1,
#eyeball2 {
  position: absolute;
  z-index: 11;
  width: 10px;
  height: 10px;
  background: #000;
  clip-path: circle(50% at 50% 50%);
}
<head>
  <link rel="stylesheet" type="text/css" href="Eyes.css">
</head>

<body>
  <div id="container">
    <div id="eyes">
      <div id="eye1">
        <div id="eyemask">
          <div id="eyeball1"></div>
        </div>
      </div>
      <div id="eye2">
        <div id="eyemask">
          <div id="eyeball2"></div>
        </div>
      </div>
    </div>
  </div>
</body>
like image 36
Nidhin Joseph Avatar answered Nov 15 '22 04:11

Nidhin Joseph