CSS 的 animations (动画) 和 transitions(变换)擅于实现从点 A 到点 B 的直线运动,运动轨迹是直线路径。给一个元素添加了 animation 或者 transition 以后,无论你如何调整 贝塞尔曲线 ,都无法让它沿着弧形路径运动。你可以通过自定义 timing function 属性,做出弹动的效果,但是它沿着 X 和 Y 轴相对移动的值永远是相同的。

与其使用 JavaScript 实现外观自然的运动,不如尝试用这种简单的方式:分层动画,绕过已有的限制。通过使用两个或多个元素实现动画效果,我们可以更加细粒度地控制某个元素的路径,沿着 X 轴运动使用一种 timing function ,沿着 Y 轴运动使用另一种 timing function 。

问题所在

当我们深入探讨解决方案之前,看看到底问题在哪。CSS animations 和transitions 限制我们只能沿直线路径运动。元素总是沿着点 A 到点 B 的最短路径运动,如果我们另辟蹊径,告诉 CSS 沿着“更好的路径”,而不是“最短路径”运动呢?

用 CSS (开启硬件加速)实现两点之间的运动,最直截了当的方式是使用transform 的 translate 在一定时间内移动某个元素。这就产生了直线运动。在@keyframes 中,我们打算在 (0,0) 和 (100,-100) 间来回运动,见上图例子:

@keyframes straightLine {

50% {

transform: translate3D(100px, -100px, 0);

}

}

.dot {

animation: straightLine 2.5s infinite linear;

}

这些看起来并不难懂,但我们稍等片刻,思考一下我们需要的解决方案,拆分开来的动画,视觉上长什么样子呢。

0% 时,元素从 (0,0) 出发, 50% 时,我们用了 translate3D(100px, -100px, 0) 把它移动到 (100,-100),然后原路返回。换句话说,我们把元素向右移动了 100px ,向上移动了 100px ,两个方向联合作用使元素沿着一个角度运动。

解决方案:每个轴执行自己的动画函数

那么,原先展示的例子中我们如何实现的弧形路径呢?为了让创建的路径不是直线, 我们想让元素沿 X 轴和 Y 轴的运动速度不同步 。

先前例子中都用到了 linear 线性运动函数,如果我们给运动的元素包裹一个容器,我们可以为 X 轴应用一种动画函数,Y 轴应用另一种动画函数。以下例子,我们在 X 轴使用 ease-in ,Y 轴使用 ease-out 。

每个轴元素的具体实现

不幸的是,我们不能只把 transform 动画简单叠加:因为只有最后声明的动画会执行。那么我们如何把两个动画效果联合起来呢?可以把一个元素放入另一个元素内部,给容器元素加一种动画,给里面的子元素添加另一种动画。

在以上例子中,你已经看到一个点沿着弧形路径运动,看到两个独立的元素一起做动画,只不过容器元素是完全透明的。为了清晰地看到两个元素沿着弧形路径是如何相互作用的,我们给容器元素加个边框看看呗:

那个点藏在带边框的盒子内部,跟随盒子一起沿 X 轴远动,同时它自己又在 Y 轴方向上下运动。去掉容器盒子的边框,我们就得到了弧形路径。与其在 HTML 中用两个元素,还不如用伪元素实现嘞。如果 HTML 是这样:

我们可以添加伪元素:

.dot {

/* 容器:沿 X 轴运动 */

}

.dot::after {

/* 黑点儿,沿 Y 轴运动 */

}

然后,我们需要两块独立的动画代码:X 轴,Y 轴各一块。注意一处用了 ease-in,另一处用了 ease-out :

.dot {

/*省略 一些布局代码...*/

animation: xAxis 2.5s infinite ease-in;

}

.dot::after {

/* 渲染小黑点儿*/

animation: yAxis 2.5s infinite ease-out;

}

@keyframes xAxis {

50% {

animation-timing-function: ease-in;

transform: translateX(100px);

}

}

@keyframes yAxis {

50% {

animation-timing-function: ease-out;

transform: translateY(-100px);

}

}

加上 WebKit 前缀,用一些自定义的贝塞尔曲线代替 ease-in 和 ease-out ,我们就可以实现文章最开头展示的效果:

.demo-dot {

-webkit-animation: xAxis 2.5s infinite cubic-bezier(0.02, 0.01, 0.21, 1);

animation: xAxis 2.5s infinite cubic-bezier(0.02, 0.01, 0.21, 1);

}

.demo-dot::after {

content: '';

display: block;

width: 20px;

height: 20px;

border-radius: 20px;

background-color: #fff;

-webkit-animation: yAxis 2.5s infinite cubic-bezier(0.3, 0.27, 0.07, 1.64);

animation: yAxis 2.5s infinite cubic-bezier(0.3, 0.27, 0.07, 1.64);

}

@-webkit-keyframes yAxis {

50% {

-webkit-animation-timing-function: cubic-bezier(0.02, 0.01, 0.21, 1);

animation-timing-function: cubic-bezier(0.02, 0.01, 0.21, 1);

-webkit-transform: translateY(-100px);

transform: translateY(-100px);

}

}

@keyframes yAxis {

50% {

-webkit-animation-timing-function: cubic-bezier(0.02, 0.01, 0.21, 1);

animation-timing-function: cubic-bezier(0.02, 0.01, 0.21, 1);

-webkit-transform: translateY(-100px);

transform: translateY(-100px);

}

}

@-webkit-keyframes xAxis {

50% {

-webkit-animation-timing-function: cubic-bezier(0.3, 0.27, 0.07, 1.64);

animation-timing-function: cubic-bezier(0.3, 0.27, 0.07, 1.64);

-webkit-transform: translateX(100px);

transform: translateX(100px);

}

}

@keyframes xAxis {

50% {

-webkit-animation-timing-function: cubic-bezier(0.3, 0.27, 0.07, 1.64);

animation-timing-function: cubic-bezier(0.3, 0.27, 0.07, 1.64);

-webkit-transform: translateX(100px);

transform: translateX(100px);

}

}

以下是文章起始处的例子:

你可能注意到我们在所有例子中都用了 @keyframes ,这纯粹是因为我们想展示黑点儿往返的两种状态。如果只想实现点 A 至点 B 的运动,使用 transition 属性做分层动画同样好用。

如果有个绝对定位的元素,通过给 left 和 bottom 属性加特效,就可以实现弧形路径运动,单个元素就可以,不需要容器元素。为什么不这么做呢:它性能稍差一些,动画的每一帧都会引起重绘。使用带伪元素的分层动画, translate 属性又开了硬件加速,动画效果更好,性能也更高。

(责任编辑:最模板)

html 路径线条动画,CSS分层动画可以让元素沿弧形路径运动相关推荐

  1. android 属性动画 弧形,CSS分层动画可以让元素沿弧形路径运动

    CSS 的 animations (动画) 和 transitions(变换)擅于实现从点 A 到点 B 的直线运动,运动轨迹是直线路径.给一个元素添加了 animation 或者 transitio ...

  2. CSS3: 利用分层动画让元素沿弧形路径运动

    原文:Moving along a curved path in CSS with layered animation 翻译:涂鸦码龙 译者注:部分代码示例在原文中可以看效果(作者写在博文里面了-), ...

  3. java实现曲线运动_分层动画实现元素的曲线运动

    在前端实现元素的动画需要用到transition或者animation搭配transform做位移的效果,但这只能实现元素沿着直线运动.如果想要让元素沿着曲线运动,则需要用到本文介绍的"分层 ...

  4. css实现圆环路径,笔记:CSS、canvas 和 SVG 分别实现元素沿环形路径运动动画

    CSS 部分 最早接触到使用 CSS 使元素以环形路径运动的办法来自于 Lea Verou 的书<CSS 揭秘>中第八章中的<沿环形路径平移的动画>.虽然随着 CSS 的发展部 ...

  5. SVG的动画属性(动画常用属性、复合动画/往返动画/形变动画/路径动画/)

    一.动画 1.SVG动画 在SVG中提供了三种常用动画标记 animate:基础动画 animateTransform:形变动画 animateMotion:路径动画 2.SVG动画属性 attrib ...

  6. CSS转换动画与移动web

    CSS转换与移动web 一.课前导学 1.阶段目标: 使用字体图标.平面转换.动画等C3属性丰富网页效果和呈现方式 2.CSS3 目标:使用平面.空间转换和动画属性,丰富网页元素 3.Flex 了解移 ...

  7. css动画和js动画_CSS与JS动画:哪个更快?

    css动画和js动画 How is it possible that JavaScript-based animation has secretly always been as fast - or ...

  8. css动画 和 js动画_CSS大师的动画建议

    css动画 和 js动画 Just over a week ago we were lucky enough to have Tiffany Brown join us on the SitePoin ...

  9. html5 幻灯片动画效果,18种响应式分层动画jQuery幻灯片特效

    这是一款效果非常炫酷的响应式分层动画jQuery幻灯片特效.该幻灯片每一组动画分为多个层,每一层可以使用不同的动画效果,共有18种不同的效果可以选择. 所有的动画效果都是通过js来在页面中插入CSS代 ...

最新文章

  1. 树莓派进阶之路 (009) - 树莓派ftp脚本(原创)
  2. 10-1 5-1 查询销售便携式电脑但不销售PC的厂商 (20 分)(分析+详解)
  3. 第14篇:Flowable-BPMN操作流程之任务完成
  4. [VirtaulBox]网络连接设置
  5. Linux命令学习手册-iconv命令
  6. simulink仿真之正弦波变方波
  7. 关于人工智能写作的发展以及看法
  8. PS 羽化工具使用
  9. H3C无线控制器AP license共享配置
  10. Linux 自定义service,并重定向输出到日志文件
  11. 智能手机查看上网IP地址的多种方法
  12. 青春岁月杂志青春岁月杂志社青春岁月编辑部2022年第11期目录
  13. 二进制有符号数补码计算器
  14. 计算机软件产业分析,中国工业软件产业链上中下游布局分析及企业一览(附图表)...
  15. Word自动化处理相关知识
  16. 网络安全之webug显错注入实战
  17. 什么是服务器?超详细
  18. Mysql面试基础知识(全)
  19. ASIO4ALL是什么
  20. 扒一扒那些叫欧拉的定理们(十二)——经济学里的欧拉定理

热门文章

  1. 互联网金融后台管理系统总结
  2. Matplotlib关于字体及子图的详细操作
  3. 华为云位居中国金融云基础设施市场第一
  4. 如何有效做好地推,地推怎么做最有效呢?这
  5. PipeStream
  6. 洛谷B3654 [语言月赛202208]影子字符串C语言题解
  7. OPA2140AIDR IC OPAMP JFET 2 CIRCUIT 8SOIC
  8. 商人宝:连锁电商线上线下解决方案
  9. python蓝桥杯 成绩统计
  10. 分布式架构 高并发处理