JavaScript实现360度全景图片展示效果
全景拍摄:所谓“全景拍摄”就是将所有拍摄的多张图片拼成一张全景图片。它的基本拍摄原理是搜索两张图片的边缘部分,并将成像效果最为接近的区域加以重合,以完成图片的自动拼接。现在的智能手机也基本带这个功能。
这个小DEMO基于全景图片的左右边缘较为接近且适宜自动拼接与jser熟知的无缝滚动原理。下面这个图片就是本DEMO实现原理的简化图。

HTML代码
<div class="pop_see_360pic" style="" id="popseebox">
<div class="pic_box">
<div class="loading" id="pic360load">Loading...</div>
<div class="pic_box_inner" id="pic_box_inner">
<img src="">
</div>
<a href="javascript:void(0)" class="prev_arrow" id="prev"><span>←</span></a> <a href="javascript:void(0)" class="pause_arrow" id="pause"><span>‖</span></a> <a href="javascript:void(0)" class="next_arrow" id="next"><span>→</span></a>
</div>
<div class="pic_list">
<ul id="picListItem">
<li><a href="javascript:void(0)" class="sel">Standard Room</a></li>
<li><a href="javascript:void(0)" imgurl="http://ued.ctrip.com/blog/wp-content/uploads/2012/12/hotel_1.jpg">Sea view Room (PVSU1)</a></li>
<li><a href="javascript:void(0)" imgurl="http://ued.ctrip.com/blog/wp-content/uploads/2012/12/hotel_2.jpg">Royale Suite</a></li>
<li><a href="javascript:void(0)" imgurl="http://ued.ctrip.com/blog/wp-content/uploads/2012/12/hotel_3.jpg">Bella Suite</a></li>
<li><a href="javascript:void(0)" imgurl="http://ued.ctrip.com/blog/wp-content/uploads/2012/12/hotel_4.jpg">11Royale Suite (PVSU1)</a></li>
<li><a href="javascript:void(0)" imgurl="http://ued.ctrip.com/blog/wp-content/uploads/2012/12/hotel_5.jpg">Royale Suite</a></li>
<li><a href="javascript:void(0)" imgurl="http://ued.ctrip.com/blog/wp-content/uploads/2012/12/hotel_6.jpg">Bella Suite</a></li>
<li><a href="javascript:void(0)" imgurl="http://ued.ctrip.com/blog/wp-content/uploads/2012/12/hotel_7.jpg">Royale Suite (PVSU1)</a></li>
</ul>
</div>
<a href="javascript:void(0)" class="mbtn mbtn-mini" id="close">X</a>
</div>
CSS代码:
*{margin:; padding:;}
li{list-style: none; }
body{font-size:11px;}
a{text-decoration: none;}
.pop_see_360pic:after {clear:both;display:block;content:".";height:;visibility:hidden;font-size:;line-height:;}
.pop_see_360pic {position:relative;float:left;width:550px;padding:14px 70px 14px 71px;border:1px solid #CECECE;background-color:#FFFFFF;zoom:;}
.pop_see_360pic_fla {width:650px;padding:20px 40px 14px 0;}
.pop_see_360pic .mbtn {position:absolute;top:12px;right:20px;}
.pop_see_360pic .pic_box {position:relative;float:left;width:320px;height:240px;overflow:hidden;margin-right:10px;}
.pop_see_360pic .pic_box img {display:block;width:320px;height:240px;}
.pop_see_360pic .pic_list {float:left;width:220px;height:240px;overflow-x:hidden;overflow-y:auto;}
.pop_see_360pic .pic_list ul {overflow:hidden;width:218px;border:1px solid #CECECE;border-bottom:0 none;}
.pop_see_360pic .pic_list li {float:left;width:218px;height:35px;font-weight:bold;border-bottom:1px solid #CECECE;}
.pop_see_360pic .pic_list li a {display:block;width:100%;height:18px;overflow:hidden;padding:9px 10px 8px 10px;zoom:;}
.pop_see_360pic .pic_list li a:hover {text-decoration:none;background-color:#EFF0F1;}
.pop_see_360pic .pic_list li a.sel,
.pop_see_360pic .pic_list li a.sel:hover {text-decoration:none;background-color:#C1D3F1;}
.pop_see_360pic .prev_arrow,
.pop_see_360pic .pause_arrow,
.pop_see_360pic .next_arrow {position:absolute;left:124px;bottom:;width:70px;height:27px;overflow:hidden;padding-top:17px;text-align:center;font-size:12px;filter:progid:DXImageTransform.Microsoft.gradient(enabled='true',startColorstr='#7FFFFFFF', endColorstr='#7FFFFFFF');background:url(about:blank);background:rgba(255,255,255,0.5);z-index:;}
:root .pop_see_360pic .prev_arrow,
:root .pop_see_360pic .pause_arrow,
:root .pop_see_360pic .next_arrow {filter:none;}
.pop_see_360pic .prev_arrow {left:53px;border-radius:10px 0 0 0;}
.pop_see_360pic .next_arrow {left:195px;border-radius:0 10px 0 0;}
.pop_see_360pic .prev_arrow:hover,
.pop_see_360pic .pause_arrow:hover,
.pop_see_360pic .next_arrow:hover {font-size:11px;}
.pop_see_360pic .pic_box img {width: auto;height: 240px;}
.pop_see_360pic{margin:10px;}
.pop_see_360pic .loading{position: absolute; top:; left:; background:#ebebeb url(http://www.cocss.com/wp-content/uploads/2012/12/loading_50_g.gif) no-repeat 134px 78px; width: 320px; height:240px; z-index:; text-indent: -999px;}
.pic_box_inner{position:absolute; width:5000px; overflow: hidden; *zoom:;}
.pic_box_inner img{float:left;}
JavaScript代码:
var pic360play = function(){this.initialize()}
pic360play.prototype = {
initialize : function(){
var oThis = this;
this.popseebox = document.getElementById("popseebox");
this.pic360load = document.getElementById("pic360load");
this.oPrev = document.getElementById("prev");
this.opause = document.getElementById("pause");
this.oNext = document.getElementById("next");
this.timeout = 0;
this.picList = document.getElementById("picListItem");
this.oScrollIner = document.getElementById("pic_box_inner");
this.oScrollBox = this.oScrollIner.parentNode;
this.oScrollImg = this.oScrollBox.getElementsByTagName("img")[0];
/* ============= copy img for scrool no space =========== */
this.oScrollImgcopy = this.oScrollImg.cloneNode(true);
this.oScrollIner.appendChild(this.oScrollImgcopy);
/* =========== bind close pic360play popup event ========== */
document.getElementById("close").onclick = function(){
oThis.close(popseebox);
}
/* ============== reset first img and layout ===============*/
oThis.resetImg();
/* ============== give per link tabs pic =================*/
oThis.picList.onclick = function(e) {
e = window.event ? window.event : e;
var who = e.target ? e.target : e.srcElement;
if(who.nodeType == 1 && who.tagName == "A" && who.getAttribute("imgurl") && oThis.oScrollImgcopy.src != who.getAttribute("imgurl")){
oThis.pic360load.style.display = "block";
var newimg = new Image();
newimg.src = who.getAttribute("imgurl");
newimg.onload = function(){
oThis.oScrollImg.src = oThis.oScrollImgcopy.src = who.getAttribute("imgurl");
oThis.oScrollImg = oThis.oScrollBox.getElementsByTagName("img")[0];
oThis.oScrollImgcopy = oThis.oScrollBox.getElementsByTagName("img")[1];
oThis.pic360load.style.display = "none";
clearTimeout(oThis.timeout);
oThis.resetMiddle();
oThis.timeout = setInterval(function(){
oThis.prev(oThis);
},16);
}
return false;
}
};
/* ============ play pic ============= */
this.oPrev.onclick = function(){
clearTimeout(oThis.timeout);
oThis.timeout = setInterval(function(){
oThis.prev();
},16);
}
this.oNext.onclick = function(){
clearTimeout(oThis.timeout);
oThis.timeout = setInterval(function(){
oThis.next();
},16);
}
this.opause.onclick = function(){
clearTimeout(oThis.timeout);
}
},
getStyle : function(elem,name){
if(elem.style[name]){
return elem.style[name];
}
else if(elem.currentStyle){
return elem.currentStyle[name];
}
else if(document.defaultView && document.defaultView.getComputedStyle){
name = name.replace(/[A-Z]/g,"-$1");
name = name.toLowerCase();
var s = document.defaultView.getComputedStyle(elem,'');
return s && s.getPropertyValue(name);
}
return null;
},
prev : function(){
if(parseFloat(this.oScrollIner.style.left) < -(this.oScrollImg.width + parseFloat(this.getStyle(this.oScrollBox,"width"))) ){
this.oScrollIner.style.left = parseFloat(this.oScrollIner.style.left) + this.oScrollImg.width + "px";
}
this.oScrollIner.style.left = parseFloat(this.oScrollIner.style.left) - 1 + "px";
},
opause : function(){
clearTimeout(this.timeout);
},
next : function(){
if(parseFloat(this.oScrollIner.style.left) > parseFloat(this.getStyle(this.oScrollBox,"width")) - this.oScrollImg.width)
this.oScrollIner.style.left = parseFloat(this.oScrollIner.style.left) - this.oScrollImg.width + "px";
this.oScrollIner.style.left = parseFloat(this.oScrollIner.style.left) + 1 + "px";
},
close : function(obj){
obj.style.display = "none";
return false;
},
resetImg : function(){
var picListItemLink = this.picList.getElementsByTagName("a");
var oThis = this;
oThis.oScrollImg.src = oThis.oScrollImgcopy.src = picListItemLink[1].getAttribute("imgurl");
var resetImg = new Image();
resetImg.src= picListItemLink[1].getAttribute("imgurl");
resetImg.onload = function(){
//reset img location middle
oThis.resetMiddle();
oThis.pic360load.style.display = "none";
oThis.timeout = setInterval(function(){
oThis.prev(oThis);
},16);
}
},
resetMiddle: function(){
this.oScrollIner.style.left = - (this.oScrollImg.width/2 - parseFloat(this.getStyle(this.oScrollBox,"width"))/2) + "px";
}
}
new pic360play();
转自:携程设计委员会
JavaScript实现360度全景图片展示效果的更多相关文章
- jQuery Panorama Viewer – 360度全景展示插件
jQuery Panorama Viewer 这款插件可以帮助你在网站中嵌入全景图片.要做到这一点,首先只需要在页面中引入最新的 jQuery 库,以及 jquery.panorama_viewer. ...
- 使用Javascript来创建一个响应式的超酷360度全景图片查看幻灯效果
360度的全景图片效果常常可以用到给客户做产品展示,今天这里我们推荐一个非常不错的来自Robert Pataki的360全景幻灯实现教程,这里教程中将使用javascript来打造一个超酷的全景幻灯实 ...
- 使用 ThreeSixty 创建可拖动的 360 度全景图片预览效果
ThreeSixty 是生成可拖动的360度预览图像序列的 jQuery 插件.只需要在你的 HTML 页面包引入最新的 jQuery 和 threesixty.js 文件就可以使用了,支持键盘上的箭 ...
- 原生Js封装的产品图片360度展示
挺简单的一段程序,但是效果不错: 1.把需要展示的36张图片先预加载到浏览器缓存里 2.给展示图片的div添加方法 3.通过鼠标左右移动的像素转换图片 在线效果预览:http://jsfiddle.n ...
- threesixty.min.js 和jquery.threesixty.js使用总结----实现360度展示
最近公司做一个项目需要360度展示汽车的外观,就用到了threesixty.min.js,自己总结一下使用方法: treesixty.min.js 源码: /*! threesixty-slider ...
- 《JavaScript 实战》:实现图片幻滑动展示效果
滑动展示效果主要用在图片或信息的滑动展示,也可以设置一下做成简单的口风琴(Accordion)效果.这个其实就是以前写的图片滑动展示效果的改进版,那是我第一篇比较受关注的文章,是时候整理一下了. 有如 ...
- 利用Canvas实现360度浏览
前言:最近几个月来到新公司,主要从事移动端方面的开发,有时候也挺忙挺累的,于是就好一段时间没写博客了.其实自己在这几个月里,自己对canvas以及createjs和egret都有了一定程度上的认识与掌 ...
- html5人物图片360度立体旋转
体验效果:http://hovertree.com/texiao/html5/10.htm 下载:http://hovertree.com/hvtart/bjae/t16oddyt.htm 代码如下: ...
- 360度3D 旋转插件
Circlr插件是一款基于jQuery的可以对图片进行360度全方位旋转展示的插件.Circlr通过按一定角度规律拍摄的产品图片,制作出可以使用鼠标拖动.鼠标滚轮和移动触摸来进行图片逐帧旋转的效果.比 ...
随机推荐
- 开发框架(OrchardNoCMS)--BootStrap
基于ASP.NET MVC的热插拔模块式开发框架(OrchardNoCMS)--BootStrap 按照几个月之前的计划,也应该写一个使用Bootstrap作为OrchardNoCMS的UI库.之前这 ...
- r.js实践
r.js合并实践 项目中用到require.js做生产时模块开发,但上线要合并压缩,幸好它配套有r.js.下面就其用法说明一下. 首先建一个目录,里面的结构如下: require.js可以到r.js项 ...
- 引用动态链接库Dll文件 引用失败 未能添加对HD.dll的引用。请确保此文件可访问并且是一个有效的程序集或COM组件
出现这个问题,是由于使用了非.NET 的动态链接库,需要注册 方法如下: 1.在搜索程序和文件中使用 regsvr32 "D:\Projects\8.01.01.03-重庆大足\lib\Va ...
- 重定向和VT100编程
重定向和VT100编程 一.文件重定向 我们知道在linux shell 编程的时候,可以使用文件重定向功能,如下所示: [root@localhost pipe]# echo "h ...
- 线程:ThreadLocal实现线程范围内共享变量
在web应用中,一个请求(带有请求参数)就是一个线程,那么如何区分哪些参数属于哪个线程呢?比如struts中,A用户登录,B用户也登录,那么在Action中怎么区分哪个是A用户的数据,哪个是B用户的数 ...
- D5
今天的题目跟前几天的比起来简单了许多 由于T1没有开long long 所以T1全部WA掉了...只悲催的A了第二题 T1:多重背包 其实这一题我真心不会,DP各种弱,简直欲哭无泪... 不过认真的看 ...
- 哞哞快的 C# 高斯模糊实现
冲动来自于 bing best 这个小工具,非常短小精干,里边的设置界面非常精美而且背景是一张模糊效果的图片,十分养眼,遂想,收集一下实现方式放到类库里以后肯定用得上.一通百度.谷歌.博客园,换了好多 ...
- js读取 存入cookie
<script language=javascript> //获得coolie 的值 function cookie(name){ var cookieArray=document.coo ...
- IOS开发之路二十一(UIWebView加载本地html)
挺简单不多说的直接代码: // // ViewController.h // JSAndJson // // Created by WildCat on 13-9-8. // Copyright (c ...
- ASP.NET Web API是如何根据请求选择Action的?[下篇]
ASP.NET Web API是如何根据请求选择Action的?[下篇] 再<上篇>中我们简单介绍了用于实现Action选择机制的HttpActionSelector,接下来我们来讨论本章 ...