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

iefreer 发表于 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(1) negative(0) views2621 comments0
私信 收藏 分享
分享到

发送私信

最新评论

请先 登录 再评论.
相关文章
  • ARCore基本概念和工作原理简介

    谷歌的WebAROnARCore项目基于Android手机提供的ARCore增强现实引擎,要了解WebAROnARCore,需要先了解ARCore的工作原理。基本上ARCore做了两件事,首先跟踪手机...

  • CentOS6 Apache2.2用域名配置多虚拟机

    在CentOS下使用域名配置多虚拟机的步骤如下:
    1. 使用

  • 踏得网精选2016年度10大最佳HTML5动画

    踏得网精选2016年度最酷最新的HTML5动画集,评选标准为:创意新颖度+实现技术难度+趣味程度。使用一些在线H5生成工具的作品,因其主要使用图片和CSS3套路动画,...

  • CSS3人行走动作图解和动画实现

    对于人类而言,行走是一种很自然的想要前进并防止跌倒的一组动作重复。大部分人1岁就学会了走路,但至此以后的几十年间,或许我们从来没留意过自己行走姿势。当...

  • NodeJS、Java和PHP性能考量和若干参考结论

    首先需要说明的是,严格而言NodeJS和Java、PHP并非对等概念,NodeJS是基于JS的一个应用程序,而Java/PHP是语言。我们这里实际指的是分别使用node、java和php来实...

  • Three.js入门教程2 - 着色器(下)

    这是WebGL着色器教程的后半部分,如果你没看过前一篇,阅读这一篇教程可能会使你感到困惑,建议你翻阅前面的教程。

  • Three.js入门教程1 - 基础知识和创建一个红色球体

    [ TECHBROOD注:Three.js是一个主流的开源WebGL库,WebGL允许使用JavaScript直接操作GPU,在网页上实现3D效果。
    Google的工程师Paul在网站aerotwist.com上...

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

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

  • 如何实现SVG clipPath自适应被裁剪对象

    CSS3中引入的clip-path(裁剪路径)属性是一个很强大的特性。
    clip-path的含义如下图所示,好比剪纸一样,你用剪刀沿着某条路径把目标对象(图像或元素)裁...

  • 如何使用WebGL创建一个逼真的下雨动画

    之前写过文章来分别讲解如何使用CSS3和Canvas2D实现过雨滴和下雨动画。通过背景处理看起来也有视觉上的3D效果,但并非真正的3D场景,如果要加入用户交互,进行36...

  • WebGL入门教程1 - 3D绘图基础知识

    现代浏览器努力使得Web用户体验更为丰富,而WebGL正处于这样的技术生态系统的中心位置。其应用范围覆盖在线游戏、大数据可视化、计算机辅助设计、虚拟现实以及数...

  • D3.js读取外部json数据

    D3.js是一个很好的数据可视化工具,支持从web服务读取json数据,或者从外部文件如.json, .csv文件中直接读取。由于部分服务比如flickrs上的图文数据服务需要VPN...

  • SVG过滤器feColorMatrix矩阵变换效果用法详解

    在计算机图形学(数学)中,矩阵乘法可用于把空间向量进行几何变换。我们可以把颜色的值(RGBA)表示成一个四维空间向量:color = (r, g, b, a);那么就可以应用...

  • 更多...