做一个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 .但是应该和 ...
随机推荐
- <转>SQL的执行顺序
SQL 不同于与其他编程语言的最明显特征是处理代码的顺序.在大数编程语言中,代码按编码顺序被处理,但是在SQL语言中,第一个被处理的子句是FROM子句,尽管SELECT语句第一个出现,但是几乎总是最后 ...
- 测试部署nginx
1.已经安装了nginx 2.修改tomcat端口号为10081(可随意) 3 修改nginx的nginx.config 如下: upstream apiserver { ip_ ...
- leetcode--014 Gas station
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAABGoAAADsCAIAAACjc9eHAAAgAElEQVR4nO3dTa7bRt4v4HczXoH2kS
- Codeforces Round 212 Div 2 报告(以前没写完,现在也没心情补了,先就这样吧)
A. Two Semiknights Meet 题目大意:有一个8x8的棋盘,上面放有两个骑士,骑士以“田字”的方式走.每个方格都被定义为good或者bad,问骑士能否在good的格子中相遇? 由于骑 ...
- PHP的高并发和大数据处理
收集前人的经验.加速学习,解决工作中的难题. 一.代码优化(包括sql语句的优化), 合理的使用索引,避免整表查询.二.日常海量数据处理我用文件缓存,文件缓存分两种,第一种是最常见的生成html静太文 ...
- .net面试题【持续更新.....】
1.C#中readonly和const的区别? 2.C#中的排序继承自哪个接口?Icompare 3.阐述单点登录的实现原理? 4.C#中property和Attribute的区别? 5.Datase ...
- Linux文件编辑之sed命令
文件编辑之sed命令 sed是一种流编辑器,它是文本处理中非常重要的工具,能够完美配合正则表达式使用,功能不同凡响.处理时,把当前处理的行存储在临时缓冲区中,称为模式空间 (pattern space ...
- python with用法
python中with可以明显改进代码友好度,比如: with open('a.txt') as f: print f.readlines() 为了我们自己的类也可以使用with, 只要给这个类增加两 ...
- iOS 沙盒
1. 概念 某个应用程序的非代码文件存放空间. 2. 文件结构 每个沙盒有三个文件夹: Documents: 存放文件 Library: 存放默认设置或状态信息.Library/caches: 缓存文 ...
- mvn常用指令记录
maven工程版本号更新: -------------------------------------------------------------------------------------- ...