做一个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 .但是应该和 ...
随机推荐
- 微信小程序之----接口调用方式
最近开发了一个微信小程序版的任务管理系统,在向Java后台发送接口时遇到了一些问题,在这里做一个简单的总结. 官方接口 官方给出的接口叫做wx.request,请求方式比较简单,下面是官网给出的请求实 ...
- UVa 369 - Combinations
题目大意:给两个数n, m,求C(n, m).用java直接写就好了. import java.io.*; import java.util.*; import java.math.*; class ...
- Java解析JSON文件的方法 (二)
assets文件夹资源的访问 assets文件夹里面的文件都是保持原始的文件格式,需要用AssetManager以字节流的形式读取文件. 1. 先在Activity里面调用g ...
- Java解析JSON文件的方法(一)
一.首先需要在Eclipse工程中导入相关的jar包,jar包参见链接:http://yunpan.alibaba-inc.com/share/link/NdA5b6IFK 二.提供一份待解析的jso ...
- React Native 之 搭建开发环境
现在只能在MAC系统上安装. 1. 首先,HomeBrew 这是一个包管理库,用来下载其它工具. 打开网站:brew.sh 网页有个命令 /usr/bin/ruby -e "$(curl - ...
- MFC中在基于对话框的窗体中使用CFileDialog导致菜单栏变灰的解决方案
CSDN的博客编辑器实在是难用……转战博客园 直接把CSDN发的搬过来了 ————————————————————————————我是分割线———————————————————————————— 第 ...
- sqlloader外部表
一创建目录 先在系统下创建 $ cd /home/oracle $ mkdir dir $ cd dir $ pwd 再在sqlplus里创建,让oracle知道这个目录 SQL> create ...
- Session是否为新建情况的判断
Session是否为新建情况的判断: Xml: <?xml version="1.0" encoding="UTF-8"?> <web-app ...
- Java 导出Excel的各种尝试
最近的一个项目比较忙,一直没时间过来跟新博客.今天过来分享一下在此项目中遇到的一个小问题:导出Excel:相信导出Excel这个功能是特别常见的,也有很多的方式.好了,不多说了,直接说说自己遇到的各种 ...
- Python内置数据类型总结
python的核心数据类型:(很多语言之提供了数字,字符串,文件数据类型,其他形式的数据类型都以标准库的形式表示 也就是用之前需要import ) ,但是python有很多都是内置的,不需要impor ...