css3贝塞尔曲线_CSS3动画–使用贝塞尔曲线创建具有弹跳效果的扇出

您知道吗,可以使用transform CSS属性(例如缩放,倾斜和旋转)将动画转换添加到HTML元素中, ? 可以使用transition属性和@keyframes动画对它们进行动画@keyframes ,但更酷的是,可以使用cubic-bezier()定时函数在动画转换的基础上增加一点弹跳效果 ,从而达到动画效果

简而言之, cubic-bezier() (在CSS中)是transition计时函数 。 它指定过渡的速度,除其他外,它还可以用于在动画中创建弹跳效果

在本文中,首先我们将创建一个简单的转换动画 ,然后在其中添加一个cubic-bezier()计时函数 。 在本教程的最后,您将了解如何创建同时使用扇出效果和弹跳效果的动画。 这是最终结果(单击以查看效果)。

该演示的灵感源于克里斯托弗·琼斯Christopher Jones) 拍摄的关于动态位置标记的美丽滴珠

盘带射击
图像:运球
1.创造叶子

位置标记的形状由五片叶子(我们称之为叶子)组成。 为了创建叶子的椭圆形 ,让我们使用border-radius CSS属性。 单个角的border-radius 水平和垂直两个半径组成 ,如下图所示。

边界半径图
图像:W3C

border-radius属性具有许多不同的语法 。 我们将使用更复杂的标记形状:

border-radius: htl htr hbr hbl / vtl vtr vbr vbl;

在这种语法中,水平半径和垂直半径被分组在一起。 hv代表水平和垂直半径, tlbr代表上,左,下和右上角。 例如, vbl代表vbl的垂直半径。

如果您为水平或垂直侧提供一个值 ,则该值将被浏览器复制到所有其他水平或垂直半径。

创建垂直椭圆形 ,请将所有角的水平半径保持在50% ,然后调整垂直角,直到看到所需的形状。 水平侧将仅使用一个值: 50%

左上角和右上角的垂直半径将为30% ,而左下角和右下角将使用70%值。

<div class="pinStarLeaf"></div>
.pinStarLeaf {
  width: 60px;
  height: 120px;
  border-radius: 50%/30% 30% 70% 70%;
  background-color: #B8F0F5;
}
标记形状
图像:标记的形状(垂直椭圆形)
2.乘以树叶

由于标记会散开,显示出五片叶子,因此我们又创建了另外四个颜色不同的叶子副本 ,并且以绝对的位置将它们堆叠在一起。

<div id="pinStarWrapper">
  <div class="pinStarLeaf"></div>
  <div class="pinStarLeaf"></div>
  <div class="pinStarLeaf"></div>
  <div class="pinStarLeaf"></div>
  <div class="pinStarLeaf"></div>
</div>
#pinStarWrapper{
  width: 300px;
  height: 300px;
  position: relative;
}
.pinStarLeaf{
    width: 60px;
    height: 120px;
    position: absolute;
    border-radius: 50%/30% 30% 70% 70% ;
    left: 0;
    right: 0;
    top: 0;
    bottom: 0;
    margin: auto;
    opacity: .5;
}
.pinStarLeaf:nth-of-type(1){
  background-color: #B8F0F5;
}
.pinStarLeaf:nth-of-type(2){
  background-color: #9CF3DC;
}
.pinStarLeaf:nth-of-type(3){
  background-color: #94F3B0;
}
.pinStarLeaf:nth-of-type(4){
  background-color: #D2F8A1;
}
.pinStarLeaf:nth-of-type(5){
  background-color: #F3EDA2;
}
3.捕捉点击事件并改善美学

让我们添加一个带有#pinStarCenterChkBox标识符的复选框 ,以捕获单击事件。 选中此复选框后,树叶将扇出(旋转)。 为了美观,我们还需要添加带有#pinStarCenter标识符的白色圆圈 。 它将位于标记的顶部,并且将是位置标记的中心。

我们将复选框放在叶子的前面,然后将白色圆圈放在叶子的前面:

<div id="pinStarWrapper">
  <input type="checkbox" id="pinStarCenterChkBox">
  <div class="pinStarLeaf"></div>
  <div class="pinStarLeaf"></div>
  <div class="pinStarLeaf"></div>
  <div class="pinStarLeaf"></div>
  <div class="pinStarLeaf"></div>
  <div id="pinStarCenter"></div>
</div>

首先,我们为复选框和覆盖圈设置基本样式:

#pinStarCenter, #pinStarCenterChkBox{
    width: 45px;
    height: 50px;
    position: absolute;
    left: 0;
    right: 0;
    top: -60px;
    bottom: 0;
    margin: auto;
    background-color: #fff;
    border-radius: 50%;
    cursor: pointer;
}
#pinStarCenter, .pinStarLeaf{
  pointer-events: none;
}
#pinStarCenter > input[type="checkbox"]{
    width: 100%;
    height: 100%;
    cursor: pointer;
}

由于每片叶子将沿z轴以不同角度旋转,因此我们需要设置以下transform: rotatez(); 属性相应地创建星形 。 我们还为旋转效果应用了transition属性(更准确地说,我们使用transition: transform 1s linear对叶子进行transition: transform 1s linear规则)。

#pinStarCenterChkBox:checked ~ .pinStarLeaf{
    transition: transform 1s linear;
}
#pinStarCenterChkBox:checked ~ .pinStarLeaf:nth-of-type(5){
    transform: rotatez(35deg);
}
#pinStarCenterChkBox:checked ~ .pinStarLeaf:nth-of-type(4){
    transform: rotatez(105deg);
}
#pinStarCenterChkBox:checked ~ .pinStarLeaf:nth-of-type(3){
    transform: rotatez(180deg);
}
#pinStarCenterChkBox:checked ~ .pinStarLeaf:nth-of-type(2){
    transform: rotatez(255deg);
}
#pinStarCenterChkBox:checked ~ .pinStarLeaf:nth-of-type(1){
    transform: rotatez(325deg);
}

如果您查看上面CSS,则可以从#pinStarCenterChkBox:checked ~ 常规同级选择器的存在中看到,我们仅在选中复选框 (当用户单击标记时)才添加transitiontransform属性。

4.修改旋转中心

默认情况下,旋转中心位于旋转元素的中心 ,在我们的情况下,位于叶子的中心。 我们需要将转换的中心移到叶子的内端。 我们可以通过使用transform-origin CSS属性来更改转换后的元素的位置,以实现此目的

为了使旋转效果正常工作,我们将以下两个规则添加到CSS文件中的.pinStarLeaf选择器中:

.pinStarLeaf{
    transform-origin: 30px 30px;
    transition: transform 1s linear;
}

让我们看看我们的扇出动画在运行中-在这一点上,还没有反弹效果。 单击标记顶部的白色圆圈。

了解ubic-Bezier()的工作方式

现在,要添加弹跳效果,我们需要在CSS文件的transition声明中将linear 计时函数替换为cubic-bezier()

但是首先,让我们了解cubic-bezier()计时函数背后逻辑,以便您可以轻松理解反弹效果。

cubic-bezier (t1, d1, t2, d2)

即使用距离和时间来解释cubic-bezier()也不是很准确,但是用这种方式理解它要容易得多。

假设有一个盒子在6秒内从A点移到B点 。 让我们使用以下cubic-bezier()时序函数进行t1 = 0d1 = 1值的转换。

/* t1 = 0 , d1 = 1, t2 = 0, d2 = 0 */
cubic-bezier(0,1,0,0)

几乎没有时间,盒子从A移到中点,其余时间到达B。

让我们尝试使用值t1 = 1d1 = 0进行相同的转换。

/* t1 = 1 , d1 = 0, t2 = 0, d2 = 0 */
cubic-bezier(1,0,0,0)

在开始的三秒钟内,盒子移动不大,后来几乎跳到中点,并开始稳定地向B移动。

如您所见, d1控制A中点 之间距离 ,而t1控制从A到达中点所花费时间

现在使用d2t2t1d1 1,并且t2 = 1d2 = 0

/* t1 = 1 , d1 = 1, t2 = 0, d2 = 1 */
cubic-bezier(1,1,0,1)

盒子在3秒内几乎移动了一半(由于t1 = 1d1 = 1 ),并且没有时间就跳到B点。

最后一个示例交换了先前的t2d2值:

/* t1 = 1 , d1 = 1, t2 = 1, d2 = 0 */
cubic-bezier(1,1,1,0)

盒子在3秒钟内几乎移动了一半(由于t1 = 1d1 = 1 ),然后d1 = 1 3秒钟,直到跳到点B为止,移动不多。

这些示例表明, d2t2控制框从中点到达B点的距离和时间。

尽管此时您可能不需要如此长的(但仍为稀疏的) cubic-bezier() )解释,但我认为它将帮助您更好地理解此功能。 现在,所有这些反弹在哪里出现?

5.使用Cubic-Bezier()添加反弹效果

弹跳效果的关键参数是距离d1d2小于1的 d1值将在点A后面的框之前,在动画开始时朝B前进。

大于1的 d2值会使框超出B点,然后在动画结束时回到B处。 因此来回弹跳效果。

现在,我将cubic-bezier()值直接添加到我们的演示中,以代替原来的transition属性的linear值,并让您看到结果。

#pinStarCenterChkBox:checked ~ .pinStarLeaf{
    transition: transform 1s cubic-bezier(.8,-.5,.2,1.4);
}

这是最终结果,具有反弹效果的纯CSS扇出动画:

为了进行比较并更好地理解弹跳效果,以下是当将动画的cubic-bezier()值应用于示例框时的行为:


翻译自: https://www.hongkiat.com/blog/css3-fan-out-bounce-effect-animation/

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值