溢出:隐藏不适用于 :after 和 :before 伪元素

overflow: hidden doesn't work on :after and :before pseudo elements

我正在制作这个带有箭头的圆形向下滚动按钮。在悬停时,我想应用一个动画,使箭头从上方移动到圆形 div 下方,并且它应该在 div 之外时隐藏。 我尝试使用 overflow: hidden 但由于某种原因它不起作用。请问有人对此有解决方案吗?

代码笔:https://codepen.io/RaphaelleD/pen/vYpqxpm

@keyframes tipUp {
  0% {
    transform: translateY(-10px) rotateZ(225deg);
  }
  100% {
    transform: translateY(100px) rotateZ(225deg);
  }
}

@keyframes lineUp {
  0% {
    transform: translateY(-10px);
  }
  100% {
    transform: translateY(100px);
  }
}

.scrolldown {
  position: relative;
  margin: 0 auto;
 }
  
.scrolldown p {
    font-size: 1rem;
    font-weight: 600;
    padding-bottom: 0.8rem;
    text-align: center;
  }
 
 .scrolldown__arrow {
    width: 6rem;
    height: 6rem;
    border: 6px solid black;
    border-radius: 50%;
    margin: 0 auto;
    overflow: hidden;
  }
  
 .scrolldown__arrow:before {
    position: absolute;
    display: inline-block;
    content: "";
    background: black;
    width: 10px;
    height: 45px;
    top: 50%;
    left: 50%;
    margin-top: -50px;
    margin-left: -5px;
    transform: translateY(50px);
  }
 
 .scrolldown__arrow:after {
    position: absolute;
    display: inline-block;
    content: "";
    width: 22px;
    height: 22px;
    color: black;
    border-top: 9px solid;
    border-left: 9px solid;
    transform: rotateZ(45deg);
    top: 50%;
    left: 50%;
    margin-top: -30px;
    margin-left: -15.5px;
    transform: translateY(50px) rotateZ(225deg);
  }
 
.scrolldown__arrow:hover:before {
      animation: lineUp 1s cubic-bezier(0, 0.6, 1, 0.4) infinite 0.5s;
    }

.scrolldown__arrow:hover:after {
      animation: tipUp 1s cubic-bezier(0, 0.6, 1, 0.4) infinite 0.5s;
    }
  }
}
<body>

  <div class="scrolldown">
    <p>SCROLL DOWN</p>
    <div class="scrolldown__arrow"></div> 
  </div>

</body>

我相信这是因为 position: absolute,它使箭头脱离了正常流程。为了在流程中保留它,我将 position: relative 添加到箭头父级,并且还必须调整顶部位置,似乎按预期工作:

@keyframes tipUp {
  0% {
    transform: translateY(-10px) rotateZ(225deg);
  }
  100% {
    transform: translateY(100px) rotateZ(225deg);
  }
}

@keyframes lineUp {
  0% {
    transform: translateY(-10px);
  }
  100% {
    transform: translateY(100px);
  }
}

.scrolldown {
  position: relative;
  margin: 0 auto;
 }
  
.scrolldown p {
    font-size: 1rem;
    font-weight: 600;
    padding-bottom: 0.8rem;
    text-align: center;
  }
 
 .scrolldown__arrow {
    width: 6rem;
    height: 6rem;
    border: 6px solid black;
    border-radius: 50%;
    margin: 0 auto;
    overflow: hidden;
    position: relative;
  }
  
 .scrolldown__arrow:before {
    position: absolute;
    display: inline-block;
    content: "";
    background: black;
    width: 10px;
    height: 45px;
    top: 25%;
    left: 50%;
    margin-top: -50px;
    margin-left: -5px;
    transform: translateY(50px);
  }
 
 .scrolldown__arrow:after {
    position: absolute;
    display: inline-block;
    content: "";
    width: 22px;
    height: 22px;
    color: black;
    border-top: 9px solid;
    border-left: 9px solid;
    transform: rotateZ(45deg);
    top: 25%;
    left: 50%;
    margin-top: -30px;
    margin-left: -15.5px;
    transform: translateY(50px) rotateZ(225deg);
  }
 
.scrolldown__arrow:hover:before {
      animation: lineUp 1s cubic-bezier(0, 0.6, 1, 0.4) infinite 0.5s;
    }

.scrolldown__arrow:hover:after {
      animation: tipUp 1s cubic-bezier(0, 0.6, 1, 0.4) infinite 0.5s;
    }
  }
}
<body>

  <div class="scrolldown">
    <p>SCROLL DOWN</p>
    <div class="scrolldown__arrow"></div> 
  </div>

</body>