全景拍摄:所谓“全景拍摄”就是将所有拍摄的多张图片拼成一张全景图片。它的基本拍摄原理是搜索两张图片的边缘部分,并将成像效果最为接近的区域加以重合,以完成图片的自动拼接。现在的智能手机也基本带这个功能。

这个小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度全景图片展示效果的更多相关文章

  1. jQuery Panorama Viewer – 360度全景展示插件

    jQuery Panorama Viewer 这款插件可以帮助你在网站中嵌入全景图片.要做到这一点,首先只需要在页面中引入最新的 jQuery 库,以及 jquery.panorama_viewer. ...

  2. 使用Javascript来创建一个响应式的超酷360度全景图片查看幻灯效果

    360度的全景图片效果常常可以用到给客户做产品展示,今天这里我们推荐一个非常不错的来自Robert Pataki的360全景幻灯实现教程,这里教程中将使用javascript来打造一个超酷的全景幻灯实 ...

  3. 使用 ThreeSixty 创建可拖动的 360 度全景图片预览效果

    ThreeSixty 是生成可拖动的360度预览图像序列的 jQuery 插件.只需要在你的 HTML 页面包引入最新的 jQuery 和 threesixty.js 文件就可以使用了,支持键盘上的箭 ...

  4. 原生Js封装的产品图片360度展示

    挺简单的一段程序,但是效果不错: 1.把需要展示的36张图片先预加载到浏览器缓存里 2.给展示图片的div添加方法 3.通过鼠标左右移动的像素转换图片 在线效果预览:http://jsfiddle.n ...

  5. threesixty.min.js 和jquery.threesixty.js使用总结----实现360度展示

    最近公司做一个项目需要360度展示汽车的外观,就用到了threesixty.min.js,自己总结一下使用方法: treesixty.min.js 源码: /*! threesixty-slider ...

  6. 《JavaScript 实战》:实现图片幻滑动展示效果

    滑动展示效果主要用在图片或信息的滑动展示,也可以设置一下做成简单的口风琴(Accordion)效果.这个其实就是以前写的图片滑动展示效果的改进版,那是我第一篇比较受关注的文章,是时候整理一下了. 有如 ...

  7. 利用Canvas实现360度浏览

    前言:最近几个月来到新公司,主要从事移动端方面的开发,有时候也挺忙挺累的,于是就好一段时间没写博客了.其实自己在这几个月里,自己对canvas以及createjs和egret都有了一定程度上的认识与掌 ...

  8. html5人物图片360度立体旋转

    体验效果:http://hovertree.com/texiao/html5/10.htm 下载:http://hovertree.com/hvtart/bjae/t16oddyt.htm 代码如下: ...

  9. 360度3D 旋转插件

    Circlr插件是一款基于jQuery的可以对图片进行360度全方位旋转展示的插件.Circlr通过按一定角度规律拍摄的产品图片,制作出可以使用鼠标拖动.鼠标滚轮和移动触摸来进行图片逐帧旋转的效果.比 ...

随机推荐

  1. 职责链模式实例(C#)

    下面是使用指责链模式的一个具体的实例,可以方便的理解指责链模式. 其实指责链简单的来说,就是把一个指责的流程定义出来,像一条链路一样,每一个结点有自己的处理范围,若不能处理,则传到自己的引用的下一个结 ...

  2. poj1183 反正切函数的应用(水)

    这一题主要是推导过程+注意一下范围. // 由公式4你可以得到: arctan(/a)=arctan[(/b+/c)/(-/b*c)] =>b*c-=a(b+c); 令 b=a+m,c=a+n; ...

  3. IOS7学习之路八(iOS 禁止屏幕旋转的方法)

    - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation { retu ...

  4. svn签出单个文件

    ) { return new string[]{ string.Format("cd /d \"{0}\"",System.IO.Path.GetDirecto ...

  5. 框架的设计之IRepository还是IRepository<T>

    [Yom框架]漫谈个人框架的设计之[是IRepository还是IRepository<T>]? 前言                                            ...

  6. 安装oracle后,Tomcat 登陆 localhost 要求用户名和密码

    localhost 要求用户名和密码同时安装了tomcat和oracle9i后,启动Tomcat--连接到localhost 提示:位于 XDB 的服务器 localhost 要求用户名和密码,原因是 ...

  7. js冒泡排序和二分查找

    冒泡排序: var arr=[5,0,-56,900,12,9000,-123,-1000]; var flag=false; for(var i=0;i<arr.length-1;i++){ ...

  8. ASP.NET基础之HttpHandler学习

    ASP.NET基础之HttpHandler学习 经过前两篇[ASP.NET基础之HttpModule学习]和[ASP.NET基础之HttpContext学习]文章的学习我们对ASP.NET的基础内容有 ...

  9. Deep Belief Network简介

    Deep Belief Network简介 1. 多层神经网络存在的问题 常用的神经网络模型, 一般只包含输入层, 输出层和一个隐藏层: 理论上来说, 隐藏层越多, 模型的表达能力应该越强.但是, 当 ...

  10. MongoDB的一些用法(转藏)

    MongoDB是目前工作中经常使用到的NoSQL数据库. 本博客只记录相关理论知识和技巧,涉及到实践的部分都会单开Blog来记录实践过程. ------------------------------ ...