• 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.triangulate(vertices);
                    }
    
                    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.min(p0[0], p1[0], p2[0]);
                            xMax = Math.max(p0[0], p1[0], p2[0]);
                            yMin = Math.min(p0[1], p1[1], p2[1]);
                            yMax = Math.max(p0[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.set(container, { 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 Fragment(p0, p1, p2, box);
    
                            var rx = randomRange(30, 60) * ((i % 2) ? 1 : -1);
                            var ry = randomRange(30, 60) * ((i % 2) ? -1 : 1);
                            var tl1 = new TimelineMax();
    
                            TweenMax.set(fragment.canvas, {
                                y: box.y - 1000
                            });
    
                            tl1.to(fragment.canvas, randomRange(0.9, 1.1), {
                                y: box.y,
                                ease: Back.easeOut
                            });
                            tl1.to(fragment.canvas, 0.5, {
                                z: -100,
                                ease: Cubic.easeIn,
                                delay: 0.4
                            });
                            tl1.to(fragment.canvas, randomRange(1, 1.2), {
                                rotationX: rx,
                                rotationY: ry,
                                z: 250,
                                alpha: 0,
                                ease: Cubic.easeOut
                            });
    
                            tl0.insert(tl1);
    
                            fragments.push(fragment);
                            container.appendChild(fragment.canvas);
                        }
                    }
    
                    function randomRange(min, 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.set(this.canvas, {
                            x: this.box.x,
                            y: this.box.y
                        });
    
                        this.ctx.translate(-this.box.x, -this.box.y);
                        this.ctx.beginPath();
                        this.ctx.moveTo(this.v0[0], this.v0[1]);
                        this.ctx.lineTo(this.v1[0], this.v1[1]);
                        this.ctx.lineTo(this.v2[0], this.v2[1]);
                        this.ctx.closePath();
                        this.ctx.clip();
                        this.ctx.drawImage(image, 0, 0);
                    }; //@ sourceURL=pen.js
    View Code

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

  • 相关阅读:
    Tsinghua 2018 DSA PA3简要题解
    Tsinghua 2018 DSA PA2简要题解
    Python logging系统
    Surface RT2使用情况
    隔壁信概大作业xjb写——同化棋ATAXX
    XJTUOJ #1080 qz的不卡常数
    XJTUOJ #1081 JM的赃物被盗
    XJTUOJ #1078 JM的恶有恶报
    洛谷P5425 [USACO19OPEN]I Would Walk 500 Miles G
    洛谷P2857 [USACO06FEB]Steady Cow Assignment G
  • 原文地址:https://www.cnblogs.com/liaohuolin/p/3965734.html
Copyright © 2020-2023  润新知