前几天在 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)的更多相关文章

  1. 关于longPressGesture做一个长按连加的效果(原创)

    关于longPressGesture做一个长按连加的效果 解释一下什么意思呢?就是一个button长按之后其数字的一直累加.朋友们可能看起来很简单,无非就是加一个长按手势(longPressGestu ...

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

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

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

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

  4. css3加js做一个简单的3D行星运转效果

    前几天在园子里看到一篇关于CSS3D行星运转的文章,原文在这里,感觉这个效果也太酷炫了,于是自己也就心血来潮的来尝试的做了一下.因为懒得去用什么插件了,于是就原生的JS写,效果有点粗超,还有一些地方处 ...

  5. 做一个阅读管理APP

    背景 由于最近在看的书有点多,所以一直想找一个能够管理阅读进度的书(鄙人记性不是很好,两天不看就忘了)可惜Android平台上一直找不到合适的APP: 有没有读书进度管理的网站或软件啊? 有没有记录读 ...

  6. 基于mysql数据库集群的360度水平切割

    1.why sharding? 我们都知道,信息行业发展日益迅速,积累下来的数据信息越来越多,互联网公司门要维护的数据日益庞大.设想一下,假如腾讯公司只用一个数据库的一张表格来存储所有qq注册用户的登 ...

  7. 用RecyclerView做一个小清新的Gallery效果 - Ryan Lee的博客

    一.简介 RecyclerView现在已经是越来越强大,且不说已经被大家用到滚瓜烂熟的代替ListView的基础功能,现在RecyclerView还可以取代ViewPager实现Banner效果,当然 ...

  8. 使用plupload做一个类似qq邮箱附件上传的效果

    公司项目中使用的框架是springmvc+hibernate+spring,目前需要做一个类似qq邮箱附件上传的功能,暂时只是上传小类型的附件 处理过程和解决方案都需要添加附件,处理过程和解决方案都可 ...

  9. 最近比较迷flash professional cc 做PPT,做一个flash做动态打字效果的教程

    想做一个flash打字效果.网上的方法要不是太繁琐,要不然就是各种遗漏.在这边做一个行之有效的flash做打字效果教程. 首先我用的是最新版本的flash professional cc .但是应该和 ...

随机推荐

  1. CSS学习中的瓶颈期深入分析

    虽已数年,但未就学习专门写过文章,这回破处了.苍蝇不叮没有缝隙的鸡蛋,领导不做没有跟拍的表演,同样,想到写CSS学习的文章也是有原因的(虽然我的不少行为没有原因). 情景再现(尊重隐私,下面故事中人名 ...

  2. Android L(5.0)源码之图形与图像处理之动画——Frame、Tween、属性动画、SurfaceView

    工作中暂时还没涉及到,暂时先不总结

  3. Android NDK开发及调用标准linux动态库.so文件

    源:Android NDK开发及调用标准linux动态库.so文件 预备知识及环境搭建 1.NDK(native development Kit)原生开发工具包,用来快速开发C.C++动态库,并能自动 ...

  4. 【转】分享一份C语言写的简历

    个人观点:文章想法很棒,作者的编码风格也很赞,可以从中学到不少东西.转载的文章是我都用心看过的,而且希望后续再可以回过头看的文章,努力让自己的能力越来越强,加油 这里黑客新闻吗?作者用代码更新了自己的 ...

  5. SQLite高级:一库建多表,封装类

    package eoe.database; import android.content.Context; import android.database.sqlite.SQLiteDatabase; ...

  6. Object类可以接受引用类型

    Object类是一切类的父类,所以Object类可以接受一切引用类型.连数组和接口对象也都可以接受. 1.接受数组 public class ObjectTest{ public static voi ...

  7. 自己实现一个IOC(控制翻转,DI依赖注入)容器

    1.新建一个控制台应用程序 TestIOC 2.新增一个 IocFactory类 using System; using System.Collections.Generic; using Syste ...

  8. hack:选择符前缀法,样式属性前缀法

    选择符前缀法 <style> *html .test{width:100px;} /*only for IE6*/ *+html .test{width:100px;}/*for IE6 ...

  9. Python3基础 set() 删除一个列表中的重复项

    镇场诗: 诚听如来语,顿舍世间名与利.愿做地藏徒,广演是经阎浮提. 愿尽吾所学,成就一良心博客.愿诸后来人,重现智慧清净体.-------------------------------------- ...

  10. UVa 10720 - Graph Construction

    题目大意:给n个整数, 分别代表图中n个顶点的度,判断是否能构成一张图. 看到这个题后,除了所有数之和应该为偶数之外,没有别的想法了,只好在网上搜解题报告了.然后了解了Havel-Hakimi定理.之 ...