feng 发布的文章

倒计时超期图标制作

前端时间美工有出图做一个事件还剩时间的动态图标.
因为页面是在首页,希望可以动态改变剩余的时间,效果如下图:

倒计时图片

这功能的确挺让人眼前一亮的,于是想分享一下当时自己写的框架.
框架是基于canvas去做的.

先给个源码demo链接:
动态倒计时图标

demo效果:

demo中的common.js是一些简单的时间处理函数,其他地方抄来的,我很多地方都会用common.js就不细说了.

框架源码里有几个常量说一下:

  • var CANVAS_WIDTH = 64; 定义绘制图片的canvas的宽高,最终图片会是拉伸状态,最好是和最后生成的图片宽高相同.
  • var FONT_SIZE = 13; 绘制图片上的文字字体大小,这个是和宽高联合调整的,宽高大了,字当然也要相对调整大.
  • var CLOCK_FONT_SIZE = 10; 这个是画时钟里面那个字的大小(本人写的是 "超" 字,时间超了后会显示)
  • var IMAGE_COLOR_ARRAY = [{overValue:,color:},...] 这个数组是定义剩余不同时间,时钟所显示的颜色.要按照overValue降序排列,第一个必然是overValue=null,
    表示默认显示颜色.

程序框架默认剩余分秒状态下会自动更新,超过1天的状态就不更新了,如果有需要也可以把超过1天的状态的也加入更新,更新位置在下面函数过程中,比较简单,就不多做说明.
程序返回一个毫秒数,在setTimeout函数中会调用.

//下一次更新图片的时间.
function nextUpdateTime(timeObject) {
    var obj = timeObject;
    var sDate;
    var num;
    if(obj.day != 0) return 0; //不用更新了.

    if(obj.hour != 0) {
        //未验证,应该没问题,如果有问题改成1分钟刷一次好了
        var s = obj.minute % 3600;
        if(s < 0) s = 3600 + s;
        if(s == 0) {
            s = Math.abs(obj.hour) > 1 ? 3600 : 60;
        }
        num = s * 1000;

    } else if(obj.minute != 0) {

        var s = obj.second % 60;
        if(s < 0) s = 60 + s;
        if(s == 0) {
            s = Math.abs(obj.minute) > 1 ? 60 : 1;
        }
        num = s * 1000;

    } else {
        num = 1000;
    }
    return num;

}

发现什么问题的,欢迎联系作者邮箱^_^

原生canvas制作刮刮乐效果

商城网站很多时候会有类似刮刮乐的功能,网上看到的实现方式是通过两个canvas实现.
总觉得比较low.于是自己封装了一个纯canvas底层实现刮刮乐模型
当然功能没有封装的很全,比方说加个背景图/奖品为图片等等..
当然这些功能都可以很简单的修改源码去实现了.
下面提供一下制作思路
在canvas绘制顺序应该是:
绘制背景图片(这一步我没有做)
->绘制蒙版
->destination-out模式绘制擦除蒙版的线段
->destination-over模式绘制奖品内容

照例给个demo地址:
刮刮乐demo
效果:

调用代码:

/**
     * 刮刮卡
     * @param {Object} opt
     * el: canvas id
     * text: 显示文字
     * textColor: 文字颜色 默认 #000
     * maskColor: 蒙版颜色 默认 #000
     * lineWidth: 擦除线条宽度 默认 20
     * fontStyle: 文字样式 默认 30px Georgia
     * callback: 用户第一次擦除回调(奖品在第一次擦除的时候获取.)
     * method
     *     setValue: 奖品赋值
     */
    var mask = maskShape({
        el: 'canvas',
        text: null,
        maskColor: "#ccc",
        textColor: '#000',
        lineWidth: 20,
        fontStyle: '30px Georgia',
        callback: function() { //第一次擦除回调函数. this指向对象本身
            //return 如果奖品是第一次擦除时加载进来,在callback中写ajax取值
            //如果超过200毫秒延迟体验会比较差,可以预先做一个生产队列
            var self = this;
            setTimeout(function() {
                var arr = ['一等奖', '二等奖', '三等奖', '谢谢惠顾'];
                var z = Math.floor(Math.random() * arr.length);
                self.setText(arr[z]);
            }, 200);
        }
    });

    //修改刮刮卡中值.
    //mask.setText('aaaa');

初探css3之3维动画效果

前端时间有在一个网站上看到css3的三维效果,感觉很棒,链接如下:
NIPPON COLORS
打开他的model开关,可以看到一个很炫的3D效果,

下面是效果截图:

NIPPON COLORS

是不是很棒...

我也觉得很好,很心动,于是就动手模仿了.

先看完成的效果吧.


来看一下几个关键的部分:
css3 3D效果,关键是下面几个属性,
首先整个模型大概是:

<div class="stage"> 
    <div class="container">
    ...要展现3d部分的内容        
            <img />
            ...
    </div>
</div>
  1. 首先要有一个舞台:stage
    他有一个最重要的属性:perspective,可以理解成,观看的人,距离舞台,有多少远,比方说我这里设置了800px
  2. 接着再来一个容器:container
    他也有一个重要的属性transform-style: preserve-3d; 告诉浏览器,这个容器是要显示3d效果的.
  3. 再下面就要上具体的内容了.
    内容有一个重要的属性:transform
    他可以设置3个关键属性rotateX, rotateY, rotateZ用来判断当前物体的旋转角度
    如:transform: rotateX(180deg) rotateY(120deg) rotateZ(90deg) (X轴旋转180度,Y轴旋转120度,Z轴旋转90度)
    然后现在就剩下最后一个关键属性了:translateZ
    如果不设置,那么物体就在舞台中间,也就是一开始我们给舞台设置的perspective值上,如800px
    数值越大,离我们就越近,当translateZ >= 800px的时候,物体就超过我们坐着的距离,就看不见他了.
    数值越小,离我们就越远.
    最终决定一个物体所在位置的4个值就是下面4个:
    transform: rotateX(180deg) rotateY(120deg) rotateZ(90deg) translateZ(100px)

掌握上面这些,再通过css3的animation,transition两个动画神器我们就能做一点基本的小玩意啦^_^
3d是不是没有想象中的那么复杂

简单封装的一个圆形显示进度条的canvas动画

紧张的10月份过去了.虽然11月份仍然很紧张,不过还是想做点自己想做的事情.
时间不多,我的坦克大战小游戏依然没有时间继续开发.今天用canvas封装了一个圆形进度条显示.

先给个demo链接地址:http://demo.fengyitong.name/circle_total/

圆形进度条

代码就不多说了,demo里面可以直接下载了看,代码加上空格数,注释数撑死也才200行....

效果还是不错的.

调用也很简单:

        var cx = new $.CircleAnimate({
            el: doms[i],
            maxValue: 255,    //最大值
            value: 0,        //当前值
            color: "#fff", //外圈底色
            colorAlpha: 0.8, //外圈底色透明度
            outColor: "red", //外圈颜色
            outAlpha: 0.5, //外圈透明度
            outRadius: 0.5, //外圈内半径比
            innerColor: "rgb(255,255,0)", //内圈颜色
            innerAlpha: 0.7, //内圈透明度
            innerScale: 0.5, //内圈半径比例
            speed: 4, //速度.(每次加减值大小.)
            fontColor: '#000' //字体颜色.
        });

接着封装了一个简单的cx.setValue(150); 来实现圆的动画效果.
性能应该还可以,毕竟是canvas原生封装的.
废话不多说了准备睡觉.喜欢的人可以自己下载代码.