成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

了解一下全新的 CSS 動畫合成屬性 Animation-Composition

開發 前端
為啥這里需要用到兩層標簽呢?僅僅為了分解水平運動和垂直運動嗎?如果只使用一層標簽會怎么樣?

介紹一個在Chrome 112上剛剛正式推出的 CSS 動畫合成屬性:animation-composition。

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

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

一、從 CSS 拋物線運動說起

眾所周知,拋物線運動是一個水平方向上勻速、垂直方向上勻加速的合成運動

圖片

這個其實用 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); /*大致勻加速運動*/
}

運動分解效果如下:

圖片

那么問題來了,為啥這里需要用到兩層標簽呢?僅僅為了分解水平運動和垂直運動嗎?如果只使用一層標簽會怎么樣?

這個稍后再說。

二、動畫合成屬性

現在來介紹今天的主角。首先看語法,還是非常簡單的。

/* 單個值 */
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:累加。動畫會和原有屬性相同的部分進行累加。

光看語法和描述可能不知道是做什么的,特別是add和accumulate,差異非常微妙,直接看一個例子。

假設有一個元素,默認有一些樣式。

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

然后,給一個動畫,關鍵幀是這樣的。

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

下面是 3 個關鍵詞的效果對比。

圖片

demo參見 https://codepen.io/web-dot-dev/pen/VwGRBVX[3]。

可以從動畫運行的終點看出這幾種合成的差異。

第一個replace,也就是默認效果。其實就是直接將transform中的translateX(50px) rotate(45deg)變成了translateX(100px)。

圖片

第二個add。可以理解成直接在transform后追加,也就是最后變成了translateX(50px) rotate(45deg) translateX(100px),等同于先向右移動50px,然后旋轉45deg,再向右移動100px。下面是拆解過程(注意旋轉軸)。

圖片

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

圖片

怎么樣,這幾種差異明白了嗎?

當然這些動畫合成都是針對于相同的屬性而言,對于不同的屬性,本來就沒有產生任何干擾,自然不會用到這個特性。

三、再來看拋物線運動

現在回過頭來看前面那個例子。如果只用一層標簽如何實現?

假設水平、垂直兩個方向的動畫關鍵幀是這樣的。

@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;
}

可以得到一個很奇怪的動畫。

圖片

原因其實是這兩個屬性沖突了,后面的動畫覆蓋了前面的,導致動畫的結束點其實是translateY(300px)。

像這種情況下,用動畫合成屬性就非常合適了。

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

add和accumulate都行,因為translateX和translateY并不能累加,只能追加。

效果如下:

圖片

這樣就得到了正常的拋物線運動了。

完整代碼可以查看以下任意鏈接:

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

四、兼容性和總結

提一下兼容性。這方面 Safari居然跑在了前頭,然后Chrome也是最近得到了正式支持,Firefox目前仍然是實驗支持,不過離正式支持也不遠了。也就是說這個特性以后一定會全兼容,也不用擔心學著學著突然都放棄了。兼容性列表如下:

圖片

相信大家已經對動畫合成有了一定的了解,下面總結一下要點:

可以用一杯水來做比方

  1. replace:替換。將這杯水倒掉,然后倒進一杯油。
  2. add:追加(疊加)。在這杯水上倒入一些油,油覆蓋在了水上。
  3. accumulate:累加(混合)。在這杯水倒入奶茶,里面都有水,混合在了一起。

參考資料

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

[2]這回試試使用CSS實現拋物線運動效果: https://www.zhangxinxu.com/wordpress/2018/08/css-css3-拋物線動畫/。

[3]https://codepen.io/web-dot-dev/pen/VwGRBVX: https://codepen.io/web-dot-dev/pen/VwGRBVX。

[4]CSS animation-composition (juejin.cn): https://code.juejin.cn/pen/7224474156631326775。

[5]CSS animation-composition (runjs.work): https://runjs.work/projects/2ff7e7d8c5454f37。

[6]CSS animation-composition (codepen.io): https://codepen.io/xboxyan/pen/bGmByXN。

責任編輯:姜華 來源: 前端偵探
相關推薦

2023-04-24 09:23:31

CSS動畫合成

2023-12-11 13:09:00

CSSlinear緩沖函數

2025-05-20 01:00:00

2020-02-10 14:26:10

GitHub代碼倉庫

2020-12-10 08:44:35

WebSocket輪詢Comet

2022-03-24 13:36:18

Java悲觀鎖樂觀鎖

2020-12-04 08:40:29

SVG動畫元素

2023-08-21 11:24:43

AndroidCSS

2020-03-01 17:53:38

Excel大數據微軟

2019-02-20 14:16:43

2018-06-05 17:40:36

人工智能語音識別

2024-04-11 12:19:01

Rust數據類型

2018-04-25 06:46:52

2023-03-02 08:00:55

包管理工具pnpm 包

2019-03-11 14:33:21

Redis內存模型數據庫

2022-03-07 06:34:22

CQRS數據庫數據模型

2022-12-23 10:26:09

CSShas()

2018-07-17 14:42:50

2023-11-18 09:09:08

GNUBSD協議

2024-02-28 18:22:13

AI處理器
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产欧美精品区一区二区三区 | 日韩欧美在线视频观看 | 久久精品网 | 亚洲不卡在线观看 | 日韩免费视频一区二区 | 18性欧美 | 99久久久国产精品 | 欧美黄色绿像 | 久久久久久国产精品 | 亚洲国产视频一区 | 日韩精品在线看 | 久久aⅴ乱码一区二区三区 亚洲国产成人精品久久久国产成人一区 | 在线免费国产视频 | 能看的av | 91在线免费观看网站 | 一级做a毛片| 欧美精产国品一二三区 | 性高湖久久久久久久久3小时 | 国产欧美一区二区三区在线播放 | 亚洲网址在线观看 | 欧美精品一区二区三区四区 | av资源中文在线 | 黄色网页在线观看 | 国产精品国产a | 久久久久久国产 | 国产精品久久久久久久久图文区 | 一级黄色片日本 | 羞羞视频免费观 | 中文字幕日韩一区 | 日本三级网址 | 国户精品久久久久久久久久久不卡 | www.日本国产 | 亚洲福利一区 | 成人在线视频免费观看 | 91久久精品一区二区三区 | 凹凸日日摸日日碰夜夜 | 99色在线视频 | 黄视频网址 | 午夜精品三区 | 国产日韩欧美精品一区二区三区 | 狠狠操电影 |