使用纯CSS3实现一个3D旋转的书本

techbrood 发表于 2016-05-14 22:44:28

标签: CSS3, 书本, 3D, 立方体, 旋转

- +

有一些前沿的电商网站已经开始使用3D模型来展示商品并支持在线定制,而其中图书的展示是最为简单的一种,

无需复杂的建模过程,使用图片和CSS3的一些变换即可实现更好的展示效果,简洁而实用。


书本的3D模型是所有商品中最为简单的,因为其本质上就是一个立方体(cube),只是带有封面/封底和左侧封条。

所以要构造一个3D书本展示,问题就被分解为构造一个立方体+旋转+图片背景。

1. 构造一个立方体

要创建一个立方体,首先我们需要创建一个虚拟的三维视觉空间,这可以通过设置包容器元素的perspective属性获得。


下载 (1).png

.stage {  
    width: 200px;  
    height: 260px;  
    perspective: 1000px;  
    perspective-origin: center center;// 缺省值,可忽略  
}

上述代码把元素放在距离观察点1000px的地方(Z轴向),并且在X/Y轴向上居中。

<div class="stage">  
    <div class="cube">  
        <figure class="back"></figure>  
        <figure class="top"></figure>  
        <figure class="bottom"></figure>  
        <figure class="left"></figure>  
        <figure class="right"></figure>  
        <figure class="front"></figure>  
  </div>  
</div>

接着,我们在包容器元素里面添加一个立方体元素,6个边(上下左右和前后),之所以使用figure,是因为需要支持贴图。

我们需要根据书本的厚度和长宽来确定立方体各个面的坐标位置,在本例中所用书本模型(一本MySQL书)的绝对厚度为18.2px,高度260px,宽度197.6px。

那么根据简单的几何知识,前后面距离立方体中心的距离为18.2/2=9.1px,其中“后”元素需要再翻转一下(即“背”过去)。

.front {  
    transform: translateZ(9.1px);  
}  
.back {  
    transform: rotateY(180deg) translateZ(9.1px);  
}

用类似的计算方法,我们可以把其他4条边放置(平移+旋转变换)到各自的位置,从而拼装成一个虚拟的立方体。

.front {  
    transform: translateZ(9.1px);  
}  
.back {  
    transform: rotateY(180deg) translateZ(9.1px);  
}  
.top {  
    transform: rotateX(90deg) rotateZ(90deg) translateZ(98.8px) translateY(-89.7px);  
    width: 18.2px;  
    height: 197.6px;  
}  
.bottom {  
    transform: rotateX(-90deg) rotateZ(90deg) translateZ(161.2px) translateY(-89.7px);  
}  
.left {  
    transform: rotateY(-90deg) translateZ(9.1px);  
    width: 18.2px;  
}  
.right {  
    transform: rotateY(90deg) translateZ(188.5px);  
    width: 18.2px;  
}
2. 添加封面

接着我们给前后以及左侧面元素添加背景图(可以使用一张图,然后从不同的位置截取),给其他3个面添加背景颜色,并给“底”面添加阴影效果:

.front {  
    transform: translateZ(9.1px);  
    background: url("//wow.techbrood.com/uploads/160301/mysql.png") top right;  
    background-size: auto 100%;  
}  
.back {  
    transform: rotateY(180deg) translateZ(9.1px);  
    background: url("//wow.techbrood.com/uploads/160301/mysql.png") top left;  
    background-size: auto 100%;  
}  
.top {  
    transform: rotateX(90deg) rotateZ(90deg) translateZ(98.8px) translateY(-89.7px);  
    background: #fafafa;  
    width: 18.2px;  
    height: 197.6px;  
}  
.bottom {  
    transform: rotateX(-90deg) rotateZ(90deg) translateZ(161.2px) translateY(-89.7px);  
    background: #ccc;  
    width: 18.2px;  
    height: 197.6px;  
    -webkit-filter: drop-shadow(0 0 26px rgba(0, 0, 0, 0.75));  
}  
.left {  
    transform: rotateY(-90deg) translateZ(9.1px);  
    background: url("//wow.techbrood.com/uploads/160301/mysql.png") top center;  
    background-size: auto 100%;  
    width: 18.2px;  
}  
.right {  
    transform: rotateY(90deg) translateZ(188.5px);  
    background: #ddd;  
    background-size: auto 100%;  
    width: 18.2px;  
}

这样我们就实现了一个逼真的3D书本视觉模型。

3. 添加旋转动画

这个比较简单,使用rotateY方法就可以。

@-webkit-keyframes rotate {  
    0% {  
        transform: rotateY(0) translateX(-18.2px);  
    }  
    100% {  
        transform: rotateY(360deg) translateX(-18.2px);  
    }  
}

最终的效果图如下:

下载 (2).png

你可以在踏得网上自己试试看 (http://wow.techbrood.com/fiddle/17587)。

possitive(3) views6143 comments0

发送私信

最新评论

请先 登录 再评论.
相关文章
  • 微信公众号在线生成二维码带参数怎么搞?

    带参数二维码是微信公众号渠道二维码的一种实现
    微信的带参数二维码有两种,一种是临时二维码,一种是永久二维码,但是永久二维码的生成是有个数限制的,微...

  • Monaco Editor 编辑器拷贝粘贴功能调用和获取选中文本

    有时候需要在monaco editor外部调用编辑器的内置功能比如希望在页面主工具栏实现一些快捷操作。button

  • WebAssembly工作原理和JavaScript语言性能对比分析

    本文简单说明WebAssembly(简称wasm)工作原理和高性能的原由(和JavaScript相比)。不过需要提醒的是Wasm并非设计来完全替代JS,而是对JS的一个强大补充,JS中...

  • 前端开发框架技术选型:Angular2 VS React VS jQuery

    Angular和React是主流的2个前端开发框架,但是严格来说两者并非对等的概念。Angular是一个基于MVC(或者MVVM)的框架,包含model(模型)/view(视图)/controll...

  • Web界面编程状态变化和JS开发框架(React/Angular/Ember)

    UI编程中的一个关键课题就是界面组件化(可复用)以及组件状态管理。稍早一些的windows程序员可能接触过MFC,其界面编程中有一个DDX(DoDataExchange)的机制,...

  • HTML5、Hybrid APP、Native APP对比和技术选型

    HTML5和Native APP都很容易理解。为了获得HTML5的移植性和移动本地应用的高性能,搞出来一些混合APP的解决方案。比如Apache的Cordova(也就是以前的PhoneGap),...

  • WebVR简介和常用资源链接

    什么是WebVR这是一个实验性的JavaScript API,提供了在用户网页浏览器中访问虚拟现实设备的统一接口。当前主流VR设备如Oculus Rift DK2、谷歌的CardBoard、三星...

  • 如何使用WebGL实现空气高温热变形动画特效

    我们在炎炎夏日,或者在火堆旁,经常会观察到热源周围空气的不稳定波动现象。本文将讲解如何通过WebGL来实现这个特效。该效果可用于热变形、波浪、水面波光等场...

  • IE各版本CSS Hack(兼容性处理)语法速查表

    为了兼容IE各个版本,需要在CSS中添加额外的代码,比如以前常用的_width。之所以工作,是因为浏览器会忽略不能解析的样式规则,因此举个例子来说,把_width写在w...

  • Three.js 3D打印数据模型文件(.STL)加载

    3D打印是当下和未来10年产品技术主流方向之一,影响深远。对于电子商务类的3D打印网站,一个主要功能是把商品以3D的方式呈现出来,也就是3D数据可视化技术。HTML...

  • 如何使用纯CSS3实现一个3D泡沫

    要实现一个逼真的泡沫,涉及到比较复杂的光学/物理学知识。我们这里先简化下问题,实现一个相对简单而足够实用的泡沫元素。我们可以把基础的泡沫元素应用在很多场景中,比如水景、泡咖啡、啤酒甚至火焰特效中。泡沫首先是一个圆形元素.bubble

  • 如何使用CSS3/SCSS实现逼真的车窗雨滴效果

    在天气预报类的Web移动应用中,常常需要实现屏幕的雨滴效果,表示阴雨天气。感觉上比较神奇,其实想通了,这个效果的实现只需要一点物理知识和CSS3的简单变换。实现一个小雨滴首先雨滴是一个个小的椭圆形元素:.raindrop

  • 更多...