前几天在 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. 【转】iOS开发路线简述

    简单看了下楼主说的很详细,尤其是最后面那个图描述很直观,让想学习ISO开发的程序猿很清晰每个步骤学习的内容,在此收藏下. iOS系统以及iPhone的出来都要感谢乔布斯,一个完美主义者,从如此优秀的i ...

  2. leetcode--007 word break I

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAA+4AAAC5CAIAAAA55fI7AAAZa0lEQVR4nO3dPW7bQIMG4L2MT6B7+A

  3. Centos7.2 编译安装PHP7

    PHP7,编译安装: 环境:centos7.2    (注意:因为我用的nginx, 此配置参数没有考虑到apache,所以不合适需要用apache的朋友照搬过去运行,但是可以参考.)   直接下载P ...

  4. XML解析之DOM解析技术案例

    Java代码: package com.xushouwei.xml; import java.io.File; import javax.xml.parsers.DocumentBuilder; im ...

  5. YII 1.0 分页类

    在控制器中 方法1 $criteria = new CDbCriteria();//AR的另一种写法 $model = Article::model(); $total = $model->co ...

  6. 负载均衡 Lvs DR 模式笔记

    先来一张原理图,相当于ip-tun模式把tunl0的那块网卡配置在eth0:0的这个接口上,避免了兼容性的问题

  7. ResultSet遍历过程中修改自身数据,不会改变循环的过程

    ResultSet遍历过程中修改自身数据,不会改变循环的过程: import java.sql.Connection; import java.sql.PreparedStatement; impor ...

  8. mysql5.5慢日志设置和查询

    mysql> showvariables like '%version%'; +-------------------------+---------------------+ | Variab ...

  9. springMvc获取servletContext

    springMvc获取servletContext WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebA ...

  10. Linux在线安装git(亲测成功)

    一.先检测是否已安装 安装git需要安装一些依赖,但是安装依赖之前需要先检测一下是否已经安装了git. rpm -qa | grep zlib-devel 二.具体安装命令 如果以前没有安装过,则下载 ...