亚洲 卡通 欧美 制服 中文,午夜在线看的免费网站,黑人太大了太深了好痛 视频,国产乱妇乱子视频在播放

廣州總部電話:020-85564311
20年
互聯(lián)網(wǎng)應(yīng)用服務(wù)商
廣州總部電話:020-85564311
20年
互聯(lián)網(wǎng)應(yīng)用服務(wù)商
請(qǐng)輸入搜索關(guān)鍵詞
知識(shí)庫(kù) 知識(shí)庫(kù)

優(yōu)網(wǎng)知識(shí)庫(kù)

探索行業(yè)前沿,共享知識(shí)寶庫(kù)

用 CSS 搞定酷炫的點(diǎn)贊粒子動(dòng)效!

發(fā)布日期:2025-08-11 17:32:20 瀏覽次數(shù): 816 來(lái)源:全棧修仙之路
推薦語(yǔ)
讓你的點(diǎn)贊按鈕瞬間吸睛!兩分鐘學(xué)會(huì)CSS粒子動(dòng)效,輕松提升頁(yè)面互動(dòng)體驗(yàn)。

核心內(nèi)容:
1. 分解點(diǎn)贊動(dòng)效的拋物線運(yùn)動(dòng)與數(shù)字縮放原理
2. 使用CSS動(dòng)畫緩沖函數(shù)實(shí)現(xiàn)平拋運(yùn)動(dòng)
3. 單層/嵌套標(biāo)簽兩種實(shí)現(xiàn)方案對(duì)比與優(yōu)化技巧
小優(yōu) 網(wǎng)站建設(shè)顧問(wèn)
專業(yè)來(lái)源于二十年的積累,用心讓我們做到更好!

大部分点击效果都平平无奇,如果你碰到一个这样的点击效果,会不会忍不住多点几次呢?

Kapture 2025-08-09 at 13.19.13

看似有些复杂,其实分解开来,其实就两个动画

  1. 粒子的抛物线动画
  2. 数字的缩放动画

下面来一步步实现它,花两分钟一起看看吧

一、CSS 抛物线运动

先从单个粒子看,其实就是一个抛物线运动,我们先从平抛运动开始。

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

image-20250809133654026

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

这里简单介绍一下

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

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

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

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

运动分解效果如下:

Kapture 2023-04-21 at 17.26.05

当然,这里为了兼容性考虑,使用了两层标签,其实还可以使用单层标签实现,需要用到动画合成属性,

回到我们的例子,假设单个粒子的HTML是这样的

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

关键样式如下

.custom-tips {
position: absolute;
width1em;
height1em;
margin-left: -.5em;
margin-top: -.5em;
left0;
top0;
transformtranslate(var(--left, 50%), var(--top, 50%));
}
.custom-tips-dot {
position: absolute;
inset0;
display: flex;
justify-content: center;
align-items: center;
opacity0;
animation: custom-x 1s linear forwards;
}
.custom-tips-dot::before {
contentattr(emoji, '🎉');
animation: custom-y 1scubic-bezier(0.5500.850.36);
}

/* x方向 */
@keyframes custom-x {
  100% {
    transformtranslateX(300%);
  }
}
/* y方向 */
@keyframes custom-y {
  100% {
    transformtranslateY(300%);
  }
}

效果如下(绿色线框是水平运动)

Kapture 2025-08-09 at 14.03.54

这样就简单实现了一个平抛运动

二、CSS 斜抛运动

平抛运动可能没有那种礼花绽放的感觉,有点平淡,我们还需要有一定角度朝上做斜抛运动。

看着好像有点复杂?其实就是多了一个向上的初始速度,示意如下

image-20250809141915739

这个在 JS中很好实现,给一个初始值就行,垂直方向上先往上减速,一直到 0,然后开始加速,这样整体就是一个斜抛运动了。

那么,CSS 如何处理呢?好像并没有这种概念。

其实呢,可以从缓冲函数入手,比如上面用到的缓冲函数是cubic-bezier(0.55, 0, 0.85, 0.36),是一种逐渐变快的运动

image-20250809142326339

这时,我们可以改变第一个锚点,往下拉,直到第二个值出现负数,如下

image-20250809142536888

这样会出现一个轻微的回弹效果,效果如下

Kapture 2025-08-09 at 14.26.33

是不是有点像斜抛运动了?

我们可以继续调整幅度,让回弹效果更强烈一些,比如

image-20250809143033923

这样就更接近真实的斜抛运动了

Kapture 2025-08-09 at 14.29.11

关键 CSS 如下

.custom-tips-dot::before {
    contentattr(emoji, '🎉');
    animation: custom-y 1s cubic-bezier(0.56, -1.350.850.36) forwards;
  }

是不是也比较容易?

三、借助JS批量生产

单个粒子可能比较死板,也不够随机。

要实现随机也比较容易,每次生成例子的水平位移不同就行了,然后多个粒子的动画有一定的延时就可以了。

image-20250809235534054

为了方便JS透传过去,可以借助CSS变量来生成

这里用--x表示水平位移,--d表示延迟

.custom-tips-dot {
position: absolute;
inset0;
display: flex;
justify-content: center;
align-items: center;
opacity0;
outline1px solid yellowgreen;
animation: custom-x 1svar(--d, 0s) linear forwards; 
}
.custom-tips-dot::before {
contentattr(emoji, '🎉');
animation: custom-y 1svar(--d, 0scubic-bezier(0.56, -1.350.850.36) forwards;
}
/* x方向 */
@keyframes custom-x {
  0% {
    opacity0;
    transformtranslateX(0%)
  }
  10%, 90% {
    opacity1;
  }
  100% {
    opacity0;
    transformtranslateX(var(--x, 300%)); /*随机的水平位移*/
  }
}

然后用 JS动态生成这些 dom

function createDots(emojis{
const temp = document.createDocumentFragment();
const random_emojis = emojis.slice(0Math.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);
    /*动画结束后自动移除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);
})

这样就能每次随机生成一定数量的emoji了,效果如下

Kapture 2025-08-09 at 14.39.25

四、+1 动画

数字变化动画是最简单的,就是一个缩放+透明度变化的动画。

image-20250810000526217

假设HTML是这样的

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

我们用伪元素来生成+1的字符,动画很简单,就两个关键帧,实现如下

.custom-num {
position: absolute;
left0;
top0;
display: flex;
width2em;
height2em;
font-size2em;
color#fff;
justify-content: center;
align-items: center;
margin-left: -1em;
margin-top: -2em;
font-weight: bold;
text-shadow4px4px0rgba(255,0,0);
transformtranslate(var(--left), var(--top));
}
.custom-num::before {
content'+'attr(num);
opacity0;
animation: count-shark 1svar(--d, 0s);
}
@keyframes count-shark {
  0%,100%{
    opacity0;
    transformscale(.4);
  }

  30%,70%{
    opacity1;
    transformscale(1);
  }
}

效果如下

Kapture 2025-08-09 at 14.46.13

然后我们借助JS来实现数字增加的逻辑,其实就是移除上一个,新增一个dom,新增的会自动执行动画,实现如下

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

最后两者结合起来,就实现了文章开头所示效果

Kapture 2025-08-09 at 13.19.13

你也可以访问在线demo真实体验:https://codepen.io/xboxyan/pen/wBKqpXb

五、其实canvas可能更适合

一般来说,粒子动画可能canvas来实现更合适一点,性能也更好,不过可能对新手不太友好。这里推荐一个开箱即用的库:叫做 Canvas Confetti,专门用来做这种礼花绽放特效的,如果自己手搓不来,可以试试这个。

image-20250810132611193

不过我们这里案例的粒子也不是很多,所以使用CSS也无所谓了。



優(yōu)網(wǎng)科技,優(yōu)秀企業(yè)首選的互聯(lián)網(wǎng)供應(yīng)服務(wù)商

優(yōu)網(wǎng)科技秉承"專業(yè)團(tuán)隊(duì)、品質(zhì)服務(wù)" 的經(jīng)營(yíng)理念,誠(chéng)信務(wù)實(shí)的服務(wù)了近萬(wàn)家客戶,成為眾多世界500強(qiáng)、集團(tuán)和上市公司的長(zhǎng)期合作伙伴!

優(yōu)網(wǎng)科技成立于2001年,擅長(zhǎng)網(wǎng)站建設(shè)、網(wǎng)站與各類業(yè)務(wù)系統(tǒng)深度整合,致力于提供完善的企業(yè)互聯(lián)網(wǎng)解決方案。優(yōu)網(wǎng)科技提供PC端網(wǎng)站建設(shè)(品牌展示型、官方門戶型、營(yíng)銷商務(wù)型、電子商務(wù)型、信息門戶型、微信小程序定制開發(fā)、移動(dòng)端應(yīng)用(手機(jī)站、APP開發(fā))、微信定制開發(fā)(微信官網(wǎng)、微信商城、企業(yè)微信)等一系列互聯(lián)網(wǎng)應(yīng)用服務(wù)。


我要投稿

姓名

文章鏈接

提交即表示你已閱讀并同意《個(gè)人信息保護(hù)聲明》

專屬顧問(wèn) 專屬顧問(wèn)
掃碼咨詢您的優(yōu)網(wǎng)專屬顧問(wèn)!
專屬顧問(wèn)
馬上咨詢
聯(lián)系專屬顧問(wèn)
聯(lián)系專屬顧問(wèn)
聯(lián)系專屬顧問(wèn)
掃一掃馬上咨詢
掃一掃馬上咨詢

掃一掃馬上咨詢

和我們?cè)诰€交談!