基于javascript html5实现3D翻书特效


Posted in Javascript onMarch 14, 2016

这是一款十分炫酷的HTML5 3D书本翻页动画,效果相对比较简单,拖拽鼠标模拟用手翻页,更漂亮的是翻页过程中,呈现出逼真的3D立体效果。书本中的文字和图片也会3D展示,非常酷。

基于javascript html5实现3D翻书特效

在线演示 源码下载

HTML代码

<div class="book p3d">
 <div class="back-cover p3d">
 <div class="page back flip"></div>
 <div class="page front p3d">
  <div class="shadow"></div>
  <div class="dino"></div>
 </div>
 </div>
 <div class="front-cover p3d">
 <div class="page front flip p3d">
  <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nam fermentum nisl quis nulla eleifend dignissim. Curabitur varius lobortis tincidunt. Maecenas gravida, nulla quis luctus imperdiet, ipsum nibh consectetur ante, in sodales massa tortor eget neque. Donec porta ligula massa, id sagittis est. Ut nisl tellus, faucibus nec feugiat ut, laoreet iaculis felis. Suspendisse ultrices mauris vel tellus suscipit commodo. Integer vitae tortor erat. Pellentesque non tempor nisi.</p>
 </div>
 <div class="page back"></div>
 </div>
</div>

CSS代码

.book {
 width: 300px;
 height: 300px;
 margin-top: -150px;
 position: absolute;
 left: 50%;
 top: 50%;
 -webkit-transform: rotateX(60deg);
 -moz-transform: rotateX(60deg);
 -ms-transform: rotateX(60deg);
 -o-transform: rotateX(60deg);
 transform: rotateX(60deg);
 -webkit-user-select: none;
 -moz-user-select: none;
 -ms-user-select: none;
 -o-user-select: none;
 user-select: none;
}
.page {
 width: 300px;
 height: 300px;
 padding: 1em;
 position: absolute;
 left: 0;
 top: 0;
 text-indent: 2em;
}
.front {
 background-color: #d93e2b;
}
.back {
 background-color: #fff;
}
.front-cover {
 cursor: move;
 -webkit-transform-origin: 0 50%;
 -moz-transform-origin: 0 50%;
 -ms-transform-origin: 0 50%;
 -o-transform-origin: 0 50%;
 transform-origin: 0 50%;
 -webkit-transform: rotateY(0deg);
 -moz-transform: rotateY(0deg);
 -ms-transform: rotateY(0deg);
 -o-transform: rotateY(0deg);
 transform: rotateY(0deg);
}
.front-cover .back {
 background-image: url(mdn.png);
 background-repeat: no-repeat;
 background-position: 50% 50%;
 -webkit-transform: translateZ(3px);
 -moz-transform: translateZ(3px);
 -ms-transform: translateZ(3px);
 -o-transform: translateZ(3px);
 transform: translateZ(3px);
}
.back-cover .back {
 -webkit-transform: translateZ(-3px);
 -moz-transform: translateZ(-3px);
 -ms-transform: translateZ(-3px);
 -o-transform: translateZ(-3px);
 transform: translateZ(-3px); 
}
.p3d {
 -webkit-transform-style: preserve-3d;
 -moz-transform-style: preserve-3d;
 -ms-transform-style: preserve-3d;
 -o-transform-style: preserve-3d;
 transform-style: preserve-3d;
}
.flip {
 -webkit-transform: rotateY(180deg);
 -moz-transform: rotateY(180deg);
 -ms-transform: rotateY(180deg);
 -o-transform: rotateY(180deg);
 transform: rotateY(180deg);
}
.dino,
.shadow {
 width: 196px;
 height: 132px;
 position: absolute;
 left: 60px;
 top: 60px;
 -webkit-transform-origin: 0 100%;
 -moz-transform-origin: 0 100%;
 -ms-transform-origin: 0 100%;
 -o-transform-origin: 0 100%;
 transform-origin: 0 100%;
}
.dino {
 background: url(dino.png) no-repeat;

}
.shadow {
 background: url(shadow.png) no-repeat;
}

JavaScript代码

(function (window, document) {

 var prefixes = ['Webkit', 'Moz', 'ms', 'O', ''],
 book = document.querySelectorAll('.book')[0],
 page = document.querySelectorAll('.front-cover')[0],
 dino = document.querySelectorAll('.dino')[0],
 shadow = document.querySelectorAll('.shadow')[0],
 hold = false,
 centerPoint = window.innerWidth / 2,
 pageSize = 300,
 clamp = function (val, min, max) {
 return Math.max(min, Math.min(val, max));
 };

 page.onmousedown = function () {
 hold = true;
 };

 window.onmouseup = function () {
 if (hold) {
 hold = false;
 }
 };

 window.onresize = function () {
 centerPoint = window.innerWidth / 2;
 };

 window.onmousemove = function (evt) {
 if (!hold) {
 return;
 }

 var angle = clamp((centerPoint - evt.pageX + pageSize) / pageSize * -90, -180, 0),
 i, j;

 for (i = 0, j = prefixes.length; i < j; i++) {
 book.style[prefixes[i] + 'Transform'] = 'rotateX(' + (60 + angle / 8) + 'deg)';
 page.style[prefixes[i] + 'Transform'] = 'rotateY(' + angle + 'deg)';
 dino.style[prefixes[i] + 'Transform'] = 'rotateX(' + (angle / 2) + 'deg)';
 shadow.style[prefixes[i] + 'Transform'] = 'translateZ(1px) skewX(' + (angle / 8) + 'deg)';
 }
 };

})(window, document);

以上就是HTML5 3D书本翻页动画的示例代码,希望对大家学习javascript程序设计有所帮助。

Javascript 相关文章推荐
javascript 密码强度验证规则、打分、验证(给出前端代码,后端代码可根据强度规则翻译)
May 18 Javascript
js通过googleAIP翻译PHP系统的语言配置的实现代码
Oct 17 Javascript
jQuery使用数组编写图片无缝向左滚动
Dec 11 Javascript
javascript中parseInt()函数的定义和用法分析
Dec 20 Javascript
Bootstrap开关(switch)控件学习笔记分享
May 30 Javascript
jQuery插件uploadify实现ajax效果的图片上传
Jun 18 Javascript
Google 地图类型详解及示例代码
Aug 06 Javascript
浅谈jQuery中的checkbox问题
Aug 10 Javascript
AngularJs $parse、$eval和$observe、$watch详解
Sep 21 Javascript
解决vue中无法动态修改jqgrid组件 url地址的问题
Mar 01 Javascript
js经验分享 JavaScript反调试技巧
Mar 10 Javascript
Vue中ref和$refs的介绍以及使用方法示例
Jan 11 Vue.js
php基于redis处理session的方法
Mar 14 #Javascript
使用javascript插入样式
Mar 14 #Javascript
jQuery实现百叶窗焦点图动画效果代码分享(附源码下载)
Mar 14 #Javascript
javascript实现数组去重的多种方法
Mar 14 #Javascript
javascript实现PC网页里的拖拽效果
Mar 14 #Javascript
Jquery实现简单的轮播效果(代码管用)
Mar 14 #Javascript
node模块机制与异步处理详解
Mar 13 #Javascript
You might like
php 友好URL的实现(吐血推荐)
2008/10/04 PHP
PHP使用PDO创建MySQL数据库、表及插入多条数据操作示例
2019/05/30 PHP
Javascript的IE和Firefox兼容性汇编(zz)
2007/02/02 Javascript
JavaScript简单实现网页回到顶部功能
2013/11/12 Javascript
根据身份证号自动输出相关信息(籍贯,出身日期,性别)
2013/11/15 Javascript
用JavaScript实现使用鼠标画线的示例代码
2014/08/19 Javascript
JScript中的条件注释详解
2015/04/24 Javascript
JavaScript中const、var和let区别浅析
2016/10/11 Javascript
JS实现动态增加和删除li标签行的实例代码
2016/10/16 Javascript
javascript稀疏数组(sparse array)和密集数组用法分析
2016/12/28 Javascript
Bootstrap表单控件学习使用
2017/03/07 Javascript
jquery+ajaxform+springboot控件实现数据更新功能
2018/01/22 jQuery
vue列表单项展开收缩功能之this.$refs的详解
2019/05/05 Javascript
vue监听用户输入和点击功能
2019/09/27 Javascript
vue使用axios实现excel文件下载的功能
2020/07/16 Javascript
Python获取网页上图片下载地址的方法
2015/03/11 Python
python遍历类中所有成员的方法
2015/03/18 Python
Python中输出ASCII大文字、艺术字、字符字小技巧
2015/04/28 Python
Python实现的拟合二元一次函数功能示例【基于scipy模块】
2018/05/15 Python
梅尔频率倒谱系数(mfcc)及Python实现
2019/06/18 Python
详解Python是如何实现issubclass的
2019/07/24 Python
详解Python中正则匹配TAB及空格的小技巧
2019/07/26 Python
Python Charles抓包配置实现流程图解
2020/09/29 Python
英国派对礼服和连衣裙购物网站:TFNC London
2018/07/07 全球购物
艺术设计专业个人求职信
2013/09/21 职场文书
总经理助理岗位职责
2013/11/08 职场文书
公司薪酬管理制度
2014/01/31 职场文书
师范大学生求职信
2014/06/13 职场文书
2015年党员承诺书
2015/01/21 职场文书
2015年全国保险公众宣传日活动方案
2015/05/06 职场文书
2015银行年终工作总结范文
2015/05/26 职场文书
八月一日观后感
2015/06/10 职场文书
调解协议书范本
2016/03/21 职场文书
聊一聊python常用的编程模块
2021/05/14 Python
python3读取文件指定行的三种方法
2021/05/24 Python
关于JavaScript回调函数的深入理解
2021/06/27 Javascript