欢迎光临散文网 会员登陆 & 注册

随便写的JS片段分析 CSS粒子(伪)(一)

2017-08-13 00:02 作者:暗切线  | 我要投稿

开了两天专栏一直没想好写点码。在沫沫莉1K竹子贿赂之下,直播了两小时写代码。想了想,干脆就写着玩玩吧。

由于不能直播公司代码,所以基本是我想到什么写什么的。比较简单的小东西。而且没有半毛钱卵用。

定期传gayhub: https://github.com/yqjiang/wtfanimates (嗯。手动黏贴吧。这里不可以站外地址呀)

代码遵从 DWTFYW (你特么爱干嘛干嘛协议) V2 协议 (反正没什么卵用)

文章更新顺序 : 

这里 -> 个人博客 (darktan.top)换链接站内信!引用源直接写这里,服务器要钱租,我不想我博客访问量过大。

由于我代码太烂,我的一个房管忍不住辞职了。。。所以以后直播这事儿待定了。。。


----------

这期是上周写的一个(伪)粒子系统。然而并没有写完。

先来说说 Motion (Windows下可以用AE生成 )的粒子:

选一个粒子发生器 (然而只写了大约一种??)

选个原图(然而并没做)

选择范围(然而并没做)

选择源点(这里只写了基于底边线的)

选择方向 (然而hardcode)

衰减度(然而hardcode)

生成

所以说,这只是个简单例子,效果看封面(此处应该是一张动图)。

先说步骤吧。 

首先,准备好单个粒子,硬性写个衰减度(这里是 0.7-0)写一段CSS试一试 代码是这样的

HTML:

<div class="point point0"></div>  <!-- 希望B站做了HTML encode -->

注:如果 这里没有做HTML encode 上面那句话你们应该看不到了 哈哈哈~ 

CSS:

.point1 {

    width10px; /** 此处应产生一定范围内随机数 **/

    height10px; /** 此处随机数应与楼上保持一致 **/

    background#fff;  /** 额。懒,留着下周修成图片**/

    border-radius5px; /** 此处随机数应是楼主 的一般,图片情况下不馋合**/

    positionabsolute;

    animationparticle 5s both 0s infinite; /** 两个随机的时间  一直循环,于是不用过多生成节点 此处没做兼容,请自行添加 **/

    left10%;/** 随机数 **/

}

/** 动画部分:**/

@keyframes particle {

    0% {  /** 先隐藏一下。。要么突然掉下来丑~ **/

        bottom: 0%;

        opacity: 0;

    } 

    1% {

        bottom: 0%;

        opacity: 0.7;

    } 

    100% {

        bottom: 100%;

        opacity: 0;

    }

}


下一步: 

产生随机:

写了个js 

function particle(num) {

    var domstr = '';

    var cssstr = '';

    for (var i=0; i < num; i++) {

        var redius = parseInt(Math.random() * 15 + 5); // 随机数生成 起名有问题,应该是直径!5-20之间的一个数字

        domstr += '<div class="point point' + i +'"></div>'

        cssstr += '.point' + i +' {'

            + 'width: ' + redius + 'px;'

            + 'height: ' + redius + 'px;'

            + 'background: #fff;'

            + 'border-radius: ' + (redius / 2) +'px;'

            + 'position: absolute;'

            + 'animation: particle ' + ((parseInt(Math.random() * 50) / 10) + 5) + 's both ' + ((parseInt(Math.random() * 10 + 1) / 10)) +'s infinite;' // 此处的随机数是我乱写的。。后面的延迟时间还需要改。

             + 'left: ' + (Math.random() * 100) + '%'

            + '}';

      }

       cssstr += '@keyframes particle {'

           + '0% {'

           + 'bottom: 0%;'

           + 'opacity: 0;'

           + '} '

            + '1% {'

            + 'bottom: 0%;'

            + 'opacity: 0.7;'

            + '} '

            + '100% {'

            + 'bottom: 100%;'

            + 'opacity: 0;'

            + '}}';

  var cssdom = document.querySelector('.gen');

  cssdom.innerHTML = cssstr;

  var previewdom = document.querySelector('.prefview');

  previewdom.innerHTML = domstr;

}


一些说明。这里的动画function 用的默认 ease 为毛???

ease = 贝塞尔曲线(0.25, 0.1, 0.25, 1.0); 

大致上说就是先慢 中间快 后面慢。配合变淡。看起来会有一些变化。好看些

(以上是我胡扯的,只不过懒而已)

生成后,可以直接黏贴代码进某个页面。。。效果相同→_→


然后还是说一下粒子系统的正确姿势吧。这个是伪的!并不是有点的玩意都能叫粒子系统!

粒子系统应当遵循物理特征,我写那玩意,牛顿棺材板都压不住。

比如从一个点发出的粒子,首先是有个随机横向速度 和一个随机纵向速度的。

横向速度随时间衰减(空气阻力 忽略不计) 纵向速度也随时间衰减 先衰减到0 然后变成负的(下落)形成一条完美而光滑的抛物线 (❓❓❓我为毛要用形容词)

然后就是由于粒子较小。(比如火焰,水滴)一定是越来越小 越来越暗的。包括燃烧原因,和蒸发原因。

以上说的是一个正常的粒子系统。


然后说说视频特效里的

常用的几种情况 

  1. 现在写的 由下往上。。

  2. 由一个边角,向屏幕中散发 (这个其实纯CSS也能伪出来)

  3. 由文字、图形边缘向外散发。(计算法向量最准确,然而基本也是在边缘随机生成,然后从物体中心点向外散发)

基本特征是,跟牛顿他老人家没有半毛钱关系,随机生成,变暗 完成。。(Motion里默认不变暗,需要特殊调试)


所以先写到这。高中物理,自己回去复习,不贴公式装逼。



随便写的JS片段分析 CSS粒子(伪)(一)的评论 (共 条)

分享到微博请遵守国家法律