使用纯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(14) views8057 comments0

发送私信

最新评论

请先 登录 再评论.
相关文章
  • CentOS6 Apache2.2多站点HTTPS配置

    可以使用letsencrypt(certbot)免费证书服务。支持多系统、多站点和多目录,支持wildcard(通配符域名),90天生效,可用定时任务自动更新。需要注意一点的是apache2.4以下版本需要在默认的ssl配置中添加如下的指令:NameVirtualHost

  • 2019年NodeJS框架Koa和Express选型比较

    Koa和Express都是NodeJS的主流应用开发框架。
    Express是一个完整的nodejs应用框架。Koa是由Express团队开发的,但是它有不同的关注点。Koa致力于核心中间件...

  • 如何使用BabylonJS加载OBJ或STL模型

    BabylonJS(也就是babylon.js,这是一个和three.js类似的WebGL开发框架),更多的用在游戏领域。
    本文说明和演示如何使用babylon.js来加载一个标准3d模型文...

  • 创建非矩形网页页面元素的常用技术和实例代码

    非矩形设计正在变成一种时尚,比如波浪形、菱形、三角形等:而随着技术发展,这种设计在技术实现上也变得更容易。本文以最简单的三角形为例,演示使用5种方法来...

  • CSS3原生变量(Native Variables)新特性简介

    对Web开发者来说,一个盼望已久的特性是CSS终于支持原生变量了!
    变量是程序语言中用来解决代码重复和进行表达式计算的关键概念(想想数学方程式中的x)。...

  • 常见面试题JavaScript闭包(ES5语法)

    JavaScript闭包(Closure)是常见的JS面试题,是否理解闭包是一个简单的区分JS初级和高级程序员的判例。几乎每个JS程序员都在使用闭包,有意或无意间。比如编写一个jQuery鼠标点击处理函数:$(function()

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

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

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

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

  • HTTP/2背景和新特性简介

    在前面的一篇文章中已经介绍了

  • Three.js入门教程4 - 创建粒子系统动画

    嗨,又见面了。这么说我们已经开始学习Three.js了,如果你还没有看过之前三篇教程,建议你先读完。如果你已经读完前面的教程了,你可能会想做一些关于粒子的东西。让我们直面这个话题吧,每个人都爱粒子效果。不管你是否知道,你可以很轻易地创建它们。

  • Three.js 开发基础知识 - 绘制3D对象

    Three.js是一个用来简化WebGL开发的JavaScript库,比如绘制一个三维立方体,使用WebGL需要100多行,那Three.js只要10几行就能够完成。本文通过创建一个立方体来...

  • Processing.js和P5.js的功能简介和区别

    什么是ProcessingProcessing是关于数字艺术的编程语言,支持跨平台,语言本身是一个类Java语言,程序文件的后缀为.pde。
    什么是Processing.js为了能让Proce...

  • div 、section 、article的区别和使用场景

    div 、section 、article的区别和使用场景
    主要区别,以及适用场合如下:
    1、div在html早期版本就支持了,section和article是html5提出的两个雨衣话标...

  • 更多...