百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

了解一下全新的CSS动画合成属性 animation-composition(纯css动画效果代码案例)

toyiye 2024-04-04 11:27 25 浏览 0 评论

介绍一个在Chrome 112上刚刚正式推出的 CSS 动画合成属性:animation-composition

https://developer.mozilla.org/en-US/docs/Web/CSS/animation-composition[1]

日后非常有用的一个特性,快来了解一下吧

一、从 CSS 抛物线运动说起

众所周知,抛物线运动是一个水平方向上匀速、垂直方向上匀加速的合成运动

image-20230421153754886

这个其实用 CSS 动画也很好实现,水平和垂直两个方向的位移动画分别用不同的动画缓存函数

有兴趣的可以参考张鑫旭的这篇文章:这回试试使用CSS实现抛物线运动效果[2]

这里简单介绍一下

实现这样的效果需要一个嵌套结构

<div class="ball-x">
  <div class="ball-y"></div>
</div>

然后里外设置不同的动画缓冲函数

.ball-x { 
  animation-timing-function: linear; /*匀速直线运动*/
}
.ball-y { 
  animation-timing-function: cubic-bezier(.55, 0, .85, .36);  /*大致匀加速运动*/
}

运动分解效果如下:

Kapture 2023-04-21 at 17.26.05

那么问题来了,为啥这里需要用到两层标签呢?仅仅为了分解水平运动和垂直运动吗?如果只使用一层标签会怎么样?

这个稍后再说

二、动画合成属性

现在来介绍今天的主角。首先看语法,还是非常简单的

/* 单个值 */
animation-composition: replace; 
animation-composition: add;/*追加*/
animation-composition: accumulate;/*混合*/
/* 多个值,暂不讨论 */
animation-composition: replace, add;
animation-composition: add, accumulate;
animation-composition: replace, add, accumulate;

主要是这 3 个关键词:

  • replace:覆盖(默认值)。动画会覆盖原有属性。
  • add:追加。动画追加到原有属性后面。
  • accumulate:累加。动画会和原有属性相同的部分进行累加。

光看语法和描述可能不知道是做什么的,特别是addaccumulate,差异非常微妙,直接看一个例子。

假设有一个元素,默认有一些样式

div{
  transform-origin: 50% 50%;
 transform: translateX(50px) rotate(45deg);
}

然后,给一个动画,关键帧是这样的

@keyframes adjust {
  to {
    transform: translateX(100px);
  }
}

下面是 3 个关键词的效果对比

Kapture 2023-04-21 at 18.58.23

demo参见 https://codepen.io/web-dot-dev/pen/VwGRBVX[3]

可以从动画运行的终点看出这几种合成的差异。

第一个replace,也就是默认效果。其实就是直接将transform中的translateX(50px) rotate(45deg)变成了translateX(100px)

image-20230421192925447

第二个add。可以理解成直接在transform后追加,也就是最后变成了translateX(50px) rotate(45deg) translateX(100px),等同于先向右移动50px,然后旋转45deg,再向右移动100px。下面是拆解过程(注意旋转轴)

image-20230421192859456

第三个accumulate。可以理解成将已有的translateX(50px)累加,最后结果是translateX(150px) rotate(45deg)

image-20230421194110419

怎么样,这几种差异明白了吗?

当然这些动画合成都是针对于相同的属性而言,对于不同的属性,本来就没有产生任何干扰,自然不会用到这个特性。

三、再来看抛物线运动

现在回过头来看前面那个例子。如果只用一层标签如何实现?

假设水平、垂直两个方向的动画关键帧是这样的

@keyframes ballMoveX {
    100%{
        transform: translateX(300px) 
    }
}
@keyframes ballMoveY {
 100% { 
        transform: translateY(300px)
    } 
}

然后小球将这两个动画合起来

.ball{
    animation: 
    ballMoveX 1s linear infinite alternate, 
    ballMoveY 1s cubic-bezier(.55, 0, .85, .36) infinite alternate;
}

可以得到一个很奇怪的动画

Kapture 2023-04-21 at 19.44.49

原因其实是这两个属性冲突了,后面的动画覆盖了前面的,导致动画的结束点其实是translateY(300px)

像这种情况下,用动画合成属性就非常合适了

.ball{
    ...
   animation-composition: add; /*accumulate也行*/
}

addaccumulate都行,因为translateXtranslateY并不能累加,只能追加。

效果如下

Kapture 2023-04-21 at 19.49.14

这样就得到了正常的抛物线运动了

完整代码可以查看以下任意链接:

  • CSS animation-composition (juejin.cn)[4]
  • CSS animation-composition (runjs.work)[5]
  • CSS animation-composition (codepen.io)[6]

四、兼容性和总结

提一下兼容性。这方面 Safari居然跑在了前头,然后Chrome也是最近得到了正式支持,Firefox目前仍然是实验支持,不过离正式支持也不远了。也就是说这个特性以后一定会全兼容,也不用担心学着学着突然都放弃了。兼容性列表如下:

image-20230422113128869

相信大家已经对动画合成有了一定的了解,下面总结一下要点:

可以用一杯水来做比方

  1. replace:替换。将这杯水倒掉,然后倒进一杯油
  2. add:追加(叠加)。在这杯水上倒入一些油,油覆盖在了水上
  3. accumulate:累加(混合)。在这杯水倒入奶茶,里面都有水,混合在了一起

当然,最重要的一点是,只有碰到一些有冲突的动画时才需要考虑用这个特性,你学到了吗?

作者:XboxYan

来源:微信公众号:前端侦探

出处:https://mp.weixin.qq.com/s/Nq4i2cTW6ng1k_MXVPa4Qg

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码