冬日嘉年华,利用canvas实现雪花❉飘飘+打字机效果!


theme: juejin

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情

前言

掘友们,大家好呀,这篇文章给大家详细的介绍了使用HTML5+canvas实现雪花飘落特效,效果也是非常不错的,相对于来说非常简单,效果逼真,感兴趣的掘友,可以参考一下。

实现效果

6zyql-fi6xw.gif

需求分析

  1. 雪花一般采用圆形,想要更加好看一点的掘友,可以采用img代替,
  2. 雪花的数量,大小,数量设置固定,根据页面查看。采用随机数,控制大小,每一朵雪花的大小都不是一致的,用随机数控制半径,实现雪花的大小不同。
  3. 雪花的位置是不断下落的,雪花飘落,通过控制位置移动实现。
  4. 打字机:实现原理通过计时器,不断更新innerHTML

代码实现

CSS

先控制页面设置样式,黑色背景看雪花更直观。

body,
html {
    margin: 0;
    height: 100%;
    font-family: 'Lato';
    font-weight: 700;
    font-size: 30px;
    text-transform: uppercase;
    color: #FFF;
}
.box {
    height: 100%;
    color: #FFF;
    background-color: #000;
    display: flex;
    justify-content: space-around;
    align-items: center;
}

JS

设置自执行function函数,执行过程中,创建casvas标签,设置大小。创建雪花,通过随机数设置元素大小,固定雪花数量,for循环添加到box中。

text()函数是用来实现打字机效果,通过计时器,字符串截取,索引增加,赋值元素盒子的innerHTML,时实现打字效果。

(function () {
    var COUNT = 300;
    var masthead = document.querySelector('.box');
    var canvas = document.createElement('canvas');
    var ctx = canvas.getContext('2d');
    var width = masthead.clientWidth;
    var height = masthead.clientHeight;
    var i = 0;
    var active = false;
    function onResize() {
        width = masthead.clientWidth;
        height = masthead.clientHeight;
        canvas.width = width;
        canvas.height = height;
        ctx.fillStyle = '#FFF';
        var wasActive = active;
        active = width > 600;
        if (!wasActive && active)
            requestAnimFrame(update);
    }
    var Snowflake = function () {
        this.x = 0;
        this.y = 0;
        this.vy = 0;
        this.vx = 0;
        this.r = 0;
        this.reset();
    }
    Snowflake.prototype.reset = function () {
        this.x = Math.random() * width;
        this.y = Math.random() * -height;
        this.vy = 1 + Math.random() * 3;
        this.vx = 0.5 - Math.random();
        this.r = 1 + Math.random() * 2;
        this.o = 0.5 + Math.random() * 0.5;
    }
    canvas.style.position = 'absolute';
    canvas.style.left = canvas.style.top = '0';
    var snowflakes = [], snowflake;
    for (i = 0; i < COUNT; i++) {
        snowflake = new Snowflake();
        snowflake.reset();
        snowflakes.push(snowflake);
    }
    function update() {
        ctx.clearRect(0, 0, width, height);
        if (!active)
            return;
        for (i = 0; i < COUNT; i++) {
            snowflake = snowflakes[i];
            snowflake.y += snowflake.vy;
            snowflake.x += snowflake.vx;
            ctx.globalAlpha = snowflake.o;
            ctx.beginPath();
            ctx.arc(snowflake.x, snowflake.y, snowflake.r, 0, Math.PI * 2, false);
            ctx.closePath();
            ctx.fill();
            if (snowflake.y > height) {
                snowflake.reset();
            }
        }
        requestAnimFrame(update);
    }
    // shim layer with setTimeout fallback
    window.requestAnimFrame = (function () {
        return window.requestAnimationFrame ||
            window.webkitRequestAnimationFrame ||
            window.mozRequestAnimationFrame ||
            function (callback) {
                window.setTimeout(callback, 1000 / 60);
            };
    })();
    onResize();
    window.addEventListener('resize', onResize, false);
    masthead.appendChild(canvas);
    function text() {
        var myp = document.getElementById("myp");
        var contentArr = "欢迎来到沸点冬日嘉年华".split("");
        var content = "";
        var index = 0;
        var ID = setInterval(function () {
            content += contentArr[index];
            myp.innerHTML = content + "_";
            index++;
            if (index === contentArr.length) {
                myp.innerHTML = content;
                clearInterval(ID);
            }
        }, 200);
    }
    text()
})();

码上掘金

这边小编同样将代码放到了码上掘金,感兴趣的掘友可以参考一下。

代码片段

结尾

掘友们,以上就是本文的全部内容了,希望对大家的学习有所帮助。小编也是在每天工作的同时,也在学习着不同的东西,看到了小功能,小编也会亲手实现一下,效果也是非常不错的,后续关注小编,每天都会更新丰富的内容。

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容