你知道吗,那些使用CSS transform属性添加进HTML的元素是可以实现动画效果的。我们可以使用transition属性和@keyframe动画来实现这个效果,但是 更炫酷的是,我们可以使用cubic-bezier()这个timing function,给动画添加一些反弹特效,从而让它看上去更好看。

简单来说,CSS中的cubic-bezier(),就是一个用来创建过渡效果的timing function。它可以定义过渡的速度和其他一些指标,它也可以用来创建动画中的反弹特效。

在这篇文章中,我们首先将会创建一个简单的变换动画,然后我们给它添加cubic-bezier()。在读完这篇文章之后,你将会了解如何创建一个同时使用了扇出效果和反弹特效的动画。

1. 制作扇叶

这个扇出效果是由5个扇叶所组成的。我们需要使用CSS的圆角(border-radius )属性来制作这些扇叶。具体请参看下图:

圆角属性有很多种不同的语法。在这里我们将会使用一种比较复杂的语法:

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

在这个语法中,横向和纵向的半径被放在了一起;h和v分别代表了横向半径和纵向半径,t、l、b和r分别代表的是顶部(top)、左侧(left)、底部(bottom)和右侧(right)。例如,vbl代表的左下角的纵向半径。

如果你给横向或是纵向半径只设定了一个值,那么浏览器会将这个值复制到其他所有的横向或是纵向半径。

为了做出竖直的椭圆形状,你需要在所有角上让横向半径保持50%的比例,然后调节纵向半径,直到你获得了满意的形状。横向半径只会使用一个值:50%。

左上角和右上角上,纵向半径为30%,左下角和右下角上,纵向半径的值为70%。

HTML

CSS

.pinStarLeaf {

width: 60px;

height: 120px;

border-radius: 50%/30% 30% 70% 70%;

background-color: #B8F0F5;

}

2. 扩大扇叶数量

由于扇出效果需要5个扇叶,因此我们还需要再制作4个扇叶,并且为他们指定不同的颜色。除此之外,我们还需要指定一个绝对定位(absolute positioning),让5个扇叶在动画结束的时候重叠在一起。

HTML

CSS

#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这个识别符来添加一个checkbox,从而捕捉用户的点击行为。当checkbox被选中之后,扇出 效果会马上呈现(扇叶开始旋转)。我们还要用#pinStarCenter识别符来添加一个白色的原型,从而提升美学效果。这个原型要放在扇出效果的最中 心。

HTML

我们要先放置checkbox,然后是白色的圆和扇叶:

CSS

#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轴旋转,因此我们要为它们制定好过渡:rotatez();。我们还要给旋转特性应用transition属性。

#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 ~这个识别符,只有在checkbox被勾选之后(也就是用户点击之后),动画效果才会开始。

4. 对旋转的中心进行修改

默认情况下,旋转的中心位于旋转元素的中间。但是在我们的效果中,它应该位于所有扇叶的中心点,因此我们需要对其进行移动。我们可以使用CSS的transform-orgin属性来实现这个目的。

为了让旋转特效正常工作,我们要在CSS文件中的.pinStarLeaf选择器中添加下面两条规则:

.pinStarLeaf{

transform-origin: 30px 30px;

transition: transform 1s linear;

}

截止到目前为止,旋转特效已经做出来了,但是这个动画还没有使用反弹特效。

现在我们来添加反弹特效,我们需要将现行的timing function替换为cubic-bezier()。

但是首先,为了更好的了解什么是反弹特效,我们先来试着了解一下cubic-bezier()这个timing function的工作方式。

cubic-bezier()的语法是这样的,d和t分别代表了距离(distance)和时间(time),他们的值通常是0到1之间的数字:

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

虽然用距离和时间这样的词汇来解释CSS中的cubic-bezier()并不是非常精确,但是这样说的时候我们比较容易理解。

假设存在一个能在6秒内从A点移动到B点的盒子。我们使用下面的cubic-bezier()来实现这次过渡,令t1=0,d1=1。

/* t1 = 0 , d1 = 1, t2 = 0, d2 = 0 */

cubic-bezier(0,1,0,0)

这个盒子会几乎立刻从A点移动到中间点,然后用剩下的时间在移动到B点。

现在我们令t1=1,d1=0,在来看看过渡的效果。

你会发现在最初的3秒内,盒子几乎不动,之后它几乎直接跳到了中间点,然后再稳步移动到B点。

你也许已经发现了,d1控制的是A点到中间点之间的距离,t1控制的是从A点到中间点所用的时间。

现在我们来添加d2和t2.令t1和d1的值都为1,令t2=2,d2=0。盒子会在前三秒内稳步过渡到中间点(因为t1=1,d1=1),然后立刻跳到B点。

现在我们来移除t2和d2的值。

盒子会在前三秒内稳步过渡到中间点(因为t1=1,d1=1),然后停止接近3秒的时间,之后立刻跳到B点。

也就是说,d2和t2分别控制了盒子从中间点到B点的距离和时间。

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

在使用反弹特效的时候,最主要的参数就是以距离,也就是d1和d2。当d1的值小于1时,它会让盒子在想B点移动之前时,先退回到A点之前。

当d2的值大于1时,它会让盒子达到B点之后,再超越B点一段距离,然后再最终回到B点静止。我现在将会在代码中直接添加cubic-bezier()的值,这样你们就可以看到最终效果了。

#pinStarCenterChkBox:checked ~ .pinStarLeaf{

transition: transform 1s cubic-bezier(.8,-.5,.2,1.4);

}

最终的效果如下,这就是用CSS制作带有反弹特效的扇出效果的方式:

为了让大家更好的了解反弹特效,我做了下面这个动画,请仔细观察盒子的移动轨迹:

css cubic-bezier,使用cubic-bezier()创建带有反弹特效的CSS动画相关推荐

  1. java画bezier曲面_计算机图形学上机实验4-实现Bezier曲线和Bezier曲面的绘制

    <计算机图形学上机实验4-实现Bezier曲线和Bezier曲面的绘制>由会员分享,可在线阅读,更多相关<计算机图形学上机实验4-实现Bezier曲线和Bezier曲面的绘制(9页珍 ...

  2. oracle创建带参数视图6,Oracle创建带有参数的视图代码介绍

    在Oracle里,视图不像存储过程和函数一样,可以定义输入参数,但我们可以变个方式,使用程序包来实现 首先定义程序包: /* 按个人需要定义,我定义三个参数 ,因我项目程序需要,所以三个参数都是num ...

  3. CSS SANS – 神奇!使用 CSS3 创建的字体

    在我们的认识中,CSS 所能做的就是改变网页的排版布局,调整字间距等.然而,这里我们要介绍的则是使用 CSS3 制作字体.CSS SANS 可以通过 CSS 技术创建的A-Z字体,一起来围观下. 在线 ...

  4. 创建带有关联的 XML 架构的 XML 文件 从 XML 文件创建 XML 架构

    一.创建带有关联的XML 架构的XML 文件 1.创建新的 Windows 应用程序项目 首先需要在 Visual Basic 或 Visual C# 中创建新的 Windows 应用程序.创建一个新 ...

  5. 实验10:创建带有生命周期方法的bean ||实验11:测试bean的后置处理器

    实验10:创建带有生命周期方法的bean 实验11:测试bean的后置处理器 MyBeanPostProcessor.java package com.atguigu.bean;import org. ...

  6. python不能创建字典的是_用Python创建带有重复键的字典

    用Python创建带有重复键的字典 我有以下列表,其中包含重复的具有不同值的汽车注册号. 我想将其转换为字典,该字典接受汽车登记号的多个键. 到目前为止,当我尝试将列表转换为字典时,它消除了键之一. ...

  7. 用 cctld工具创建带有国家代码的IP地址表

    用 cctld工具创建带有国家代码的IP地址表 cctld tools is creating IP addresses table with Country Code 项目地址 https://gi ...

  8. mysql 创建带参数的存储过程_在MySQL中创建带有IN和OUT参数的存储过程的方法

    在 MySQL 中创建储存过程的语法很难记,除非你经常跟储存过程打交道,原因很简单,语法不是什么小笑话.如果你通过命令行控制 MySQL,你需要记住准确的语法.一个快速示例可以很好的帮助你做到这点.在 ...

  9. GDAL创建带有空间参考坐标系的shp矢量文件遇到的问题与解决方法

    之前项目需求:创建矢量文件: 网上查找GDAL/OGR创建矢量文件的各种博客,也查了GDAL官网手册,可是实际生成的shp总是没有成功写入坐标系,空间参考坐标系总是unknown,这就让人很困惑了,实 ...

最新文章

  1. php vsftpd文件上传类,php ftp文件上传函数(基础版)
  2. Galera Cluster for MySQL 集群恢复
  3. MySQL from后面的子查询使用
  4. 账户与使用计算机的人无关,本地用户和组
  5. lintcode:买卖股票的最佳时机 III
  6. codeigniter_如何在浏览器中查看CodeIgniter日志文件
  7. 搭建webUI自动化及问题解决:Message: ‘chromedriver‘ executable needs to be in PATH.解决办法
  8. ffmpeg 分辨率 压缩_用GPU加速FFmpeg中的超分辨率功能
  9. win8.1除了应用界面的应用,其他系统程序都不能上网,包括IE
  10. python中自定义错误_Python中的自定义错误消息
  11. SQL ——利用窗口函数的T-SQL解决方案
  12. 一键去除域名非80端口,去掉域名后面带的端口号快速解决方案
  13. springboot(五) 加载配置文件优先级顺序
  14. 生产环境下戴尔 R820 kvm虚拟化部署二(物理主机系统优化)
  15. linux获取sata端口,经过设备名,获取接口类型 SATA,USB, ESATA接口
  16. 创维电视安装第三方app
  17. 不需要个人信息的云服务器,那些云服务器不需要实名
  18. 移动 webApp 开发入门与进阶
  19. 传统与深度学习遥感变化监测遥感技术路线与方法
  20. 《信息学奥赛》1354:括弧匹配检验

热门文章

  1. opencv对相似图片一键找不同。(嘻嘻,找不同小游戏作弊神器)
  2. android融云客服功能,客服开发指南 - 融云 RongCloud
  3. JavaEE进阶知识学习-----Java8新特性知识学习-4-1-StreamAPI
  4. C语言编程>第十六周 ⑤ 请补充fun函数,该函数的功能是:依次取出字符串中所有大写字母,形成新的字符串,并取代原字符串。
  5. android 解析程序包时出现问题
  6. font color=red[置顶]/font
  7. uni-app快速上手顺序
  8. 东华理工大学计算机网络期末考试试卷,东华理工大学计算机网络计算题
  9. matlab实现lzw编码,LZW编码算法matlab实现
  10. 裁剪左上角x左上角y填什么_在“context.moveTo(x,y);”中,x、y 是相对于【 】的左上角。...