基于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 相关文章推荐
jquery中的sortable排序之后的保存状态的解决方法
Jan 28 Javascript
老鱼 浅谈javascript面向对象编程
Mar 04 Javascript
js 通用订单代码
Dec 23 Javascript
一个简单的jquery的多选下拉框(自写)
May 05 Javascript
详解JavaScript中常用的函数类型
Nov 18 Javascript
EditPlus 正则表达式 实战(3)
Dec 15 Javascript
超全面的JavaScript开发规范(推荐)
Jan 21 Javascript
bootstrap表格内容过长时用省略号表示的解决方法
Nov 21 Javascript
用原生 JS 实现 innerHTML 功能实例详解
Apr 03 Javascript
刷新页面后让控制台的js代码继续执行
Sep 20 Javascript
Weex开发之WEEX-EROS开发踩坑(小结)
Oct 16 Javascript
vue props 一次传多个值实例
Jul 22 Javascript
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 程序授权验证开发思路
2009/07/09 PHP
PHP 中检查或过滤IP地址的实现代码
2011/11/27 PHP
thinkphp在模型中自动完成session赋值示例代码
2014/09/09 PHP
php编程每天必学之表单验证
2016/03/01 PHP
Jquery作者John Resig自己封装的javascript 常用函数
2009/11/09 Javascript
基于jquery的inputlimiter 实现字数限制功能
2010/05/30 Javascript
JS运行耗时操作的延时显示方法
2010/11/19 Javascript
jQuery插件原来如此简单 jQuery插件的机制及实战
2012/02/07 Javascript
js计算德州扑克牌面值的方法
2015/03/04 Javascript
JavaScript操作cookie类实例
2015/03/31 Javascript
js+css实现文字散开重组动画特效代码分享
2015/08/21 Javascript
解决js页面滚动效果scrollTop在FireFox与Chrome浏览器间的兼容问题的方法
2015/12/03 Javascript
深入理解jQuery事件绑定
2016/06/02 Javascript
JavaScript实现输入框与清空按钮联动效果
2016/09/09 Javascript
原生js实现可拖动的登录框效果
2017/01/21 Javascript
基于jQuery解决ios10以上版本缩放问题
2017/11/03 jQuery
详解IWinter 一个路由转控制器的 Nodejs 库
2017/11/15 NodeJs
在ES5与ES6环境下处理函数默认参数的实现方法
2018/05/13 Javascript
js中Object.defineProperty()方法的不详解
2018/07/09 Javascript
node.js之基础加密算法模块crypto详解
2018/09/11 Javascript
微信小程序自定义导航栏实例代码
2019/04/05 Javascript
如何自动化部署项目?折腾服务器之旅~
2019/04/16 Javascript
python中将\\uxxxx转换为Unicode字符串的方法
2018/09/06 Python
python对html过滤处理的方法
2018/10/21 Python
Python设计模式之原型模式实例详解
2019/01/18 Python
Python+OpenCV图片局部区域像素值处理改进版详解
2019/01/23 Python
python卸载后再次安装遇到的问题解决
2019/07/10 Python
Python 转换文本编码实现解析
2019/08/27 Python
Python Pandas list列表数据列拆分成多行的方法实现
2020/12/14 Python
新加坡交友网站:be2新加坡
2019/04/10 全球购物
火山动力Java笔试题
2014/06/26 面试题
考试作弊被抓检讨书
2014/01/10 职场文书
法学函授自我鉴定
2014/02/06 职场文书
挂科检讨书范文
2014/02/20 职场文书
《理想的风筝》教学反思
2014/04/11 职场文书
端午节活动总结
2014/08/26 职场文书