zoukankan      html  css  js  c++  java
  • JS3D效果

    <!DOCTYPE html>
    <html>
        <head>
            <title></title>
            <meta charset="utf-8">
            <style type="text/css">
                html {
                    overflow: hidden;
                }
                body {
                    position: absolute;
                    margin: 0px;
                    padding: 0px;
                    background: #fff;
                    width: 100%;
                    height: 100%;
                }
                #screen {
                    position: absolute;
                    left: 10%;
                    top: 10%;
                    width: 80%;
                    height: 80%;
                    background: #fff;
                }
                #screen img {
                    position: absolute;
                    cursor: pointer;
                    width: 0px;
                    height: 0px;
                    -ms-interpolation-mode:nearest-neighbor;
                }
                #bankImages {
                    visibility: hidden;
                }
                #FPS {
                    position: absolute;
                    right: 5px;
                    bottom: 5px;
                    font-size: 10px;
                    color: #666;
                    font-family: verdana;
                }
    
            </style>
        </head>
        <body>
            <div id="screen"></div>
            <div id="bankImages">
                <img alt="" src="http://www.alixixi.com/web/UploadPic/2015-7/20157300254825615.jpg">
            </div>
            <div id="FPS"></div>
        </body>
    </html>
    <script type="text/javascript">
    /* ==== Easing function ==== */
        var Library = {};
        Library.ease = function () {
            this.target = 0;
            this.position = 0;
            this.move = function (target, speed) {
                this.position += (target - this.position) * speed;
            }
        }
    
        var tv = {
    /* ==== variables ==== */
            O : [],
            fps : 0,
            screen : {},
            angle : {
                x : new Library.ease(),
                y : new Library.ease()
            },
            camera : {
                x : new Library.ease(),
                y : new Library.ease()
            },
            create3DHTML : function (i, x, y, z, sw, sh) {
    /* ==== create HTML image element ==== */
                var o = document.createElement('img');
                o.src = i.src;
                tv.screen.obj.appendChild(o);
    /* ==== 3D coordinates ==== */
                o.point3D = {
                    x : x,
                    y : y,
                    z : new Library.ease(),
                    sw : sw,
                    sh : sh,
                    w : i.width,
                    h : i.height
                };
                o.point3D.z.target = z;
    /* ==== push object ==== */
                o.point2D = {};
                tv.O.push(o);
    
    /* ==== on mouse over event ==== */
                o.onmouseover = function () {
                    if (this != tv.o) {
                        this.point3D.z.target = tv.mouseZ;
                        tv.camera.x.target = this.point3D.x;
                        tv.camera.y.target = this.point3D.y;
                        if (tv.o) tv.o.point3D.z.target = 0;
                        tv.o = this;
                    }
                    return false;
                }
    
    /* ==== on mousedown event ==== */
                o.onmousedown = function () {
                    if (this == tv.o) {
                        if (this.point3D.z.target == tv.mouseZ){ 
                            this.point3D.z.target = 0;
                        }
                        else {
                            tv.o = false;
                            this.onmouseover();
                        }
                    }
                }
    
    /* ==== main 3D function ==== */
                o.animate = function () {
    /* ==== 3D coordinates ==== */
                    var x = this.point3D.x - tv.camera.x.position;
                    var y = this.point3D.y - tv.camera.y.position;
                    this.point3D.z.move(this.point3D.z.target,this.point3D.z.target ? .15 : .08);
    /* ==== rotations ==== */
                    var xy = tv.angle.cx * y - tv.angle.sx * this.point3D.z.position;
                    var xz = tv.angle.sx * y + tv.angle.cx * this.point3D.z.position;
                    var yz = tv.angle.cy * xz - tv.angle.sy * x;
                    var yx = tv.angle.sy * xz + tv.angle.cy * x;
    /* ==== 2D transform ==== */
                    var scale = tv.camera.focalLength / (tv.camera.focalLength + yz);
                    x = yx * scale;
                    y = xy * scale;
                    var w = Math.round(Math.max(0, this.point3D.w * scale * this.point3D.sw));
                    var h = Math.round(Math.max(0, this.point3D.h * scale * this.point3D.sh));
    /* ==== HTML rendering ==== */
                    var o = this.style;
                    o.left = Math.round(x + tv.screen.w - w * .5) + 'px';
                    o.top = Math.round(y + tv.screen.h - h * .5) + 'px';
                    o.width = w + 'px';
                    o.height = h + 'px';
                    o.zIndex = 10000 + Math.round(scale * 1000);
                }
            },
    
    /* ==== init script ==== */
            init : function (structure, FL, mouseZ, rx, ry) {
                this.screen.obj = document.getElementById('screen');
                this.screen.obj.onselectstart = function () { 
                    return false; 
                }
                this.screen.obj.ondrag = function () { 
                    return false; 
                }
                this.mouseZ = mouseZ;
                this.camera.focalLength = FL;
                this.angle.rx = rx;
                this.angle.ry = ry;
    /* ==== create objects ==== */
                var i = 0, o;
                while( o = structure[i++] )
                this.create3DHTML(o.img, o.x, o.y, o.z, o.sw, o.sh);
    /* ==== start script ==== */
                this.resize();
                mouse.y = this.screen.y + this.screen.h;
                mouse.x = this.screen.x + this.screen.w;
    /* ==== loop ==== */
                setInterval(tv.run, 16);
                setInterval(tv.dFPS, 1000);
            },
    
    /* ==== resize window ==== */
            resize : function () {
                var o = tv.screen.obj;
                if (o) {
                    tv.screen.w = o.offsetWidth / 2;
                    tv.screen.h = o.offsetHeight / 2;
                    for (tv.screen.x = 0, tv.screen.y = 0; o != null; o = o.offsetParent) {
                        tv.screen.x += o.offsetLeft;
                        tv.screen.y += o.offsetTop;
                    }
                }
            },
    
    /* ==== main loop ==== */
            run : function () {
                tv.fps++;
    /* ==== motion ease ==== */
                tv.angle.x.move(-(mouse.y - tv.screen.h - tv.screen.y) * tv.angle.rx, .1);
                tv.angle.y.move( (mouse.x - tv.screen.w - tv.screen.x) * tv.angle.ry, .1);
                tv.camera.x.move(tv.camera.x.target, .025);
                tv.camera.y.move(tv.camera.y.target, .025);
    /* ==== angles sin and cos ==== */
                tv.angle.cx = Math.cos(tv.angle.x.position);
                tv.angle.sx = Math.sin(tv.angle.x.position);
                tv.angle.cy = Math.cos(tv.angle.y.position);
                tv.angle.sy = Math.sin(tv.angle.y.position);
    /* ==== loop through images ==== */
                var i = 0, o;
                while( o = tv.O[i++] ) o.animate();
            },
    
    /* ==== trace frames per seconds ==== */
            dFPS : function () {
                document.getElementById('FPS').innerHTML = tv.fps + ' FPS';
                tv.fps = 0;
            }
        }
    
    /* ==== global mouse position ==== */
        var mouse = {
            x : 0,
            y : 0
        }
        document.onmousemove = function(e) {
            if (window.event) e = window.event;
            mouse.x = e.clientX;
            mouse.y = e.clientY;
            return false;
        }
    
    /* ==== starting script ==== */
        onload = function() {
        onresize = tv.resize;
    /* ==== build grid ==== */
        var img = document.getElementById('bankImages').getElementsByTagName('img');
        var structure = [];
        for (var i = -300; i <= 300; i += 120)
        for (var j = -300; j <= 300; j += 120)
        structure.push({ img:img[0], x:i, y:j, z:0, sw:.5, sh:.5 });
    /* ==== let's go ==== */
        tv.init(structure, 350, -200, .005, .0025);
        }
    </script>
  • 相关阅读:
    招聘面试—关于Mysql的一点儿总结
    情景linux—不曾了解的cat用法
    情景linux--shell如何实现多线程?
    情景linux--如何解决read命令产生的硬编码问题
    情景linux--如何优雅地退出telnet
    性能测试-概念篇-性能测试分类
    情景linux--如何摆脱深路径的频繁切换烦恼?
    TCP--telnet为何在127s后返回?
    你为什么必须(从现在开始就)掌握linux
    Cookie/Session机制详解
  • 原文地址:https://www.cnblogs.com/Leslie-Cheung1584304774/p/10528015.html
Copyright © 2011-2022 走看看