一款基于javascript的3D玻璃破碎特效
之前为大家介绍了一款 html5 canvas实现图片玻璃碎片特效。今天要给大家带来一款基于javascript的3D玻璃破碎特效。效果图如下:

html代码:
<div id="container">
<div id="fragment">
</div>
</div>
css代码:
body
{
background-color: #f1f1f1;
margin:;
overflow: hidden;
} #container
{
position: absolute;
width: 384px;
height: 384px;
margin: auto;
left:;
top:;
bottom:;
right:;
} .fragment
{
position: absolute;
width: 48px;
height: 48px;
}
javascript代码:
    function init() {
    const FRAG_SIZE = 48;
    var defaultEase = Sine.easeOut;
    var container = document.getElementById('container'),
        containerRect = container.getBoundingClientRect(),
        fragments = [],
        centerX = 192,
        centerY = 192;
    TweenMax.set(container, {
       perspective:600
    });
    createFragments();
    createTweens();
    startUpdateLoop();
    function createFragments() {
        var fragment;
        for (var i = 0; i < 8; i++) {
            for (var j = 0; j < 8; j++) {
                fragment = document.createElement('div');
                fragment.className = 'fragment';
                TweenMax.set(fragment, {
                    x:j * FRAG_SIZE,
                    y:i * FRAG_SIZE
                });
                container.appendChild(fragment);
                fragments.push(fragment);
            }
        }
    }
    function createTweens() {
        var tl = new TimelineMax({repeat:-1}),
            fragment,
            delay;
        for (var i = 0; i < fragments.length; i++) {
            fragment = fragments[i];
            delay = 1 - (i % 8) * randomRange(0.04, 0.06);
            if (i < 32) {
                if (i === 0) {
                    tl.insert(createSpecialTween(fragment), delay);
                }
                else {
                    tl.insert(createArcTween(fragment), delay);
                }
                console.log('d1', delay);
            }
            else {
                tl.insert(createStraightTween(fragment), delay);
                console.log('d2', delay);
            }
        }
    }
    function createSpecialTween(fragment) {
        var bezierPoints = [
                {x:centerX - 24, y:-256},
                {x:centerX - 24, y:centerY - 24}
            ];
        var tl = new TimelineMax(),
            tween1 = TweenMax.to(fragment, 1.2, {
                bezier:{type:'soft', values:bezierPoints},
                ease:defaultEase
            }),
            tween2 = TweenMax.to(fragment, 1.2, {
                z:525,
                rotationX:360,
                rotationY:360,
                ease:defaultEase
            });
        tl.insert(tween1);
        tl.insert(tween2);
        return tl;
    }
    function createArcTween(fragment) {
        var dx = (centerX - fragment._gsTransform.x - 24),
            dy = (centerY - fragment._gsTransform.y - 24);
        var bezierPoints = [
            {x:fragment._gsTransform.x, y:fragment._gsTransform.y - dy},
            {x:fragment._gsTransform.x, y:containerRect.bottom}
        ];
        var tl = new TimelineMax(),
            tween1 = TweenMax.to(fragment, randomRange(3.2, 3.1), {
                bezier:{values:bezierPoints},
                ease:defaultEase
            }),
            tween2 = TweenMax.to(fragment, randomRange(3.2, 3.1), {
                z:randomRange(800, 1000),
                rotationX:randomRange(360, 1080),
                rotationY:randomRange(360, 1080),
                ease:defaultEase
            });
        tl.insert(tween1);
        tl.insert(tween2);
        return tl;
    }
    function createStraightTween(fragment) {
        var dx = (centerX - fragment._gsTransform.x - 24) * 4;
        return TweenMax.to(fragment, randomRange(3, 3.1), {
            x:-dx,
            y:window.innerHeight + containerRect.bottom + randomRange(0, 124),
            z:randomRange(300, 500) * (Math.random() > 0.5 ? 1 : -1),
            rotationX:randomRange(360, 1080),
            rotationY:randomRange(360, 1080),
            ease:defaultEase
        })
    }
    function startUpdateLoop() {
        requestAnimationFrame(tick);
        function tick() {
            var fragment,
                angleX,
                angleY;
            for (var i = 0; i < fragments.length; i++) {
                fragment = fragments[i];
                angleX = Math.abs(fragment._gsTransform.rotationX % 180 - 90) / 180;
                angleY = Math.abs(fragment._gsTransform.rotationY % 180 - 90) / 180;
                var l = Math.round((angleX + angleY) / 2 * 100);
                fragment.style.backgroundColor = 'hsl(30,100%,' + l + '%)';
                fragment.style.zIndex = Math.round(fragment._gsTransform.z);
            }
            requestAnimationFrame(tick);
        }
    }
    function randomRange(min, max) {
        return min + Math.random() * (max - min);
    }
}
window.onload = init;//@ sourceURL=pen.js
注:本文爱编程原创文章,转载请注明原文地址:http://www.w2bc.com/Article/7707
一款基于javascript的3D玻璃破碎特效的更多相关文章
- 基于css3的3D立方体旋转特效
		
今天给大家分享一款基于css3的3D立方体旋转特效.这款特效适用浏览器:360.FireFox.Chrome.Safari.Opera.傲游.搜狗.世界之窗. 不支持IE8及以下浏览器.效果图如下 : ...
 - 一款基于css3的3D图片翻页切换特效
		
今天给大家分享一款基于css3的3D图片翻页切换特效.单击图片下方的滑块会切换上方的图片.动起你的鼠标试试吧,效果图如下: 在线预览 源码下载 实现的代码. html代码: <div id= ...
 - 7 款基于 JavaScript/AJAX 的文件上传插件
		
本文整理了7款基于JavaScript和AJAX的文件上传插件,这些插件基本上都能实现以下功能: 多文件上传 拖拽操作 实时上传进度 自定义上传限制 希望能为你的开发工作带来帮助. 1. jQuer ...
 - 8款基于Jquery的WEB前端动画特效
		
1.超炫酷的30个jQuery按钮悬停动画 按钮插件是最常见的jQuery插件之一,因为它用途广泛,而且配置起来最为方便.今天我们要分享的是30个超炫酷的jQuery悬停按钮动画,当我们将鼠标滑过按钮 ...
 - 10款基于jquery的web前端动画特效
		
1.jQuery横向手风琴图片切换动画 之前我们为大家分享过很多款基于jQuery和CSS3的手风琴菜单和手风琴焦点图插件,比如CSS3响应式垂直手风琴菜单和jQuery横向手风琴图片展示插件.今天要 ...
 - 一款基于css3鼠标经过圆形旋转特效
		
今天给大家分享一款基于css3鼠标经过圆形旋转特效.当鼠标经过的时候图片边框颜色旋转,图片显示详情.该实例适用浏览器:IE8.360.FireFox.Chrome.Safari.Opera.傲游.搜狗 ...
 - smoke.js是一款基于HTML5 Canvas的逼真烟雾特效js插件。通过该js插件,可以非常轻松的在页面中制作出各种烟雾效果。
		
Smoke.js 是一个浏览器默认警告系统的JavaScript替代品,如果你想要跨浏览器与平台的标准化JavaScript警告窗口,Smoke.js就是你想要的. Smoke.js是一个轻量级且灵活 ...
 - 15款效果很酷的最新jQuery/CSS3特效
		
很久没来博客园发表文章了,今天就分享15款效果很酷的最新jQuery/CSS3特效,废话不说,一起来看看吧. 1.3D图片上下翻牌切换 一款基于jQuery+CSS3实现的3D图片上下翻牌切换效果,支 ...
 - 基于animation.css实现动画旋转特效
		
分享一款基于animation.css实现动画旋转特效.这是一款基于CSS3实现的酷炫的动画旋转特效代码.效果图如下: 在线预览 源码下载 实现的代码. html代码: <div class ...
 
随机推荐
- Xshell和Xftp5配置连接阿里云服务器
			
配置Xftp5 配置成功后 配置Xshell 记住用户名和密码 连接成功
 - [转载]ubuntu发热问题解决
			
原文地址:ubuntu发热问题解决作者:raosea 没事装了个ubuntu12.04玩玩. 用wubi安装,很省事的 .完了以后启动了系统,界面蛮好看.可是不久令人费心的事情出来了. 我发现本本的右 ...
 - mysql中字符集和排序规则说明
			
数据库需要适应各种语言和字符就需要支持不同的字符集(Character Set),每种字符集也有各自的排序规则(Collation). 一.字符集 字符集,即用于定义字符在数据库中的编码的集合. 常见 ...
 - imageNamed 、imageWithContentsOfFile、 initWithContentsFile区别
			
[UIImage imageNamed:]只适合与UI界面中的贴图的读取,较大的资源文件应该尽量避免使用 用UIImage加载本地图像最常用的是下面三种: 1.用imageNamed方法 [UIIma ...
 - 为同一部电脑设置2个IP地址
			
为同一部电脑设置2个IP地址 在HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Class\NetTrans下 点击0000.0001,000 ...
 - 介绍一款chrom浏览器插件 DHC是一款使用chrome模拟REST客户端向服务器发送测试数据的谷歌浏览器插件
			
先打个小广告哈 公司招java架构师,月薪25K以上,负责电商平台架构工作,工作地点在北京 1号线永安里站 附近,如有意向 请把简历发我邮箱jia6235@163.com 可以内部推荐. DHC是一款 ...
 - 【php】基础学习5
			
主要包括PHP的错误.异常处理和调试.具体如下: <html xmlns=http://www.w3.org/1999/xhtml> <head> <meta http- ...
 - URL 长度有限制吗?
			
众所周知,传递小量参数(在没有其他原因,例如隐藏参数值的情况下)推荐使用GET方法,传递大量参数推荐使用POST方法.原因是什么呢? 原因是传说GET方法是通过URL来传递,而URL的长度是受限的,而 ...
 - Linux内存初始化(一)
			
一.前言 一直以来,我都非常着迷于两种电影拍摄手法:一种是慢镜头,将每一个细节全方位的展现给观众.另外一种就是快镜头,多半是反应一个时代的变迁,从非常长的时间段中,截取几个典型的snapshot,合成 ...
 - Mac中提升权限修改系统目录
			
原来OSX EI Capitan中增加了一个SIP功能,不管你是不是su,都会阻止你在系统目录下进行操作.如果,想要修改系统目录的文件,如升级bash,需要修改/bin/bash,那么就要先关闭SIP ...