精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

借助CSS實現(xiàn)點贊粒子動效

開發(fā) 前端
先從單個粒子看,其實就是一個拋物線運動,我們先從平拋運動開始。眾所周知,拋物線運動是一個水平方向上勻速、垂直方向上勻加速的合成運動。

大部分點擊效果都平平無奇,如果你碰到一個這樣的點擊效果,會不會忍不住多點幾次呢?

Kapture 2025-08-09 at 13.19.13Kapture 2025-08-09 at 13.19.13

看似有些復(fù)雜,其實分解開來,其實就兩個動畫。

  1. 粒子的拋物線動畫
  2. 數(shù)字的縮放動畫

下面來一步步實現(xiàn)它,花兩分鐘一起看看吧!

一、CSS 拋物線運動

先從單個粒子看,其實就是一個拋物線運動,我們先從平拋運動開始。

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

image-20250809133654026image-20250809133654026

這個其實用 CSS 動畫也很好實現(xiàn),水平和垂直兩個方向的位移動畫分別用不同的動畫緩存函數(shù)。

這里簡單介紹一下:

實現(xiàn)這樣的效果需要一個嵌套結(jié)構(gòu)。

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

然后里外設(shè)置不同的動畫緩沖函數(shù)。

.ball-x { 
  animation-timing-function: linear; /*勻速直線運動*/
}
.ball-y { 
  animation-timing-function: cubic-bezier(.55, 0, .85, .36);  /*大致勻加速運動*/
}

運動分解效果如下:

Kapture 2023-04-21 at 17.26.05Kapture 2023-04-21 at 17.26.05

當(dāng)然,這里為了兼容性考慮,使用了兩層標簽,其實還可以使用單層標簽實現(xiàn),需要用到動畫合成屬性。

回到我們的例子,假設(shè)單個粒子的HTML是這樣的。

<div class="custom-tips" style="left: 50%; top: 50%;">
    <div class="custom-tips-dot" emoji="??"></div>
 </div>

關(guān)鍵樣式如下:

.custom-tips {
position: absolute;
width: 1em;
height: 1em;
margin-left: -.5em;
margin-top: -.5em;
left: 0;
top: 0;
transform: translate(var(--left, 50%), var(--top, 50%));
}
.custom-tips-dot {
position: absolute;
inset: 0;
display: flex;
justify-content: center;
align-items: center;
opacity: 0;
animation: custom-x 1s linear forwards;
}
.custom-tips-dot::before {
content: attr(emoji, '??');
animation: custom-y 1scubic-bezier(0.55, 0, 0.85, 0.36);
}

/* x方向 */
@keyframes custom-x {
  100% {
    transform: translateX(300%);
  }
}
/* y方向 */
@keyframes custom-y {
  100% {
    transform: translateY(300%);
  }
}

效果如下(綠色線框是水平運動):

Kapture 2025-08-09 at 14.03.54Kapture 2025-08-09 at 14.03.54

這樣就簡單實現(xiàn)了一個平拋運動。

二、CSS 斜拋運動

平拋運動可能沒有那種禮花綻放的感覺,有點平淡,我們還需要有一定角度朝上做斜拋運動。

看著好像有點復(fù)雜?其實就是多了一個向上的初始速度,示意如下:

image-20250809141915739image-20250809141915739

這個在 JS中很好實現(xiàn),給一個初始值就行,垂直方向上先往上減速,一直到 0,然后開始加速,這樣整體就是一個斜拋運動了。

那么,CSS 如何處理呢?好像并沒有這種概念。

其實呢,可以從緩沖函數(shù)入手,比如上面用到的緩沖函數(shù)是cubic-bezier(0.55, 0, 0.85, 0.36),是一種逐漸變快的運動。

image-20250809142326339image-20250809142326339

這時,我們可以改變第一個錨點,往下拉,直到第二個值出現(xiàn)負數(shù),如下:

image-20250809142536888image-20250809142536888

這樣會出現(xiàn)一個輕微的回彈效果,效果如下:

Kapture 2025-08-09 at 14.26.33Kapture 2025-08-09 at 14.26.33

是不是有點像斜拋運動了?

我們可以繼續(xù)調(diào)整幅度,讓回彈效果更強烈一些,比如:

image-20250809143033923image-20250809143033923

這樣就更接近真實的斜拋運動了。

Kapture 2025-08-09 at 14.29.11Kapture 2025-08-09 at 14.29.11

關(guān)鍵 CSS 如下:

.custom-tips-dot::before {
    content: attr(emoji, '??');
    animation: custom-y 1s cubic-bezier(0.56, -1.35, 0.85, 0.36) forwards;
  }

是不是也比較容易?

三、借助JS批量生產(chǎn)

單個粒子可能比較死板,也不夠隨機。

要實現(xiàn)隨機也比較容易,每次生成例子的水平位移不同就行了,然后多個粒子的動畫有一定的延時就可以了。

image-20250809235534054image-20250809235534054

為了方便JS透傳過去,可以借助CSS變量來生成。

這里用--x表示水平位移,--d表示延遲。

.custom-tips-dot {
position: absolute;
inset: 0;
display: flex;
justify-content: center;
align-items: center;
opacity: 0;
outline: 1px solid yellowgreen;
animation: custom-x 1svar(--d, 0s) linear forwards; 
}
.custom-tips-dot::before {
content: attr(emoji, '??');
animation: custom-y 1svar(--d, 0s) cubic-bezier(0.56, -1.35, 0.85, 0.36) forwards;
}
/* x方向 */
@keyframes custom-x {
  0% {
    opacity: 0;
    transform: translateX(0%)
  }
  10%, 90% {
    opacity: 1;
  }
  100% {
    opacity: 0;
    transform: translateX(var(--x, 300%)); /*隨機的水平位移*/
  }
}

然后用 JS動態(tài)生成這些 dom。

function createDots(emojis) {
const temp = document.createDocumentFragment();
const random_emojis = emojis.slice(0, Math.ceil(Math.random() * emojis.length)).sort(() =>Math.random() - .5)
  random_emojis.forEach(emoji => {
    const dot = document.createElement('div');
    dot.className = 'custom-tips-dot';
    dot.setAttribute('emoji', emoji);
    dot.style.setProperty('--d', `${Math.random() * 0.2}s`);
    dot.style.setProperty('--x', `${(Math.random() - 0.5) * 1000}%`);
    temp.appendChild(dot);
    /*動畫結(jié)束后自動移除dom*/
    dot.addEventListener('animationend', () => {
      console.log('dot.parentNode', dot.parentNode, dot.parentNode?.childElementCount)
      if (dot?.parentNode?.childElementCount <= 1) {
        dot.parentNode.remove();
      } else {
        dot.remove();
      }
    });
  })
return temp;
}

document.addEventListener('click',(ev) => {
const { clientX, clientY } = ev;
console.log(clientX, clientY);
document.body.style.setProperty('--left', `${clientX}px`);
document.body.style.setProperty('--top', `${clientY}px`);
const tips = document.createElement('div');
  tips.style.setProperty('--left', `${clientX}px`);
  tips.style.setProperty('--top', `${clientY}px`);
  tips.className = 'custom-tips';
const dots = createDots(['??', '??', '??', '??', '??', '??', '??']);
  tips.appendChild(dots);
document.body.appendChild(tips);
})

這樣就能每次隨機生成一定數(shù)量的emoji了,效果如下:

Kapture 2025-08-09 at 14.39.25Kapture 2025-08-09 at 14.39.25

四、+1 動畫

數(shù)字變化動畫是最簡單的,就是一個縮放+透明度變化的動畫。

image-20250810000526217image-20250810000526217

假設(shè)HTML是這樣的:

<div class="custom-num" num="1"></div>

我們用偽元素來生成+1的字符,動畫很簡單,就兩個關(guān)鍵幀,實現(xiàn)如下:

.custom-num {
position: absolute;
left: 0;
top: 0;
display: flex;
width: 2em;
height: 2em;
font-size: 2em;
color: #fff;
justify-content: center;
align-items: center;
margin-left: -1em;
margin-top: -2em;
font-weight: bold;
text-shadow: 4px4px0rgba(255,0,0);
transform: translate(var(--left), var(--top));
}
.custom-num::before {
content: '+'attr(num);
opacity: 0;
animation: count-shark 1svar(--d, 0s);
}
@keyframes count-shark {
  0%,100%{
    opacity: 0;
    transform: scale(.4);
  }

  30%,70%{
    opacity: 1;
    transform: scale(1);
  }
}

效果如下:

Kapture 2025-08-09 at 14.46.13Kapture 2025-08-09 at 14.46.13

然后我們借助JS來實現(xiàn)數(shù)字增加的邏輯,其實就是移除上一個,新增一個dom,新增的會自動執(zhí)行動畫,實現(xiàn)如下:

function createNum() {
const current = document.querySelector('.custom-num');
let num = 1
if (current) {
    num = parseInt(current.getAttribute('num')) + 1;
    current.remove();
  }
const numDiv = document.createElement('div');
  numDiv.className = 'custom-num';
if (num > 1) {
    // numDiv.style.setProperty('--d','-.3s' )
  }
  numDiv.setAttribute('num', num);
  numDiv.addEventListener('animationend', () => {
    numDiv.remove();
  });
return numDiv;
}

最后兩者結(jié)合起來,就實現(xiàn)了文章開頭所示效果:

Kapture 2025-08-09 at 13.19.13Kapture 2025-08-09 at 13.19.13

你也可以訪問在線demo真實體驗:https://codepen.io/xboxyan/pen/wBKqpXb

五、其實canvas可能更適合

一般來說,粒子動畫可能canvas來實現(xiàn)更合適一點,性能也更好,不過可能對新手不太友好。這里推薦一個開箱即用的庫:叫做 Canvas Confetti,專門用來做這種禮花綻放特效的,如果自己手搓不來,可以試試這個。

不過我們這里案例的粒子也不是很多,所以使用CSS也無所謂了。

責(zé)任編輯:武曉燕 來源: 前端偵探
相關(guān)推薦

2020-01-10 15:15:53

Redis點贊數(shù)據(jù)庫

2022-09-01 06:54:28

CSS前端

2022-03-31 07:46:17

CSS動畫技巧

2012-05-09 12:25:55

2013-06-07 15:43:34

移動移動應(yīng)用豐富動效

2025-09-12 13:24:36

2021-08-10 15:37:34

鴻蒙HarmonyOS應(yīng)用

2020-12-03 11:00:29

Spring ClouRedis數(shù)據(jù)庫

2015-07-31 11:40:36

動效Swift

2023-06-05 15:00:13

書籍翻頁動效鴻蒙

2017-03-23 10:21:57

CSS3動效庫前端

2021-04-15 07:50:45

Veu 動效Vue應(yīng)用程序

2021-06-21 15:49:39

React動效組件

2014-09-28 10:39:24

AppleWatchUI

2025-08-18 09:18:46

2022-08-22 20:10:59

自定義計數(shù)器CSS

2015-08-03 10:40:45

動效設(shè)計優(yōu)勢

2019-07-24 09:00:19

谷歌Android開發(fā)者

2015-07-17 10:41:59

點贊按鈕

2021-03-04 06:14:03

CSS webkit-box-動效
點贊
收藏

51CTO技術(shù)棧公眾號

97超级碰碰碰久久久| 精品少妇一区二区三区在线视频| 色综合电影网| 国产成人精品白浆久久69| 亚洲高清二区| 在线观看中文字幕亚洲| 中文字幕日韩久久| 伊人久久国产| 亚洲狠狠丁香婷婷综合久久久| 久久精品女人的天堂av| 91国产免费视频| 日韩午夜av在线| 久久九九有精品国产23| 六十路息与子猛烈交尾| 九九九精品视频| 精品久久中文字幕| 国产成人三级视频| 天堂a√中文在线| 国内成人免费视频| 日韩免费精品视频| 久草视频免费在线| 日韩理论电影| 亚洲美女动态图120秒| 男人女人拔萝卜视频| 日本综合视频| 精品久久久久久久久久久| a级网站在线观看| 成a人v在线播放| 97久久超碰国产精品| 97神马电影| 国产又大又粗又长| 日韩不卡一二三区| 欧美一区三区三区高中清蜜桃| www.色小姐com| 日韩系列欧美系列| 国产一区二区三区在线观看视频| 91九色蝌蚪porny| 国产剧情一区二区在线观看| 欧美视频在线观看一区二区| 日本精品免费在线观看| 国产蜜臀一区二区打屁股调教| 国产精品久久三区| 日韩精品成人一区二区在线观看| 五月婷婷综合久久| 波多野洁衣一区| 5g影院天天爽成人免费下载| 国产视频一区二区三区四区五区| 免费成人在线观看视频| 国产精品成人aaaaa网站| 影音先锋亚洲天堂| 国产精品一页| 欧美在线视频一区| www成人在线| 国产亚洲在线观看| 欧美亚州一区二区三区| 日韩免费在线视频观看| 99国产精品视频免费观看一公开| 久久久久久高潮国产精品视| 欧美成人精品欧美一级私黄| 亚洲欧美综合久久久| 久久精品久久久久久国产 免费| 黄色av免费播放| 日韩综合在线| 久久成人精品视频| 538任你躁在线精品视频网站| 在线电影一区二区| 久久6精品影院| 久久精品欧美一区二区| 在线精品一区二区| 91sa在线看| 日本熟妇一区二区三区| 免费人成在线不卡| 亚洲xxxxx性| 亚洲第一黄色片| av一区二区不卡| 欧美日韩系列| 日本不卡不卡| 亚洲中国最大av网站| 日韩视频免费播放| 中文不卡1区2区3区| 欧美图区在线视频| 欧美视频亚洲图片| 999久久久精品一区二区| 精品第一国产综合精品aⅴ| 三级电影在线看| 欧洲杯什么时候开赛| 超碰91人人草人人干| 国产午夜精品无码| 日本欧美在线看| 91天堂在线视频| 亚洲欧美综合在线观看| 国产精品日产欧美久久久久| 黄色成人在线免费观看| 日韩电影大全网站| 欧美一级国产精品| 国产艳俗歌舞表演hd| 91欧美大片| 国内外成人免费激情在线视频网站 | 欧美黄色免费网站| jizz国产在线观看| 国产精品一区二区果冻传媒| 久久亚洲国产精品日日av夜夜| 国产区在线视频| 亚洲成人精品一区| 一本色道久久亚洲综合精品蜜桃| 亚洲第一二区| 国产亚洲xxx| 国产无码精品在线观看| 蜜桃视频在线观看一区二区| 国产女人水真多18毛片18精品| a视频网址在线观看| 亚洲第一成人在线| 性欧美在线视频| 美女亚洲一区| 久久久久久久电影一区| 91精东传媒理伦片在线观看| 久久午夜免费电影| 97久久国产亚洲精品超碰热 | 91亚洲永久免费精品| 头脑特工队2在线播放| 亚洲日本护士毛茸茸| 国产又黄又猛又粗又爽的视频| 国产ts一区| 欧美裸体xxxx极品少妇| 一区二区视频网站| 91啦中文在线观看| 日本中文字幕网址| 99re6热只有精品免费观看| 久久久www成人免费精品| 亚洲成熟少妇视频在线观看| 不卡在线视频中文字幕| 久久久成人精品一区二区三区| 欧美色网一区| 精品中文字幕久久久久久| 国产精选第一页| 国产成人精品免费网站| av不卡在线免费观看| 新片速递亚洲合集欧美合集| 精品一区二区三区四区在线| a v视频在线观看| av一二三不卡影片| 日韩欧美不卡在线| 国产福利资源一区| 久久久久久久一| 开心激情综合网| 亚洲国产三级在线| 成人欧美精品一区二区| 亚洲午夜91| 国产精品精品软件视频| 日本电影在线观看| 精品国产乱码久久久久久久| 久久久久免费看| 国产高清不卡二三区| 黄色免费高清视频| 欧美成年网站| 欧美老女人在线视频| av资源免费看| 一区二区三区.www| 国产精品九九视频| 国产精品日韩久久久| 久久国产手机看片| 日韩欧美看国产| 中文字幕亚洲欧美日韩2019| 中文字幕在线视频免费| 亚洲欧美视频在线观看视频| 一起草最新网址| 亚洲电影成人| 欧美人与物videos另类| 国产成人午夜性a一级毛片| 日韩在线观看你懂的| 国产精品熟女久久久久久| 亚洲精品国产一区二区精华液 | 亚洲国产视频二区| 97精品一区二区视频在线观看| 日韩精品一二| 欧美丝袜丝nylons| 91人妻一区二区三区蜜臀| 国产成人综合视频| 91视频最新入口| 成人一二三区| 999久久久| xxxxxx欧美| 精品国产美女在线| 欧美一区二区公司| 在线亚洲一区二区| 久草成人在线视频| 国产视频不卡一区| 手机看片国产精品| 亚洲一区国产一区| 精品久久免费观看| 女一区二区三区| 成人网页在线免费观看| aa级大片免费在线观看| 在线精品国产成人综合| 亚洲国产成人精品一区二区三区| 欧美日韩国产丝袜另类| 多男操一女视频| 91在线一区二区三区| 一级黄色片国产| 亚洲综合激情| 久久天天东北熟女毛茸茸| 亚洲另类av| 97超碰在线播放| 国产成人精选| 91超碰caoporn97人人| 国产网站在线免费观看| 亚洲欧美日韩天堂一区二区| www日本高清视频| 在线视频你懂得一区二区三区| 青青草手机在线观看| 国产日韩高清在线| 在线中文字日产幕| 国产真实乱偷精品视频免| 欧美日韩第二页| 激情综合电影网| 中文字幕精品—区二区日日骚| 天美av一区二区三区久久| 97久久夜色精品国产九色| 黄色成人在线观看网站| 欧美中在线观看| 欧美人与性动交α欧美精品图片| 日韩中文字幕视频| 国产福利在线看| 亚洲免费视频在线观看| 免费激情视频网站| 91精品国产综合久久久久久久 | 国产五月天婷婷| 亚洲欧美日韩中文播放| 欧美巨胸大乳hitomi| 91欧美一区二区| av无码一区二区三区| 国产99精品在线观看| 久久久久久久高清| 精品亚洲porn| 成年人三级黄色片| 免费观看日韩电影| 亚洲xxxx2d动漫1| 日韩不卡一区二区| 亚洲最大综合网| 蜜桃免费网站一区二区三区| 免费黄色一级网站| 日韩激情一二三区| 国产又大又黄又粗的视频| 蜜桃视频一区| 久久久精品三级| 日本aⅴ亚洲精品中文乱码| 亚洲天堂av线| 蜜臀av性久久久久蜜臀aⅴ| 美女网站视频黄色| 精品制服美女丁香| 污视频网址在线观看| 激情综合网最新| 国产无遮挡猛进猛出免费软件 | 色综合色综合色综合| 在线观看日本视频| 日韩欧美国产视频| 无码无套少妇毛多18pxxxx| 色偷偷成人一区二区三区91| 97人妻一区二区精品视频| 91久久精品一区二区三| 中文字幕一区二区免费| 91精品国产综合久久婷婷香蕉| 99在线精品视频免费观看20| 精品国产凹凸成av人导航| 欧美特黄一级视频| 日韩电影免费观看在线观看| 欧美69xxxxx| 日韩专区在线观看| 八戒八戒神马在线电影| 久久久亚洲天堂| 91精品论坛| 成人网在线免费观看| 成人激情自拍| 玖玖玖精品中文字幕| 不卡中文字幕| 国产精品igao激情视频| 一区二区国产在线观看| 亚洲第一狼人区| 国产精品亚洲第一区在线暖暖韩国 | 久久久久99精品成人片三人毛片| 欧美性生活一区| av男人天堂网| 亚洲人成电影在线观看天堂色| 日本中文字幕电影在线免费观看 | 亚洲国模精品私拍| 97电影在线观看| 欧美多人乱p欧美4p久久| 啊啊啊久久久| 国产日韩在线免费| 久久激情av| 一区不卡字幕| 亚洲精品孕妇| 亚洲第一天堂久久| 91尤物视频在线观看| 日本 欧美 国产| 欧美日韩裸体免费视频| 一级特黄录像免费看| 亚洲精品福利视频| 蜜桃视频在线观看免费视频网站www| 久久久噜噜噜久久| 亚洲人成网站在线在线观看| 久久www免费人成精品| 久久久久国产精品| 虎白女粉嫩尤物福利视频| 国产精品18久久久久久久网站| 亚洲综合色一区| 亚洲高清免费一级二级三级| 中文字幕av资源| 日韩h在线观看| 在线观看午夜av| 国产精品免费一区二区三区都可以| 一区二区三区四区精品视频| 午夜精品一区二区在线观看| 国产精品入口66mio| 亚洲热在线视频| 欧美激情综合在线| 日韩中文字幕在线观看视频| 亚洲精品在线观| av在线下载| 国产深夜精品福利| 国产精品片aa在线观看| 免费看国产曰批40分钟| 国产一区二区不卡| 福利视频第一页| 欧美在线你懂的| 欧美日韩国产综合视频| 97视频色精品| 猫咪成人在线观看| 精品一二三四五区| 国产大陆a不卡| 欧美日韩一级大片| 欧美一区二区三区免费大片| 免费在线观看av片| 国产欧美精品xxxx另类| 日韩av久操| 美女黄色片视频| 国产欧美日韩亚州综合| 中文字幕免费高清网站| 国产亚洲精品一区二区| 成人美女黄网站| 久久久久久一区| 在线视频免费在线观看一区二区| 在线看黄色的网站| 亚洲一区二区黄色| 亚洲精品久久久蜜桃动漫| 欧美国产在线视频| 日韩精品一级| 97干在线视频| 成年人网站91| 亚洲欧美综合另类| 亚洲品质视频自拍网| 日韩成人亚洲| 一区二区视频在线观看| 精品综合久久久久久8888| 国产极品美女在线| 欧美一区二区福利视频| 污网站在线免费看| 国产日韩欧美综合精品| 亚洲在线观看| 美女100%露胸无遮挡| 91麻豆精品国产自产在线观看一区| 黄av在线免费观看| 成人久久18免费网站漫画| 精品福利电影| 麻豆av免费观看| 色狠狠色噜噜噜综合网| 97视频在线观看网站| 91亚洲永久免费精品| 国模一区二区三区| 免费黄色在线视频| 欧美久久久一区| 久久国产精品黑丝| 久久亚洲免费| 毛片不卡一区二区| 国产亚洲色婷婷久久99精品| 精品呦交小u女在线| 欧美成人高清视频在线观看| 日韩a级黄色片| 26uuu成人网一区二区三区| 97人妻精品视频一区| 欧美成人一二三| 亚洲最大在线| 小早川怜子一区二区三区| 天天色 色综合| 亚洲视频tv| 国产精品久久久久久久久久直播 | 无码国产精品一区二区高潮| 午夜精品视频在线观看| 韩国三级av在线免费观看| 亚洲综合精品一区二区| 99日韩精品| 91插插插插插插| 国产亚洲一区二区精品| av不卡一区| 8x8x最新地址| 精品国产乱码久久久久久虫虫漫画| 日本精品一区二区三区在线播放| 九色91视频| 国产精品亚洲成人| 一本到在线视频|