做一个360度看车的效果玩玩(web)
前几天在 Lexus 官网看到有这样的一个效果:http://www.lexus.com.cn/models/es/360
于是顺手打开控制台看了下他们是怎么做的,发现使用的技术还是比较简单的,通过背景图的切换来完成全景的效果。
心血来潮自己做了一个优化一点的版本,先上 DEMO 和 源码。(由于图片资源较大,加载时间较长,请耐心等待)
接下来分享下我的制作流程。首先观察下他们的图片链接:
http://img.lexus.do2014.cn/images/es/car/spoke10a/Sonic_Quartz/.jpg!t1024x450.jpg
标红的位置为图片的序号,在拖拽时通过改变 url 来完成全景的效果。每款车的每个颜色都有60张图,序号为0-59。
现在想把这60张图下载下来,一张张扣自然太low,小小的运用下 node.js 帮我们实现这个需求:依次请求图片,并通过 fileSystem 将图片写到本地。
download.js
var http = require("http"),
fs = require("fs");
var imgPath = 'http://img.lexus.do2014.cn/images/es/car/spoke10a/Red_Mica_Crystal_Shine/';
fs.mkdir('./downloadImg', (err) => {
if (err && err.code != 'EEXIST') return;
downloadImg();
});
function downloadImg() {
for (var i = 0; i < 60; i ++) {
var url = imgPath + i + ".jpg!t1024x450.jpg";
// console.log(url);
((i) => {
http.get(url, (res) => {
var out = fs.createWriteStream('./downloadImg/'+i+'.jpg', {
encoding: 'binary'
});
res.on('data', (chunk) => {
out.write(chunk);
});
res.on('end', () => {
console.log('Image_'+i+' download complete.');
out.end('');
});
});
})(i);
}
}
$ node download.js

这样60张图片就已经下载下来了,接下来想通过 CSS 精灵来实现这个图片切换的效果,所以需要将这些图片拼成一整张,我这里使用 sketch 来完成。

在同等的服务器条件下,一张肯定要比多张效率高。不过即使是压缩之后的图,也有着上M的大小。如果有 CDN 进行加速的话,那是再好不过的了。
准备工作已经完成了,接下来进行代码的编写。
首先创建一个方法用来生成矩阵,矩阵中用来保存每辆车在雪碧图中的坐标。
{
// ...
I: 0,
J: 0,
rowNum: 10,
colNum: 6,
max: 60,
conWidth: 1024,
conHeight: 450,
//...
createMatrix() {
this.matrix = [];
var arr = [];
for (var i = 0; i < this.max; i ++) {
var position = '-' + this.I * this.conWidth + ' -' + this.J * this.conHeight;
arr.push(position);
this.I ++;
if ((i+1) % this.colNum == 0) {
this.matrix.push(arr);
arr = [];
this.I = 0;
this.J ++;
}
}
// console.log(this.matrix);
this.I = 0;
this.J = 0;
}
}
生成的坐标矩阵如下

由于这些坐标最后是应用于 backgroundPostion 属性上的,所以直接在前面添加了 “-” 号。
接下来创建一个改变图片行列序号的方法,同时将坐标设置到 backgroundPosition 上。
{
//...
this.$container: document.querySelector('#container'),
this.I: 0,
this.J: 0,
this.rowNum: 10,
this.colNum: 6,
//...
rotate(type) { //clockwise: 顺时针, anti: 逆时针
if (type == 'clockwise') {
this.I ++;
if (this.I >= this.colNum) {
this.I = 0;
this.J ++;
if (this.J >= this.rowNum) this.J = 0;
}
} else if (type == 'anti') {
this.I --;
if (this.I < 0) {
this.I = this.colNum - 1;
this.J --;
if (this.J < 0) this.J = this.rowNum - 1;
}
}
// console.log(this.I, this.J);
this.changePosition();
},
changePosition() {
// console.log(this.matrix[this.J][this.I]);
this.$container.style.backgroundPosition = this.matrix[this.J][this.I];
},
}
最后使用 hammer.js 来完成手势的操作
var hammer = new Hammer(this.$container);
hammer.on('pan', function(e) {
if ([向右拖动]) {
this.rotate('anti');
} else {
this.rotate('clockwise');
}
});
这样,一个全景观车的效果就完成了。
感谢你的浏览,希望有所帮助。
做一个360度看车的效果玩玩(web)的更多相关文章
- 关于longPressGesture做一个长按连加的效果(原创)
关于longPressGesture做一个长按连加的效果 解释一下什么意思呢?就是一个button长按之后其数字的一直累加.朋友们可能看起来很简单,无非就是加一个长按手势(longPressGestu ...
- 使用Javascript来创建一个响应式的超酷360度全景图片查看幻灯效果
360度的全景图片效果常常可以用到给客户做产品展示,今天这里我们推荐一个非常不错的来自Robert Pataki的360全景幻灯实现教程,这里教程中将使用javascript来打造一个超酷的全景幻灯实 ...
- 使用 ThreeSixty 创建可拖动的 360 度全景图片预览效果
ThreeSixty 是生成可拖动的360度预览图像序列的 jQuery 插件.只需要在你的 HTML 页面包引入最新的 jQuery 和 threesixty.js 文件就可以使用了,支持键盘上的箭 ...
- css3加js做一个简单的3D行星运转效果
前几天在园子里看到一篇关于CSS3D行星运转的文章,原文在这里,感觉这个效果也太酷炫了,于是自己也就心血来潮的来尝试的做了一下.因为懒得去用什么插件了,于是就原生的JS写,效果有点粗超,还有一些地方处 ...
- 做一个阅读管理APP
背景 由于最近在看的书有点多,所以一直想找一个能够管理阅读进度的书(鄙人记性不是很好,两天不看就忘了)可惜Android平台上一直找不到合适的APP: 有没有读书进度管理的网站或软件啊? 有没有记录读 ...
- 基于mysql数据库集群的360度水平切割
1.why sharding? 我们都知道,信息行业发展日益迅速,积累下来的数据信息越来越多,互联网公司门要维护的数据日益庞大.设想一下,假如腾讯公司只用一个数据库的一张表格来存储所有qq注册用户的登 ...
- 用RecyclerView做一个小清新的Gallery效果 - Ryan Lee的博客
一.简介 RecyclerView现在已经是越来越强大,且不说已经被大家用到滚瓜烂熟的代替ListView的基础功能,现在RecyclerView还可以取代ViewPager实现Banner效果,当然 ...
- 使用plupload做一个类似qq邮箱附件上传的效果
公司项目中使用的框架是springmvc+hibernate+spring,目前需要做一个类似qq邮箱附件上传的功能,暂时只是上传小类型的附件 处理过程和解决方案都需要添加附件,处理过程和解决方案都可 ...
- 最近比较迷flash professional cc 做PPT,做一个flash做动态打字效果的教程
想做一个flash打字效果.网上的方法要不是太繁琐,要不然就是各种遗漏.在这边做一个行之有效的flash做打字效果教程. 首先我用的是最新版本的flash professional cc .但是应该和 ...
随机推荐
- 对position的理解
作者:zccst 先看看手册 值 描述 absolute 生成绝对定位的元素,相对于 static 定位以外的第一个父元素进行定位. 元素的位置通过 "left", "t ...
- UVA - 208 Firetruck(消防车)(并查集+回溯)
题意:输入着火点n,求结点1到结点n的所有路径,按字典序输出,要求结点不能重复经过. 分析:用并查集事先判断结点1是否可以到达结点k,否则会超时.dfs即可. #pragma comment(link ...
- 歪国人DIY的MINI四轴
歪国人DIY的MINI四轴 Crazyflie 2.0 自己仿Crazyflie.CrazyPony
- Java Dwr3实现消息推送步骤详解
DWR包含两个主要的部分:允许JavaScript从WEB服务器上一个遵循了AJAX原则的Servlet中获取数据.另外一方面一个JavaScript库可以帮助网站开发人员轻松地利用获取的数据来动态改 ...
- LIQN join on 后跟多个条件
sql 版:SELECT [t0].[OrderID], [t0].[CustomerID], [t0].[EmployeeID], [t0].[OrderDate], [t0].[RequiredD ...
- php中字符串长度和截取的函数
在做PHP开发的时候,由于我国的语言环境问题,所以我们常常需要对中文进行处理. 在PHP中,我们都知道有专门的mb_substr和mb_strlen函数,可以对中文进行截取和计算长度,但是,由于这些函 ...
- UVa 10925 - Krakovia
题目大意:关于大数的加法和除法的,用Java的BigInteger可以方便地解决. import java.io.*; import java.util.*; import java.math.*; ...
- Swing 布局时 组件大小问题
在JFrame中放置了几个JPanel ,想调整JPanel大小,一直无效. 问题在于: 因为JPanel A的四周没有添加任何组件,所以JPanel B会把JPanel A填满.这种情况想固定JPa ...
- spark在集群上运行
1.spark在集群上运行应用的详细过程 (1)用户通过spark-submit脚本提交应用 (2)spark-submit脚本启动驱动器程序,调用用户定义的main()方法 (3)驱动器程序与集群管 ...
- tomcat 修改端口(Java之负基础实战)
1.找到server.xml tomcat 安装路径/config/server.xml 2.搜索8080 修改成想要的端口号 3.重启tomcat