我目前正在制作一个悬停动画,目标是实现以下效果: Link to expected animation

我已经创建了一个Code Sandbox来展示我目前的方法.

此动画中使用的资源可以是found here.

我对任何关于悬停动画的建议或改进都持开放态度.任何真知灼见都将不胜感激.谢谢!

我很难控制动画的循环.

<div class="wrapper">
  <div class="card">
    <div class="wrap"></div>
  </div>
</div>

body {
  background: #000;
}

.wrapper {
  width: 400px;
  height: 200px;
  margin: auto;
}
.card {
  z-index: 1;
  height: 200px;
  position: relative;
  background: #2c2c2c;
  border-radius: 8px;
  cursor: pointer;
}

.card::before {
  content: "";
  position: absolute;
  left: -2px;
  top: -2px;
  background-image: url("./bg-2.png");
  background-size: 100% 100%;
  background-repeat: no-repeat;
  width: calc(100% + 4px);
  height: calc(100% + 4px);
  z-index: -1;
  transition: all 0.5s ease-in-out;
  clip-path: inset(0 0 0 0);
}

.card:hover::before {
  animation: clippath 0.9s linear forwards;
}

.card:not(:hover)::before {
  clip-path: inset(0 0 0 0);
  transition: all 0.5s ease-in-out;
  background-image: url("./bg-1.png");
}

.wrap {
  background: #2c2c2c;
  border-radius: 8px;
  height: 200px;
}

@keyframes clippath {
  0%,
  100% {
    -webkit-clip-path: inset(0 0 0 0);
    clip-path: inset(0 0 0 0);
  }
  25% {
    -webkit-clip-path: inset(0 98% 0 0);
    clip-path: inset(0 0 0 98%);
  }
  50% {
    -webkit-clip-path: inset(98% 0 0 0);
    clip-path: inset(98% 0 0 0);
  }
  75% {
    -webkit-clip-path: inset(0 0 0 98%);
    clip-path: inset(0 98% 0 0);
  }
}

推荐答案

您可以使用背景线性渐变来获得褪色的边框效果.设置两个渐变,一个与另一个重叠.最上面的是按钮的 colored颜色 .最下面的一个是你想要达到的效果.使用填充框和边框分别定位背景,以使淡入淡出的背景一直到边框边缘.

然后,您可以使用fairly recent @property规则来设置背景动画.这不是fully supported yet,但除了Firefox之外,它的覆盖范围相当不错.不过,它省go 了很多css.请参见下面的内容.

body {
  background: black;
}

@property --angle {
  syntax: '<angle>';
  inherits: false;
  initial-value: 135deg;
}

.button {
  width: 20rem;
  height: 12rem;
  border-radius: 2rem;
  background-color: #2c2c2c;
  padding: 0.75rem;
  color: white;
  background: linear-gradient(0deg, #2c2c2c, #2c2c2c), 
              linear-gradient(var(--angle), gray 10%, transparent 30%, transparent 70%, gray 100%);
  border: 0.5rem solid transparent;
  background-clip: padding-box,
                   border-box;
  background-origin: padding-box,
                     border-box;
  transition: --angle 250ms;
}

.button:hover {
  --angle: 45deg;
}
<div class='button'>Some text</div>

Html相关问答推荐

srcset和大小总是下载最大的

使用固定的HTML代码创建两个可向右滚动的行

如何只混合部分的背景而不是内容<>

连续的相同 colored颜色 单元格应位于同一列、网格框中

使用无限数量的元素创建特定的CSS网格

仅向上扩展并以最大高度滚动的Div

按钮之间的HTML文本居中不正确

使用CSS Flexbox时,我的图像未对齐

如何在VB.NET中用打印预览和直接打印的方式在Html中打印数据表的内容,包括页眉/设置纸张/方向/适合页面/总计

使用CSS和Slick Carcass使图像适合屏幕

如何在css中旋转块时调整内容宽度、高度

如何将多个类名组合到CSS中的一个关键帧

Web 组件 #shadow-root css 泄漏到文档

为什么可滚动弹性项目需要 flex-basis: 0 ?

jQuery 索引返回不正确的结果

一旦大于最大限制,JQuery 取消 Select 复选框

实验的响应式屏幕尺寸

如何为Vuetify输入控件减小标签和字段之间的间距?

弹出窗口溢出溢出:自动,我不明白为什么

将固定/绝对伪元素放置在相对 div(具有滚动条)内,始终位于底部