【问题标题】:Unsure of how to implement this transition/animation不确定如何实现此过渡/动画
【发布时间】:2018-08-11 05:15:54
【问题描述】:

所以我能够创建一个“翻牌”元素;但是,我的问题是我正在尝试使用 transform: scale() 缩放整个元素,以便在旋转大约一半时,我希望元素开始扩展到更大的尺寸/比例。

只是不确定我是使用动画、多个动画还是仅使用过渡...或过渡 + 动画...只是有点困惑什么是最有效的方法。

我尝试了动画 + 过渡,如下图所示,但它非常有问题,而且表现得不可预测。

html, body {
  background: #f2edea;
  height: 100%;
  width: 100%;
}

img {
  width: 100%;
  max-height: 100%;
}

.flipcard {
  width: 150px;
  height: 200px;
  margin: auto;
  top: 20%;
  position: relative;
  box-shadow: 5px 5px 20px #c4c4c4;
  border: 3px solid #b8b8ba;
  border-radius: 5px;
  background: pink;
  transform-style: preserve-3d;
  transition: transform 2s;
} 

@keyframes grow {
  from {
    transform: scale(0);
  }
  to {
    transform: scale(2);
  }
}

.flipcard:hover {
  transform: rotateY(180deg);
  animation: grow 1s; 
}

.front-side  {
  height: 100%;
  width: 100%;
  position: relative;
  backface-visibility: hidden;
  
}

.back-side {
  width: 100%;
  height: 100%;
  transform: rotateY(180deg);
  position: absolute;
  top: 0;
  border-radius: 3px;
}
<div class='flipcard'>
  <div class='front-side'>
    <img src='https://pre00.deviantart.net/4121/th/pre/i/2018/059/6/7/brigitte_by_raikoart-dc4kzas.png'>
  </div>
  <div class='back-side'>
    <img src="https://img00.deviantart.net/e0ec/i/2017/297/8/c/mercy_by_raikoart-dbrm54b.png">
  </div>
</div>

【问题讨论】:

  • 动画完成后的期望行为是什么?卡在悬停时保持翻转状态并在未悬停时立即恢复到原始状态?悬停时卡片翻转,未悬停时反转动画?卡片翻转和增长,然后一旦动画完成,即使你仍然悬停也会重置?
  • 感谢您的提问;我应该澄清一下。本质上,我会将鼠标悬停在卡片上,它会翻转,然后开始缩放到更大的尺寸。仍然悬停时,卡片将保持指定的最大缩放尺寸,并且卡片背面(理想情况下)将写字。只要我将鼠标悬停在卡片上,我就不希望动画重置/反转。

标签: html css css-transitions css-animations


【解决方案1】:

您的主要问题是您在不同的地方使用变换:在悬停状态和动画中。所以一个是压倒另一个造成您的问题。旋转和缩放应该结合在同一个变换属性中,你应该从scale(1)而不是scale(0)开始。然后你应该在动画中添加forwards,这样你就可以在动画结束时保持最后的状态。


在您悬停时的初始代码中,旋转被忽略,因为动画的变换将覆盖悬停状态下的变换。然后你将你的元素缩放到 0,这意味着你的元素将有 0 的高度和宽度,你将失去悬停并且你的元素会突然再次出现(因为没有更多的悬停所以没有更多的动画)等等。这是你的闪烁。

你可能会告诉我为什么有时它会起作用?仅仅是因为如果你有一些运气(如果光标靠近中间),动画会在你失去悬停之前继续,然后它就会结束。当动画结束时,将不再考虑缩放和旋转变换。


在 Y 轴上旋转元素时要考虑的另一个重要事项:如果旋转为 90deg,那么在此状态下您的元素将具有等于 0 的宽度,并且您也可能再次失去悬停。避免这种情况的一个方法是将悬停添加到容器并旋转子项,这样您就可以确保您永远不会失去悬停,因为容器不会移动。

html,
body {
  background: #f2edea;
  height: 100%;
  width: 100%;
}

img {
  width: 100%;
  max-height: 100%;
}
.container {
  width: 150px;
  height: 200px;
  margin:50px auto;
}
.flipcard {
  width: 150px;
  height: 200px;
  position: relative;
  box-shadow: 5px 5px 20px #c4c4c4;
  border: 3px solid #b8b8ba;
  border-radius: 5px;
  background: pink;
  transform-style: preserve-3d;
  transition: transform 2s;
}

@keyframes grow {
  from {
    transform: scale(1);
  }
  50% {
    transform: scale(1) rotateY(180deg);
  }
  100% {
    transform: scale(2) rotateY(180deg);
  }
}

.container:hover .flipcard {
  animation: grow 1s forwards;
}

.front-side {
  height: 100%;
  width: 100%;
  position: relative;
  backface-visibility: hidden;
}

.back-side {
  width: 100%;
  height: 100%;
  transform: rotateY(180deg);
  position: absolute;
  top: 0;
  border-radius: 3px;
}
<div class="container">
  <div class='flipcard'>
    <div class='front-side'>
      <img src='https://pre00.deviantart.net/4121/th/pre/i/2018/059/6/7/brigitte_by_raikoart-dc4kzas.png'>
    </div>
    <div class='back-side'>
      <img src="https://img00.deviantart.net/e0ec/i/2017/297/8/c/mercy_by_raikoart-dbrm54b.png">
    </div>
  </div>
</div>

【讨论】:

  • 希望我能给这个答案投票 1000 次;它解释得很好,写得很好,涵盖了我什至不知道如何开始问的问​​题。谢谢;我刚刚学到了很多东西。
【解决方案2】:

在单个动画中同时使用 scalerotate 变换。

html, body {
  background: #f2edea;
  height: 100%;
  width: 100%;
}

img {
  width: 100%;
  max-height: 100%;
}

.flipcard {
  width: 150px;
  height: 200px;
  margin: auto;
  top: 20%;
  position: relative;
  box-shadow: 5px 5px 20px #c4c4c4;
  border: 3px solid #b8b8ba;
  border-radius: 5px;
  background: pink;
  transform-style: preserve-3d;
  transition: transform 2s;
} 

@keyframes growandflip {
  from {
    transform: scale(1);
  }
  50% {
    transform: rotateY(180deg) scale(1);
  }
  100% {
    transform: rotateY(180deg) scale(2);
  }
}

.flipcard:hover {
  animation: growandflip 2s; 
}

.front-side  {
  height: 100%;
  width: 100%;
  position: relative;
  backface-visibility: hidden;
  
}

.back-side {
  width: 100%;
  height: 100%;
  transform: rotateY(180deg);
  position: absolute;
  top: 0;
  border-radius: 3px;
}
<div class='flipcard'>
  <div class='front-side'>
    <img src='https://pre00.deviantart.net/4121/th/pre/i/2018/059/6/7/brigitte_by_raikoart-dc4kzas.png'>
  </div>
  <div class='back-side'>
    <img src="https://img00.deviantart.net/e0ec/i/2017/297/8/c/mercy_by_raikoart-dbrm54b.png">
  </div>
</div>

【讨论】:

  • 您好,这与我想要的非常接近,但是,我不确定您是否注意到,但是当您开始将鼠标悬停在元素上时,它会反复闪烁,在一种非常有问题的方式。任何想法为什么?
  • 抱歉迟到了。我正要回答同样的问题,Temani 已经解释过了。
  • 一点也不;无论如何,我都感谢您的帮助。 :)
【解决方案3】:
@keyframes grow {
  0% {
    transform: scale(0);
  }
  50% {
    transform: scale(0);
  }
  100% {
    transform: scale(2);
  }
}

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-25
  • 2022-01-16
  • 1970-01-01
相关资源
最近更新 更多