html5 canvas实现图片玻璃碎片特效

今天要为大家带来一款html5 canvas实现的图片玻璃碎片特效。图片以玻璃碎片的形式出现到界面中,然后似玻璃被打碎的效果渐消息。效果图如下:

在线预览   源码下载

实现代码:

html代码:

  <img src="city_copy.jpg" id="src_img" class="hidden">
    <div id="container" style="-webkit-perspective: 500px;">
        <div>

            <script src="delaunay.js"></script>
            <script src="TweenMax.min.js"></script>

js代码:

               // canvas settings
                var imageWidth = 768,
    imageHeight = 485;

                var vertices = [],
    indices,
    boxes = [];

                var image,
    fragments = [],
    container = document.getElementById'container');

                window.onload = function ) {
                    image = document.getElementById'src_img');

                    triangulate);
                    makeBoxes);
                    makeFragments);
                };

                function triangulate) {
                    var x,
        y,
        dx = imageWidth / 8,
        dy = imageHeight / 8,
        offset = 0.5;

                    for var i = 0; i <= imageWidth; i += dx) {
                        for var j = 0; j <= imageHeight; j += dy) {
                            if i && i !== imageWidth)) x = i + randomRange-dx * offset, dx * offset);
                            else x = i;

                            if j && j !== imageHeight)) y = j + randomRange-dy * offset, dy * offset);
                            else y = j;

                            vertices.push[x, y]);
                        }
                    }

                    indices = Delaunay.triangulatevertices);
                }

                function makeBoxes) {
                    var p0, p1, p2,
        xMin, xMax,
        yMin, yMax;

                    for var i = 0; i < indices.length; i += 3) {
                        p0 = vertices[indices[i + 0]];
                        p1 = vertices[indices[i + 1]];
                        p2 = vertices[indices[i + 2]];

                        xMin = Math.minp0[0], p1[0], p2[0]);
                        xMax = Math.maxp0[0], p1[0], p2[0]);
                        yMin = Math.minp0[1], p1[1], p2[1]);
                        yMax = Math.maxp0[1], p1[1], p2[1]);

                        boxes.push{
                            x: xMin,
                            y: yMin,
                            w: xMax - xMin,
                            h: yMax - yMin
                        });
                    }
                }

                function makeFragments) {
                    var p0, p1, p2,
        box,
        fragment;

                    TweenMax.setcontainer, { perspective: 500 });

                    var tl0 = new TimelineMax{ repeat: -1 });

                    for var i = 0; i < indices.length; i += 3) {
                        p0 = vertices[indices[i + 0]];
                        p1 = vertices[indices[i + 1]];
                        p2 = vertices[indices[i + 2]];
                        box = boxes[i / 3];

                        fragment = new Fragmentp0, p1, p2, box);

                        var rx = randomRange30, 60) * i % 2) ? 1 : -1);
                        var ry = randomRange30, 60) * i % 2) ? -1 : 1);
                        var tl1 = new TimelineMax);

                        TweenMax.setfragment.canvas, {
                            y: box.y - 1000
                        });

                        tl1.tofragment.canvas, randomRange0.9, 1.1), {
                            y: box.y,
                            ease: Back.easeOut
                        });
                        tl1.tofragment.canvas, 0.5, {
                            z: -100,
                            ease: Cubic.easeIn,
                            delay: 0.4
                        });
                        tl1.tofragment.canvas, randomRange1, 1.2), {
                            rotationX: rx,
                            rotationY: ry,
                            z: 250,
                            alpha: 0,
                            ease: Cubic.easeOut
                        });

                        tl0.inserttl1);

                        fragments.pushfragment);
                        container.appendChildfragment.canvas);
                    }
                }

                function randomRangemin, max) {
                    return min + max - min) * Math.random);
                }

                Fragment = function v0, v1, v2, box) {
                    this.v0 = v0;
                    this.v1 = v1;
                    this.v2 = v2;
                    this.box = box;

                    this.canvas = document.createElement'canvas');
                    this.canvas.width = this.box.w;
                    this.canvas.height = this.box.h;
                    this.canvas.style.width = this.box.w + 'px';
                    this.canvas.style.height = this.box.h + 'px';
                    this.ctx = this.canvas.getContext'2d');

                    TweenMax.setthis.canvas, {
                        x: this.box.x,
                        y: this.box.y
                    });

                    this.ctx.translate-this.box.x, -this.box.y);
                    this.ctx.beginPath);
                    this.ctx.moveTothis.v0[0], this.v0[1]);
                    this.ctx.lineTothis.v1[0], this.v1[1]);
                    this.ctx.lineTothis.v2[0], this.v2[1]);
                    this.ctx.closePath);
                    this.ctx.clip);
                    this.ctx.drawImageimage, 0, 0);
                }; //@ sourceURL=pen.js

View Code

注:本文爱编程原创文章,转载请注明原文地址:http://www.w2bc.com/Article/6399

Published by

风君子

独自遨游何稽首 揭天掀地慰生平

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注