精品欧美一区二区三区在线观看 _久久久久国色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ù)棧公眾號

亚洲三级小视频| 免费成人在线观看视频| 亚洲国产小视频| 黑鬼大战白妞高潮喷白浆| 99re在线视频| 国产成人欧美日韩在线电影| 91精品国产91久久久久福利| 在线免费观看视频| 日韩黄色av| 色综合色综合色综合| 国产福利片一区二区| 日本精品一二区| 久久av中文字幕片| 91av在线播放| 国产精品嫩草影院俄罗斯| 日韩激情啪啪| 欧美成人一区二区三区| 欧美 激情 在线| 国产丝袜在线播放| 国产精品青草综合久久久久99| 大波视频国产精品久久| 伊人免费在线观看高清版| 亚洲美女黄色| 欧美成人自拍视频| 色噜噜噜噜噜噜| 日韩中出av| 精品久久国产字幕高潮| 国产九九在线视频| 9i看片成人免费高清| 亚洲欧美日韩中文字幕一区二区三区| 欧美激情专区| 无码国产色欲xxxx视频| 国产成人亚洲综合a∨婷婷| 国产精品网红直播| 久久久久久久久久一级| 99国产精品自拍| 欧美人在线观看| 69夜色精品国产69乱| 欧美精品尤物在线观看| 亚洲精选中文字幕| 一级特级黄色片| 亚洲综合色婷婷在线观看| 欧美日韩国产一区二区三区地区| 中文字幕日本最新乱码视频| 国产三级伦理在线| 亚洲精品国产高清久久伦理二区| 一区二区三区的久久的视频| 啊v在线视频| 国产日韩欧美a| 日产中文字幕在线精品一区 | 97人人在线视频| 亚洲午夜日本在线观看| 免费人成自慰网站| 欧美家庭影院| 亚洲福利一区二区三区| 黄色激情在线视频| 国产第一页在线| 亚洲v日本v欧美v久久精品| 久久在线中文字幕| 9999在线视频| 欧美日韩中文字幕日韩欧美| jizzjizzxxxx| 91超碰碰碰碰久久久久久综合| 在线观看一区二区精品视频| 欧美日韩在线免费播放| 精品网站在线| 678五月天丁香亚洲综合网| 一道本在线免费视频| 在线欧美激情| 日韩一区二区三区四区五区六区| gogo亚洲国模私拍人体| 都市激情久久| 亚洲摸下面视频| 一级在线观看视频| 香港欧美日韩三级黄色一级电影网站| 伦理中文字幕亚洲| 日本亚洲欧美在线| 久久不射中文字幕| 国产色综合天天综合网| www香蕉视频| 91在线视频免费91| 日韩福利视频| 中文字幕伦理免费在线视频| 午夜精品久久久久久久99樱桃| 亚洲国产精品久久久久婷蜜芽 | 成人激情春色网| 精品人妻无码一区二区色欲产成人| 成人自拍视频在线| 日本亚洲欧洲精品| 爆操欧美美女| 岛国av一区二区| 国产无遮挡猛进猛出免费软件| 香港久久久电影| 国产亚洲欧美一区| 激情四射综合网| 视频一区二区三区中文字幕| 91久久国产精品91久久性色| 日本久久一级片| 国产精品久久久久久久久免费丝袜| 成人国产在线看| 欧美精品高清| 精品福利视频一区二区三区| 国产精品久久久视频| 亚洲国产专区| 成人性生交大片免费看视频直播 | 91在线观看高清| 亚洲啪啪av| 岛国av免费在线观看| 精品视频色一区| 在线免费观看污视频| 99精品全国免费观看视频软件| 久久久爽爽爽美女图片| 97国产精品久久久| 久久影院电视剧免费观看| 国产一级黄色录像片| 自拍偷自拍亚洲精品被多人伦好爽| 欧美一区二区福利在线| 日本猛少妇色xxxxx免费网站| 好看的日韩av电影| 成人午夜黄色影院| www.av在线| 欧美天天综合色影久久精品| 国产人妖在线观看| 亚洲老妇激情| 国产精品一区电影| 成人18在线| 欧美午夜精品久久久久久久| 精品一区二区三区四区五区六区| 97色伦图片97综合影院| 国产精品国产三级国产aⅴ浪潮 | 久久久精品国产亚洲| 手机在线看片1024| 99精品视频在线观看免费| 久久手机在线视频| 日韩免费高清视频网站| 久久精品视频亚洲| 国产一区二区麻豆| 国产精品卡一卡二卡三| 精品999在线| 国产成人手机高清在线观看网站| 国语自产精品视频在线看抢先版图片| 国产ts变态重口人妖hd| 亚洲日本青草视频在线怡红院| 天堂网在线免费观看| 日本久久一二三四| 国产精品免费电影| 午夜免费福利在线观看| 欧美揉bbbbb揉bbbbb| 波多野结衣一二三四区| 日韩精品免费专区| 亚洲mv在线看| 日本精品久久| 久久综合五月天| 精品国产一级片| 一区二区三区国产精品| 香蕉在线观看视频| 一区免费在线| 欧美人xxxxx| 丝袜美腿诱惑一区二区三区| 国产一区二区三区网站| 中文字幕 视频一区| 国产精品久久久久久一区二区三区| 中文字幕天天干| 国产精品国产一区| 99re国产视频| 国产高潮在线| 亚洲一区av在线播放| 中文字幕在线观看第二页| 国产精品女人毛片| 先锋资源在线视频| 99亚洲视频| 日韩妆和欧美的一区二区| 日韩黄色三级在线观看| 超在线视频97| 五月激情丁香婷婷| 91黄色免费版| 欧美偷拍第一页| www.亚洲在线| 嫩草影院国产精品| 欧美日本免费| 欧美日韩日本网| 国产精品高清一区二区| 久久久久久69| 九色蝌蚪在线| 日韩三级av在线播放| 永久免费看片在线播放| 亚洲国产精品高清| 久久av一区二区三| 日韩和欧美一区二区三区| 日本一级淫片演员| 日韩精品a在线观看91| 成人h视频在线| 国内激情视频在线观看| 日韩最新免费不卡| 欧美特黄一级视频| 欧美日韩情趣电影| 午夜影院在线看| 最新中文字幕一区二区三区| 丰满大乳奶做爰ⅹxx视频| 蜜臀99久久精品久久久久久软件| 青青在线免费视频| 国产精品一区2区3区| 成人国产一区二区| 91大神在线观看线路一区| 久久久影视精品| av在线播放免费| 日韩av在线网页| 精品二区在线观看| 欧洲人成人精品| 天海翼一区二区| 亚洲最大成人网4388xx| 性の欲びの女javhd| 99视频有精品| 熟女人妻一区二区三区免费看| 久久精品一区二区三区中文字幕| 免费视频爱爱太爽了| 91久久夜色精品国产按摩| 鲁片一区二区三区| 99久久人爽人人添人人澡| 国产一区在线播放| 户外露出一区二区三区| 91sa在线看| heyzo一区| 久久6精品影院| 成人黄视频在线观看| 伊人伊成久久人综合网小说| 免费成人av电影| 日韩av中文字幕在线| 欧美特黄一级视频| 精品国产污网站| 亚洲黄色一级大片| 日韩欧美一级二级三级久久久| 亚洲在线免费观看视频| 在线观看av一区| 无码人妻精品一区二区蜜桃色欲| 亚洲成人第一页| 国产一国产二国产三| 亚洲影视资源网| 久久久精品国产sm调教| 亚洲女同ⅹxx女同tv| avtt天堂在线| 亚洲欧美成aⅴ人在线观看| 亚洲av无一区二区三区| 国产精品美女久久久久久2018| www亚洲色图| 中文字幕av一区二区三区免费看| 免费在线观看a视频| 国产欧美日韩亚州综合| 女人十八毛片嫩草av| 欧美激情一区三区| 中国1级黄色片| 国产精品乱码人人做人人爱 | 欧美在线二区| japanese在线播放| 狠狠综合久久| www国产黄色| 日韩国产在线一| xxx国产在线观看| 国产在线视频精品一区| 性一交一黄一片| 成人黄色777网| 波多野结衣福利| 欧美韩国日本不卡| 欧美黄色aaa| 亚洲国产精品尤物yw在线观看| 国产精品第九页| 一本色道a无线码一区v| 中文字幕第315页| 91.com视频| 日韩有码第一页| 亚洲欧美综合另类中字| 老司机午夜在线视频| 欧美高清电影在线看| 天堂电影一区| 国产噜噜噜噜噜久久久久久久久| 国产精品中文| 久久国产精品久久精品国产| 色婷婷综合网| 日本黄大片在线观看| 久久www成人_看片免费不卡| 国产一区二区在线观看免费视频| 国产白丝精品91爽爽久久 | 亚洲国产www| 亚洲精品综合精品自拍| 好吊日视频在线观看| 91精品国产91久久久久久不卡| 福利一区二区三区视频在线观看| 91情侣在线视频| 日韩三级视频| 影音先锋成人资源网站| 丝袜美腿亚洲综合| 免费观看黄网站| 国产日韩精品视频一区| 老妇女50岁三级| 欧美最猛性xxxxx直播| www国产一区| 在线视频亚洲欧美| 91超碰免费在线| 国产综合香蕉五月婷在线| 啪啪激情综合网| 欧美少妇一区二区三区| 日本大胆欧美人术艺术动态| 精品国产免费久久久久久婷婷| 欧美国产乱子伦| 天天操天天摸天天干| 欧美一区二区免费观在线| 国产精品久久久久久久龚玥菲 | 国产亚洲精品久久久久久牛牛| 在线看三级电影| 国产精品亚洲自拍| 亚洲区小说区图片区qvod按摩| 精品日韩在线播放| 欧美96一区二区免费视频| 91av在线免费| 一区二区在线观看免费视频播放| 在线观看国产区| 日韩精品极品毛片系列视频| 先锋成人av| 成人a在线视频| 日韩精品欧美| 亚洲一二三区av| 久久无码av三级| 国偷自拍第113页| 精品久久久久久久久久久久包黑料 | av图片在线观看| 亚洲精品福利在线观看| 青青草原av在线| 亚洲精品免费一区二区三区| 99精品美女| 男生操女生视频在线观看| 中文字幕欧美激情| 五月婷婷六月婷婷| 亚洲人成自拍网站| 亚洲精品成人图区| 久久av一区二区三区漫画| 日韩午夜av在线| 男人的天堂影院| 偷拍与自拍一区| 欧美一级视频免费| 国内精品久久久久久中文字幕| 亚洲精品视频一二三区| 久久男人资源站| 成人综合在线观看| 一级aaa毛片| 精品偷拍一区二区三区在线看| 蜜桃视频在线观看播放| 精品欧美日韩| 久久精品日产第一区二区 | 日本高清视频www| 久久全球大尺度高清视频| 成人搞黄视频| 5月婷婷6月丁香| 国产色婷婷亚洲99精品小说| 久草视频在线免费| 波霸ol色综合久久| 欧洲一区在线| 精品视频在线观看一区| 99re视频精品| 日本中文字幕在线观看视频| 一区二区三区亚洲| 欧美jizz18| 四虎永久免费网站| 成人小视频在线| 国产精品男女视频| 国产一区二区三区视频| 精品国产一级| 日韩中文字幕在线免费| 久久精品在线观看| 国产内射老熟女aaaa∵| 欧美激情精品久久久久久免费印度 | 久久久久久久久久久久久久久| 欧洲一区二区av| 视频在线这里都是精品| 久久人人九九| 麻豆精品久久久| 久一视频在线观看| 亚洲欧洲xxxx| 99久热在线精品视频观看| 美脚丝袜脚交一区二区| 国产清纯在线一区二区www| 91精品中文字幕| 97视频在线观看播放| 欧美色网址大全| 极品白嫩的小少妇| 日本丰满少妇一区二区三区| 妞干网在线视频观看| 国产米奇在线777精品观看| 日本免费一二三区| 中文字幕日韩欧美在线视频| 一本一道久久a久久| av五月天在线| 亚洲国产一区在线观看| 成人高清网站| 国产日韩欧美二区| 久久aⅴ国产欧美74aaa| 青青操免费在线视频| www.日韩视频| 免费久久久久久久久| 亚洲涩涩在线观看| 午夜成人免费视频|