首页前端开发HTMLHTML+CSS+JavaScript实现图片3D展览的示例代码

HTML+CSS+JavaScript实现图片3D展览的示例代码

时间2024-01-25 07:15:53发布访客分类HTML浏览451
导读:收集整理的这篇文章主要介绍了HTML+CSS+JavaScript实现图片3D展览的示例代码,觉得挺不错的,现在分享给大家,也给大家做个参考。 一、图片3D展览效果上传图片的大小有限制,录制的GIF图展示效果不是很好录屏的效果见链...
收集整理的这篇文章主要介绍了HTML+CSS+JavaScript实现图片3D展览的示例代码,觉得挺不错的,现在分享给大家,也给大家做个参考。

一、图片3D展览效果

上传图片的大小有限制,录制的GIF图展示效果不是很好

录屏的效果见链接:https://www.bilibili.com/video/BV1Bi4y1E7wk/

二、代码实现

1. HTML代码

!DOCTYPE HTML>
    html>
    head>
        meta charset="utf-8">
        meta name="viewport" content="width=device-width, inITial-scale=1.0, maximum-scale=1.0, user-scalable=no">
        meta name="HandhelDFriendly" content="true">
        meta name="description" content="图片3D展览屋">
        meta name="keywords" content="canvas,3D_picture,perspective,texturing,gallery">
        link href="res/slider-wb.css" rel="stylesheet">
        title>
    图片3D展览屋/title>
        style>
        html        {
                overflow:visible;
                -ms-touch-action: none;
                -ms-content-zooming: none;
        }
        body        {
                position: absolute;
                margin: 0px;
                padding: 0px;
                background: #fff;
                width: 100%;
                height: 100%;
        }
        #canvas        {
                position: absolute;
                width: 100%;
                height: 100%;
                background: #fff;
        }
        /style>
        script type="text/javascript" src="res/ge1doot.js">
    /script>
        script type="text/javascript">
            "use strict";
        (function () {
            /* ==== definitions ==== */            VAR diapo = [], layers = [], ctx, pointer, scr, camera, light, fps = 0, quality = [1, 2],            // ---- poly constructor ----	Poly = function (parent, face) {
    	    this.parent = parent;
    	    this.ctx = ctx;
    	    this.color = face.fill || false;
    	    this.points = [];
	    if (!face.img) {
    	        // ---- create points ----	        for (var i = 0;
     i  4;
 i++) {
    	            this.points[i] = new ge1doot.transform3D.Point(					parent.pc.x + (face.x[i] * parent.normalZ) + (face.z[i] * parent.normalX),					parent.pc.y + face.y[i],					parent.pc.z + (face.x[i] * parent.normalX) + (-face.z[i] * parent.normalZ)				);
	        }
    	        this.points[3].next = false;
	    }
	}
,            // ---- diapo constructor ----	Diapo = function (path, img, structure) {
	    // ---- create image ----	    this.img = new ge1doot.transform3D.Image(			this, path + img.img, 1, {
			    isLoaded: function (img) {
    			        img.parent.isLoaded = true;
    			        img.parent.loaded(img);
			    }
			}
    		);
    	    this.visible = false;
    	    this.normalX = img.nx;
    	    this.normalZ = img.nz;
    	    // ---- point center ----	    this.pc = new ge1doot.transform3D.Point(img.x, img.y, img.z);
    	    // ---- target positions ----	    this.tx = img.x + (img.nx * Math.sqrt(camera.focalLength) * 20);
    	    this.tz = img.z - (img.nz * Math.sqrt(camera.focalLength) * 20);
    	    // ---- create polygons ----	    this.poly = [];
    	    for (var i = -1, p;
     p = structure[++i];
 ) {
    	        layers[i] = (p.img === true ? 1 : 2);
    	        this.poly.push(				new Poly(this, p)			);
	    }
	}
,            // ---- init section ----	init = function (json) {
    	    // draw poly PRimitive	    Poly.prototype.drawPoly = ge1doot.transform3D.drawPoly;
	    // ---- init screen ----	    scr = new ge1doot.Screen({
	        container: "canvas"	    }
    );
    	    ctx = scr.ctx;
    	    scr.resize();
	    // ---- init pointer ----	    pointer = new ge1doot.Pointer({
	        tap: function () {
	            if (camera.over) {
	                if (camera.over === camera.target.elem) {
    	                    // ---- return to the center ----	                    camera.target.x = 0;
    	                    camera.target.z = 0;
    	                    camera.target.elem = false;
	                }
 else {
    	                    // ---- goto diapo ----	                    camera.target.elem = camera.over;
    	                    camera.target.x = camera.over.tx;
    	                    camera.target.z = camera.over.tz;
    	                    // ---- adapt tesselation level to distance ----	                    for (var i = 0, d;
     d = diapo[i++];
 ) {
    	                        var dx = camera.target.x - d.pc.x;
    	                        var dz = camera.target.z - d.pc.z;
    	                        var dist = Math.sqrt(dx * dx + dz * dz);
    	                        var lev = (dist >
     1500) ? quality[0] : quality[1];
    	                        d.img.setLevel(lev);
	                    }
	                }
	            }
	        }
	    }
    );
	    // ---- init camera ----	    camera = new ge1doot.transform3D.Camera({
	        focalLength: Math.sqrt(scr.width) * 10,	        easeTranslation: 0.025,	        easeRotation: 0.06,	        disableRz: true	    }
, {
	        move: function () {
    	            this.over = false;
	            // ---- rotation ----	            if (pointer.isDraging) {
    	                this.target.elem = false;
    	                this.target.ry = -pointer.Xi * 0.01;
    	                this.target.rx = (pointer.Y - scr.height * 0.5) / (scr.height * 0.5);
	            }
 else {
	                if (this.target.elem) {
    	                    this.target.ry = Math.atan2(							this.target.elem.pc.x - this.x,							this.target.elem.pc.z - this.z						);
	                }
	            }
    	            this.target.rx *= 0.9;
	        }
	    }
    );
    	    camera.z = -10000;
    	    camera.py = 0;
    	    // ---- create images ----	    for (var i = 0, img;
     img = json.imgdata[i++];
 ) {
    	        diapo.push(				new Diapo(					json.options.imagesPath,					img,					json.structure				)			);
	    }
    	    // ---- start engine ---- >
    >
    >
	    setInterval(function () {
    	        quality = (fps >
     50) ? [2, 3] : [1, 2];
    	        fps = 0;
	    }
    , 1000);
    	    run();
	}
,            // ---- main loop ----	run = function () {
    	    // ---- clear screen ----	    ctx.clearRect(0, 0, scr.width, scr.height);
    	    // ---- camera ----	    camera.move();
    	    // ---- draw layers ----	    for (var k = -1, l;
     l = layers[++k];
 ) {
    	        light = false;
    	        for (var i = 0, d;
     d = diapo[i++];
 ) {
    	            (l === 1 &
    &
     d.draw()) ||				(d.visible &
    &
     d.poly[k].draw());
	        }
	    }
    	    // ---- cursor ----	    if (camera.over &
    &
 !pointer.isDraging) {
    	        scr.setCursor("pointer");
	    }
 else {
    	        scr.setCursor("move");
	    }
    	    // ---- loop ----	    fps++;
    	    requestAnimFrame(run);
	}
    ;
            /* ==== prototypes ==== */            Poly.prototype.draw = function () {
                    // ---- color light ----                var c = this.color;
                if (c.light || !light) {
                        var s = c.light ? this.parent.light : 1;
                        // ---- rgba color ----                    light = "rgba(" +				Math.round(c.r * s) + "," +				Math.round(c.g * s) + "," +				Math.round(c.b * s) + "," + (c.a || 1) + ")";
                        ctx.fillStyle = light;
                }
                // ---- paint poly ----                if (!c.light || this.parent.light  1) {
                        // ---- projection ----                    for (				var i = 0;
    				this.points[i++].projection();
    			);
                        this.drawPoly();
                        ctx.fill();
                }
            }
            /* ==== image onload ==== */            Diapo.prototype.loaded = function (img) {
                    // ---- create points ----                var d = [-1, 1, 1, -1, 1, 1, -1, -1];
                    var w = img.texture.width * 0.5;
                    var h = img.texture.height * 0.5;
                    for (var i = 0;
     i  4;
 i++) {
                        img.points[i] = new ge1doot.transform3D.Point(				this.pc.x + (w * this.normalZ * d[i]),				this.pc.y + (h * d[i + 4]),				this.pc.z + (w * this.normalX * d[i])			);
                }
            }
            /* ==== images draw ==== */            Diapo.prototype.draw = function () {
                    // ---- visibility ----                this.pc.projection();
                    if (this.pc.Z >
     -(camera.focalLength >
    >
     1) &
    &
 this.img.transform3D(true)) {
                        // ---- light ----                    this.light = 0.5 + Math.abs(this.normalZ * camera.cosY - this.normalX * camera.sinY) * 0.6;
                        // ---- draw image ----                    this.visible = true;
                        this.img.draw();
                    // ---- test pointer inside ----                    if (pointer.hasMoved || pointer.isDown) {
                            if (					this.img.isPointerInside(						pointer.X,						pointer.Y					)				) camera.over = this;
                    }
                }
     else this.visible = false;
                    return true;
            }
            return {
                // --- load data ----                load: function (data) {
                    window.addEventListener('load', function () {
                            ge1doot.loadJS(					"res/imageTransform3D.js",					init, data				);
                    }
    , false);
                }
            }
        }
)().load({
            imgdata: [            // north		{
img: 'imgs/001.jpg', x: -1000, y: 0, z: 1500, nx: 0, nz: 1 }
,		{
 img: 'imgs/002.jpg', x: 0, y: 0, z: 1500, nx: 0, nz: 1 }
,		{
 img: 'imgs/003.jpg', x: 1000, y: 0, z: 1500, nx: 0, nz: 1 }
,            // east		{
img: 'imgs/004.jpg', x: 1500, y: 0, z: 1000, nx: -1, nz: 0 }
,		{
 img: 'imgs/005.jpg', x: 1500, y: 0, z: 0, nx: -1, nz: 0 }
,		{
 img: 'imgs/006.jpg', x: 1500, y: 0, z: -1000, nx: -1, nz: 0 }
,            // south		{
img: 'imgs/007.jpg', x: 1000, y: 0, z: -1500, nx: 0, nz: -1 }
,		{
 img: 'imgs/008.jpg', x: 0, y: 0, z: -1500, nx: 0, nz: -1 }
,		{
 img: 'imgs/009.jpg', x: -1000, y: 0, z: -1500, nx: 0, nz: -1 }
,            // west		{
img: 'imgs/010.jpg', x: -1500, y: 0, z: -1000, nx: 1, nz: 0 }
,		{
 img: 'imgs/011.jpg', x: -1500, y: 0, z: 0, nx: 1, nz: 0 }
,		{
 img: 'imgs/012.jpg', x: -1500, y: 0, z: 1000, nx: 1, nz: 0 }
	],            structure: [		{
		    // wall		    fill: {
 r: 255, g: 255, b: 255, light: 1 }
,		    x: [-1001, -490, -490, -1001],		    z: [-500, -500, -500, -500],		    y: [500, 500, -500, -500]		}
, {
		    // wall		    fill: {
 r: 255, g: 255, b: 255, light: 1 }
,		    x: [-501, 2, 2, -500],		    z: [-500, -500, -500, -500],		    y: [500, 500, -500, -500]		}
, {
		    // wall		    fill: {
 r: 255, g: 255, b: 255, light: 1 }
,		    x: [0, 502, 502, 0],		    z: [-500, -500, -500, -500],		    y: [500, 500, -500, -500]		}
, {
		    // wall		    fill: {
 r: 255, g: 255, b: 255, light: 1 }
,		    x: [490, 1002, 1002, 490],		    z: [-500, -500, -500, -500],		    y: [500, 500, -500, -500]		}
, {
		    // shadow		    fill: {
 r: 0, g: 0, b: 0, a: 0.2 }
,		    x: [-420, 420, 420, -420],		    z: [-500, -500, -500, -500],		    y: [150, 150, -320, -320]		}
, {
		    // shadow		    fill: {
 r: 0, g: 0, b: 0, a: 0.2 }
,		    x: [-20, 20, 20, -20],		    z: [-500, -500, -500, -500],		    y: [250, 250, 150, 150]		}
, {
		    // shadow		    fill: {
 r: 0, g: 0, b: 0, a: 0.2 }
,		    x: [-20, 20, 20, -20],		    z: [-500, -500, -500, -500],		    y: [-320, -320, -500, -500]		}
, {
		    // shadow		    fill: {
 r: 0, g: 0, b: 0, a: 0.2 }
,		    x: [-20, 20, 10, -10],		    z: [-500, -500, -100, -100],		    y: [-500, -500, -500, -500]		}
, {
		    // base		    fill: {
 r: 32, g: 32, b: 32 }
,		    x: [-50, 50, 50, -50],		    z: [-150, -150, -50, -50],		    y: [-500, -500, -500, -500]		}
, {
		    // support		    fill: {
 r: 16, g: 16, b: 16 }
,		    x: [-10, 10, 10, -10],		    z: [-100, -100, -100, -100],		    y: [300, 300, -500, -500]		}
, {
		    // frame		    fill: {
 r: 255, g: 255, b: 255 }
,		    x: [-320, -320, -320, -320],		    z: [0, -20, -20, 0],		    y: [-190, -190, 190, 190]		}
, {
		    // frame		    fill: {
 r: 255, g: 255, b: 255 }
,		    x: [320, 320, 320, 320],		    z: [0, -20, -20, 0],		    y: [-190, -190, 190, 190]		}
,		{
 img: true }
,		{
		    // ceilingLight		    fill: {
 r: 255, g: 128, b: 0 }
,		    x: [-50, 50, 50, -50],		    z: [450, 450, 550, 550],		    y: [500, 500, 500, 500]		}
, {
		    // groundLight		    fill: {
 r: 255, g: 128, b: 0 }
,		    x: [-50, 50, 50, -50],		    z: [450, 450, 550, 550],		    y: [-500, -500, -500, -500]		}
	],            options: {
                imagesPath: ""            }
        }
    );
    /script>
    /head>
    body>
    a href="https://blog.csdn.net/fyfugoyfa/article/details/108845194" target="_blank">
    CSDN文章/a>
    br />
        canvas id="canvas">
    建议用谷歌浏览器打开/canvas>
    /body>
    /html>
    

2. CSS代码

#icon {
    	background: rgb(255, 144, 0);
     border-radius: 6px 0px 0px;
     transition:0.6s ease-in-out;
     left: 65px;
     top: 6px;
     width: 40px;
     height: 40px;
     overflow: hidden;
     position: relative;
     cursor: pointer;
     -moz-transition: all 0.6s ease-in-out 0s;
     -webkit-transition: all 0.6s ease-in-out 0s;
     -o-transition: all 0.6s ease-in-out 0s;
}
#icon div {
    	background: none;
     position: absolute;
}
#icon div:nth-child(1) {
    	border-width: 7px 0px 7px 8px;
     border-style: solid;
     border-color: transparent rgb(255, 255, 255);
     left: 20px;
     top: 50%;
     width: 0px;
     height: 0px;
     margin-top: -7px;
     position: absolute;
}
#icon div:nth-child(2) {
    	background: rgb(255, 255, 255);
     left: 12px;
     top: 50%;
     width: 8px;
     height: 6px;
     margin-top: -3px;
     position: absolute;
}
#nav {
    	top: 10px;
     width: 100px;
     height: 0px;
     position: absolute;
     -ms-user-select: none;
     -webkit-user-select: none;
     -moz-user-select: none;
}
#nav-switch {
    	display: none;
}
#nav .label {
    	display: block;
     cursor: pointer;
}
#nav .container {
    	transition:left 0.3s ease-in-out;
     left: -100px;
     width: 100%;
     position: absolute;
     -moz-transition: left 0.3s ease-in-out 0s;
     -webkit-transition: left 0.3s ease-in-out 0s;
     -o-transition: left 0.3s ease-in-out 0s;
}
    #nav .container >
 div {
    	padding: 0px;
     width: 50%;
     float: left;
}
#nav .container .nav-on {
    	color: rgb(51, 51, 51);
     padding-left: 0px;
}
#nav .container .nav-off {
    	width: 40px;
     height: 40px;
     padding-right: 10px;
}
:checked#nav-switch + .label .container {
    	left: 10px;
}
:checked#nav-switch + .label #icon {
    	background: rgb(0, 101, 203);
     border-radius: 0px 0px 6px;
     transform: rotate(-180deg);
     -webkit-transform: rotate(-180deg);
     -moz-transform: rotate(-180deg);
     -o-transform: rotate(-180deg);
}
.title {
    	margin: 0px;
     padding: 0px;
     left: 170px;
     top: 2px;
     height: 40px;
     color: rgb(51, 51, 51);
     line-height: 40px;
     font-family: "Segoe UI Light", "Segoe UI", Frutiger, "Frutiger Linotype", "Dejavu Sans", "Helvetica Neue", Arial, sans-serif;
     font-Size: 24px;
     font-weight: bold;
     white-space: nowrap;
     position: absolute;
     -ms-user-select: none;
     -webkit-user-select: none;
     -moz-user-select: none;
     -o-user-select: none;
     user-select: none;
}
.menu {
    	margin: 0px;
     padding: 0px;
     left: 0px;
     top: 6px;
     color: rgb(51, 51, 51);
     font-family: "Segoe UI Light", "Segoe UI", Frutiger, "Frutiger Linotype", "Dejavu Sans", "Helvetica Neue", Arial, sans-serif;
     font-size: 1em;
     font-weight: lighter;
     list-style-type: none;
     position: relative;
     cursor: pointer;
}
.menu li {
    	list-style: none;
     width: 100px;
     height: 40px;
     border-right-color: rgb(221, 221, 221);
     border-right-width: 1px;
     border-right-style: solid;
     position: relative;
     cursor: pointer;
}
.menu a {
    	color: rgb(51, 51, 51);
     line-height: 40px;
     padding-left: 40px;
     text-decoration: none;
     display: block;
     position: relative;
}
.menu li a:hover {
    	background: rgb(255, 144, 0);
}
.menu li a:focus {
    	background: rgb(255, 144, 0);
}
.menu li a:active {
    	background: rgb(255, 144, 0);
}
#nav li::before {
    	top: 50%;
     margin-left: 10px;
     position: absolute;
     content: "";
}
#nav li::after {
    	top: 50%;
     margin-left: 10px;
     position: absolute;
     content: "";
}
#nav li a::before {
    	top: 50%;
     margin-left: 10px;
     position: absolute;
     content: "";
}
#nav li a::after {
    	top: 50%;
     margin-left: 10px;
     position: absolute;
     content: "";
}
#nav .home a::before {
    	border-width: 8px 7px;
     border-style: solid;
     border-color: transparent transparent rgb(51, 51, 51);
     left: 2px;
     margin-top: -16px;
}
#nav .home a::after {
    	border-width: 3px 4px 0px;
     border-style: solid;
     border-color: rgb(51, 51, 51) rgb(51, 51, 51) transparent;
     left: 4px;
     width: 2px;
     height: 4px;
     margin-top: 0px;
}
#nav .arrow a::before {
    	border-width: 7px 0px 7px 8px;
     border-style: solid;
     border-color: transparent rgb(51, 51, 51);
     left: 8px;
     margin-top: -7px;
}
#nav .arrow a::after {
    	background: rgb(51, 51, 51);
     left: 0px;
     width: 8px;
     height: 6px;
     margin-top: -3px;
}
#nav .back.arrow a::before {
    	border-width: 7px 8px 7px 0px;
     left: 0px;
}
#nav .back.arrow a::after {
    	left: 8px;
}
#nav .list a::before {
    	background: none;
     border-width: 6px 0px;
     border-style: double;
     border-color: rgb(51, 51, 51);
     left: 5px;
     top: 14px;
     width: 12px;
     height: 2px;
}
#nav .list a::after {
    	background: none;
     border-width: 6px 0px;
     border-style: double;
     border-color: rgb(51, 51, 51);
     left: 1px;
     top: 14px;
     width: 2px;
     height: 2px;
}
    

3. JavaScript代码

// ===== ge1doot global =====    js文件1var ge1doot = ge1doot || {
	json: null,	screen: null,	pointer: null,	camera: null,	loadJS: function (url, callback, data) {
    		if (typeof url == "string") url = [url];
		var load = function (src) {
    			var script = document.createElement("script");
				if (callback) {
					if (script.readystate){
						script.onreadystatechange = function () {
							if (script.readyState == "loaded" || script.readyState == "complete"){
    								script.onreadystatechange = null;
    								if (--n === 0) callback(data || false);
							}
						}
					}
 else {
						script.onload = function() {
    							if (--n === 0) callback(data || false);
						}
					}
				}
    				script.src = src;
    				document.getelementsbytagname("head")[0].appendChild(script);
		}
    		for (var i = 0, n = url.length;
     i  n;
     i++) load(url[i]);
	}
}
// ===== html/canvas container =====ge1doot.Screen = function (SETUP) {
    	ge1doot.screen = this;
    	this.elem = document.getElementById(setup.container) || setup.container;
    	this.ctx = this.elem.tagName == "CANVAS" ? this.elem.getContext("2d") : false;
    	this.style = this.elem.style;
    	this.left = 0;
    	this.top = 0;
    	this.width = 0;
    	this.height = 0;
    	this.cursor = "default";
    	this.setup = setup;
	this.resize = function () {
    		var o = this.elem;
    		this.width  = o.offsetWidth;
    		this.height = o.offsetHeight;
    		for (this.left = 0, this.top = 0;
     o != null;
 o = o.offsetParent) {
    			this.left += o.offsetLeft;
    			this.top  += o.offsetTop;
		}
		if (this.ctx) {
    			this.elem.width  = this.width;
    			this.elem.height = this.height;
		}
    		this.setup.resize &
    &
     this.setup.resize();
	}
	this.setCursor = function (type) {
    		if (type !== this.cursor &
    &
 'ontouchstart' in window === false) {
    			this.cursor = type;
    			this.style.cursor = type;
		}
	}
	window.addEventListener('resize', function () {
    		ge1doot.screen.resize();
	}
    , false);
    	!this.setup.resize &
    &
     this.resize();
}
// ==== unified touch events handler ====ge1doot.Pointer = function (setup) {
    	ge1doot.pointer = this;
    	var self        = this;
    	var body        = document.body;
    	var html        = document.documentElement;
    	this.setup      = setup;
    	this.screen     = ge1doot.screen;
    	this.elem       = this.screen.elem;
    	this.X          = 0;
    	this.Y          = 0;
    	this.Xi         = 0;
    	this.Yi         = 0;
    	this.bXi        = 0;
    	this.bYi        = 0;
    	this.Xr         = 0;
    	this.Yr         = 0;
    	this.startX     = 0;
    	this.startY     = 0;
    	this.scale      = 0;
    	this.wheelDelta = 0;
    	this.isDraging  = false;
    	this.hasMoved   = false;
    	this.isDown     = false;
    	this.evt        = false;
    	var sX          = 0;
    	var sY          = 0;
	// prevent default behavior	if (setup.tap) this.elem.onclick = function () {
     return false;
 }
	if (!setup.documentMove) {
		document.ontouchmove = function(e) {
     e.preventDefault();
 }
	}
	document.addEventListener("MSHoldVisual", function(e) {
     e.preventDefault();
 }
    , false);
    	if (typeof this.elem.style.msTouchAction != 'undefined') this.elem.style.msTouchAction = "none";
	this.pointerDown = function (e) {
		if (!this.isDown) {
    			if (this.elem.setCapture) this.elem.setCapture();
    			this.isDraging = false;
    			this.hasMoved = false;
    			this.isDown = true;
    			this.evt = e;
    			this.Xr = (e.clientX !== undefined ? e.clientX : e.touches[0].clientX);
    			this.Yr = (e.clientY !== undefined ? e.clientY : e.touches[0].clientY);
    			this.X  = sX = this.Xr - this.screen.left;
    			this.Y  = sY = this.Yr - this.screen.top + ((html &
    &
     html.scrollTop) || body.scrollTop);
    			this.setup.down &
    &
     this.setup.down(e);
		}
	}
	this.pointerMove = function(e) {
    		this.Xr = (e.clientX !== undefined ? e.clientX : e.touches[0].clientX);
    		this.Yr = (e.clientY !== undefined ? e.clientY : e.touches[0].clientY);
    		this.X  = this.Xr - this.screen.left;
    		this.Y  = this.Yr - this.screen.top + ((html &
    &
     html.scrollTop) || body.scrollTop);
		if (this.isDown) {
    			this.Xi = this.bXi + (this.X - sX);
    			this.Yi = this.bYi - (this.Y - sY);
		}
    		if (Math.abs(this.X - sX) >
     11 || Math.abs(this.Y - sY) >
 11) {
    			this.hasMoved = true;
			if (this.isDown) {
				if (!this.isDraging) {
    					this.startX = sX;
    					this.startY = sY;
    					this.setup.startDrag &
    &
     this.setup.startDrag(e);
    					this.isDraging = true;
				}
 else {
    					this.setup.drag &
    &
     this.setup.drag(e);
				}
			}
 else {
    				sX = this.X;
    				sY = this.Y;
			}
		}
    		this.setup.move &
    &
     this.setup.move(e);
	}
	this.pointerUp = function(e) {
    		this.bXi = this.Xi;
    		this.bYi = this.Yi;
		if (!this.hasMoved) {
    			this.X = sX;
    			this.Y = sY;
    			this.setup.tap &
    &
     this.setup.tap(this.evt);
		}
 else {
    			this.setup.up &
    &
     this.setup.up(this.evt);
		}
    		this.isDraging = false;
    		this.isDown = false;
    		this.hasMoved = false;
    		this.setup.up &
    &
     this.setup.up(this.evt);
    		if (this.elem.releaseCapture) this.elem.releaseCapture();
    		this.evt = false;
	}
	this.pointerCancel = function(e) {
    		if (this.elem.releaseCapture) this.elem.releaseCapture();
    		this.isDraging = false;
    		this.hasMoved = false;
    		this.isDown = false;
    		this.bXi = this.Xi;
    		this.bYi = this.Yi;
    		sX = 0;
    		sY = 0;
	}
	if ('ontouchstart' in window) {
		this.elem.ontouchstart      = function (e) {
     self.pointerDown(e);
     return false;
  }
		this.elem.ontouchmove       = function (e) {
     self.pointerMove(e);
     return false;
  }
		this.elem.ontouchend        = function (e) {
     self.pointerUp(e);
     return false;
    }
		this.elem.ontouchcancel     = function (e) {
     self.pointerCancel(e);
     return false;
}
	}
	document.addEventListener("mousedown", function (e) {
    		if (			e.target === self.elem || 			(e.target.parentNode &
    &
     e.target.parentNode === self.elem) || 			(e.target.parentNode.parentNode &
    &
 e.target.parentNode.parentNode === self.elem)		) {
			if (typeof e.stopPropagation != "undefined") {
    				e.stopPropagation();
			}
 else {
    				e.cancelBubble = true;
			}
    			e.preventDefault();
    			self.pointerDown(e);
 		}
	}
    , false);
	document.addEventListener("mouSEMove", function (e) {
     self.pointerMove(e);
 }
    , false);
	document.addEventListener("mouseup",   function (e) {
    		self.pointerUp(e);
	}
    , false);
	document.addEventListener('gesturechange', function(e) {
    		e.preventDefault();
    		if (e.scale >
     1) self.scale = 0.1;
     else if (e.scale  1) self.scale = -0.1;
     else self.scale = 0;
    		self.setup.scale &
    &
     self.setup.scale(e);
    		return false;
	}
    , false);
	if (window.navigator.msPointerEnabled) {
    		var nContact = 0;
    		var myGesture = new MSGesture();
    		myGesture.target = this.elem;
		this.elem.addEventListener("MSPointerDown", function(e) {
			if (e.pointerType == e.MSPOINTER_TYPE_TOUCH) {
    				myGesture.addPointer(e.pointerId);
    				nContact++;
			}
		}
    , false);
		this.elem.addEventListener("MSPointerOut", function(e) {
			if (e.pointerType == e.MSPOINTER_TYPE_TOUCH) {
    				nContact--;
			}
		}
    , false);
		this.elem.addEventListener("MSGestureHold", function(e) {
    			e.preventDefault();
		}
    , false);
		this.elem.addEventListener("MSGestureChange", function(e) {
    			if (nContact >
 1) {
    				if (e.preventDefault) e.preventDefault();
     				self.scale = e.velocityExpansion;
    				self.setup.scale &
    &
     self.setup.scale(e);
			}
    			return false;
		}
    , false);
	}
	if (window.addEventListener) this.elem.addEventListener('DOMMouseScroll', function(e) {
     		if (e.preventDefault) e.preventDefault();
     		self.wheelDelta = e.detail * 10;
    		self.setup.wheel &
    &
     self.setup.wheel(e);
    		return false;
 	}
    , false);
 	this.elem.onmousewheel = function () {
     		self.wheelDelta = -event.wheelDelta * .25;
    		self.setup.wheel &
    &
     self.setup.wheel(event);
    		return false;
 	}
}
// ===== request animation frame =====window.requestAnimFrame = (function(){
		return  window.requestAnimationFrame || 		window.webkitRequestAnimationFrame   || 		window.mozRequestAnimationFrame      || 		window.oRequestAnimationFrame        || 		window.msRequestAnimationFrame       || 		function( run ){
    			window.setTimeout(run, 16);
		}
    ;
}
    )();
    
// ===== ge1doot global =====    js文件1var ge1doot = ge1doot || {
	json: null,	screen: null,	pointer: null,	camera: null,	loadJS: function (url, callback, data) {
    		if (typeof url == "string") url = [url];
		var load = function (src) {
    			var script = document.createElement("script");
				if (callback) {
					if (script.readyState){
						script.onreadystatechange = function () {
							if (script.readyState == "loaded" || script.readyState == "complete"){
    								script.onreadystatechange = null;
    								if (--n === 0) callback(data || false);
							}
						}
					}
 else {
						script.onload = function() {
    							if (--n === 0) callback(data || false);
						}
					}
				}
    				script.src = src;
    				document.getElementsByTagName("head")[0].appendChild(script);
		}
    		for (var i = 0, n = url.length;
     i  n;
     i++) load(url[i]);
	}
}
// ===== html/canvas container =====ge1doot.Screen = function (setup) {
    	ge1doot.screen = this;
    	this.elem = document.getElementById(setup.container) || setup.container;
    	this.ctx = this.elem.tagName == "CANVAS" ? this.elem.getContext("2d") : false;
    	this.style = this.elem.style;
    	this.left = 0;
    	this.top = 0;
    	this.width = 0;
    	this.height = 0;
    	this.cursor = "default";
    	this.setup = setup;
	this.resize = function () {
    		var o = this.elem;
    		this.width  = o.offsetWidth;
    		this.height = o.offsetHeight;
    		for (this.left = 0, this.top = 0;
     o != null;
 o = o.offsetParent) {
    			this.left += o.offsetLeft;
    			this.top  += o.offsetTop;
		}
		if (this.ctx) {
    			this.elem.width  = this.width;
    			this.elem.height = this.height;
		}
    		this.setup.resize &
    &
     this.setup.resize();
	}
	this.setCursor = function (type) {
    		if (type !== this.cursor &
    &
 'ontouchstart' in window === false) {
    			this.cursor = type;
    			this.style.cursor = type;
		}
	}
	window.addEventListener('resize', function () {
    		ge1doot.screen.resize();
	}
    , false);
    	!this.setup.resize &
    &
     this.resize();
}
// ==== unified touch events handler ====ge1doot.Pointer = function (setup) {
    	ge1doot.pointer = this;
    	var self        = this;
    	var body        = document.body;
    	var html        = document.documentElement;
    	this.setup      = setup;
    	this.screen     = ge1doot.screen;
    	this.elem       = this.screen.elem;
    	this.X          = 0;
    	this.Y          = 0;
    	this.Xi         = 0;
    	this.Yi         = 0;
    	this.bXi        = 0;
    	this.bYi        = 0;
    	this.Xr         = 0;
    	this.Yr         = 0;
    	this.startX     = 0;
    	this.startY     = 0;
    	this.scale      = 0;
    	this.wheelDelta = 0;
    	this.isDraging  = false;
    	this.hasMoved   = false;
    	this.isDown     = false;
    	this.evt        = false;
    	var sX          = 0;
    	var sY          = 0;
	// prevent default behavior	if (setup.tap) this.elem.onclick = function () {
     return false;
 }
	if (!setup.documentMove) {
		document.ontouchmove = function(e) {
     e.preventDefault();
 }
	}
	document.addEventListener("MSHoldVisual", function(e) {
     e.preventDefault();
 }
    , false);
    	if (typeof this.elem.style.msTouchAction != 'undefined') this.elem.style.msTouchAction = "none";
	this.pointerDown = function (e) {
		if (!this.isDown) {
    			if (this.elem.setCapture) this.elem.setCapture();
    			this.isDraging = false;
    			this.hasMoved = false;
    			this.isDown = true;
    			this.evt = e;
    			this.Xr = (e.clientX !== undefined ? e.clientX : e.touches[0].clientX);
    			this.Yr = (e.clientY !== undefined ? e.clientY : e.touches[0].clientY);
    			this.X  = sX = this.Xr - this.screen.left;
    			this.Y  = sY = this.Yr - this.screen.top + ((html &
    &
     html.scrollTop) || body.scrollTop);
    			this.setup.down &
    &
     this.setup.down(e);
		}
	}
	this.pointerMove = function(e) {
    		this.Xr = (e.clientX !== undefined ? e.clientX : e.touches[0].clientX);
    		this.Yr = (e.clientY !== undefined ? e.clientY : e.touches[0].clientY);
    		this.X  = this.Xr - this.screen.left;
    		this.Y  = this.Yr - this.screen.top + ((html &
    &
     html.scrollTop) || body.scrollTop);
		if (this.isDown) {
    			this.Xi = this.bXi + (this.X - sX);
    			this.Yi = this.bYi - (this.Y - sY);
		}
    		if (Math.abs(this.X - sX) >
     11 || Math.abs(this.Y - sY) >
 11) {
    			this.hasMoved = true;
			if (this.isDown) {
				if (!this.isDraging) {
    					this.startX = sX;
    					this.startY = sY;
    					this.setup.startDrag &
    &
     this.setup.startDrag(e);
    					this.isDraging = true;
				}
 else {
    					this.setup.drag &
    &
     this.setup.drag(e);
				}
			}
 else {
    				sX = this.X;
    				sY = this.Y;
			}
		}
    		this.setup.move &
    &
     this.setup.move(e);
	}
	this.pointerUp = function(e) {
    		this.bXi = this.Xi;
    		this.bYi = this.Yi;
		if (!this.hasMoved) {
    			this.X = sX;
    			this.Y = sY;
    			this.setup.tap &
    &
     this.setup.tap(this.evt);
		}
 else {
    			this.setup.up &
    &
     this.setup.up(this.evt);
		}
    		this.isDraging = false;
    		this.isDown = false;
    		this.hasMoved = false;
    		this.setup.up &
    &
     this.setup.up(this.evt);
    		if (this.elem.releaseCapture) this.elem.releaseCapture();
    		this.evt = false;
	}
	this.pointerCancel = function(e) {
    		if (this.elem.releaseCapture) this.elem.releaseCapture();
    		this.isDraging = false;
    		this.hasMoved = false;
    		this.isDown = false;
    		this.bXi = this.Xi;
    		this.bYi = this.Yi;
    		sX = 0;
    		sY = 0;
	}
	if ('ontouchstart' in window) {
		this.elem.ontouchstart      = function (e) {
     self.pointerDown(e);
     return false;
  }
		this.elem.ontouchmove       = function (e) {
     self.pointerMove(e);
     return false;
  }
		this.elem.ontouchend        = function (e) {
     self.pointerUp(e);
     return false;
    }
		this.elem.ontouchcancel     = function (e) {
     self.pointerCancel(e);
     return false;
}
	}
	document.addEventListener("mousedown", function (e) {
    		if (			e.target === self.elem || 			(e.target.parentNode &
    &
     e.target.parentNode === self.elem) || 			(e.target.parentNode.parentNode &
    &
 e.target.parentNode.parentNode === self.elem)		) {
			if (typeof e.stopPropagation != "undefined") {
    				e.stopPropagation();
			}
 else {
    				e.cancelBubble = true;
			}
    			e.preventDefault();
    			self.pointerDown(e);
 		}
	}
    , false);
	document.addEventListener("mousemove", function (e) {
     self.pointerMove(e);
 }
    , false);
	document.addEventListener("mouseup",   function (e) {
    		self.pointerUp(e);
	}
    , false);
	document.addEventListener('gesturechange', function(e) {
    		e.preventDefault();
    		if (e.scale >
     1) self.scale = 0.1;
     else if (e.scale  1) self.scale = -0.1;
     else self.scale = 0;
    		self.setup.scale &
    &
     self.setup.scale(e);
    		return false;
	}
    , false);
	if (window.navigator.msPointerEnabled) {
    		var nContact = 0;
    		var myGesture = new MSGesture();
    		myGesture.target = this.elem;
		this.elem.addEventListener("MSPointerDown", function(e) {
			if (e.pointerType == e.MSPOINTER_TYPE_TOUCH) {
    				myGesture.addPointer(e.pointerId);
    				nContact++;
			}
		}
    , false);
		this.elem.addEventListener("MSPointerOut", function(e) {
			if (e.pointerType == e.MSPOINTER_TYPE_TOUCH) {
    				nContact--;
			}
		}
    , false);
		this.elem.addEventListener("MSGestureHold", function(e) {
    			e.preventDefault();
		}
    , false);
		this.elem.addEventListener("MSGestureChange", function(e) {
    			if (nContact >
 1) {
    				if (e.preventDefault) e.preventDefault();
     				self.scale = e.velocityExpansion;
    				self.setup.scale &
    &
     self.setup.scale(e);
			}
    			return false;
		}
    , false);
	}
	if (window.addEventListener) this.elem.addEventListener('DOMMouseScroll', function(e) {
     		if (e.preventDefault) e.preventDefault();
     		self.wheelDelta = e.detail * 10;
    		self.setup.wheel &
    &
     self.setup.wheel(e);
    		return false;
 	}
    , false);
 	this.elem.onmousewheel = function () {
     		self.wheelDelta = -event.wheelDelta * .25;
    		self.setup.wheel &
    &
     self.setup.wheel(event);
    		return false;
 	}
}
// ===== request animation frame =====window.requestAnimFrame = (function(){
		return  window.requestAnimationFrame || 		window.webkitRequestAnimationFrame   || 		window.mozRequestAnimationFrame      || 		window.oRequestAnimationFrame        || 		window.msRequestAnimationFrame       || 		function( run ){
    			window.setTimeout(run, 16);
		}
    ;
}
    )();
    

到此这篇关于HTML+CSS+JavaScript实现图片3D展览的示例代码的文章就介绍到这了,更多相关HTML图片3D展览内容请搜索以前的文章或继续浏览下面的相关文章,希望大家以后多多支持!

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!

CSSHTML

若转载请注明出处: HTML+CSS+JavaScript实现图片3D展览的示例代码
本文地址: https://pptw.com/jishu/586260.html
app内嵌H5 webview 本地缓存问题的解决 html5小程序飞入购物车(抛物线绘制运动轨迹点)

游客 回复需填写必要信息