• Turn.js 实现翻书效果的学习与总结


         最近CTO给我分配了一个移动端H5开发的任务,主要功能是需要实现翻书效果,我听过主要需求后,当时是呀!!!接下来自己尝试使用 fullPage.jsSwiper来实现翻书效果,结果效果都不是非常的理想,后来想起自己曾经做过PC版的翻书效果,当时使用的是Turn.js ,查过其相关API后,整个人突然豁然开朗呀,使用Turn.js 完全可以解决当前我接手这个项目的所有需求呀。现在将个人的学习总结如下,若有不正确的地方,欢迎读者给与批评指正! 

         Turn.js的官方网址: http://www.turnjs.com/

         下面是我这个项目上线后的效果:

          

          看过实际项目后,各位看官是不是已经迫不及待的想知道这个项目是如何实现,看官莫急,接下来我就详细的介绍下我的开发过程:

          1、需要引入的脚本文件      

    1 <link rel="stylesheet" type="text/css" href="css/basic.css"/>
    2 <script type="text/javascript" src="js/jquery.js"></script>
    3 <script type="text/javascript" src="js/modernizr.2.5.3.min.js"></script>
    4 <script type="text/javascript" src="js/main.js"></script>

         2、html部分代码

      1 <!DOCTYPE html>
      2 <html>
      3 <head>
      4     <meta charset="utf-8">
      5     <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/>
      6     <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no"/>
      7     <meta name="format-detection" content="telephone=no">
      8     <meta name="apple-mobile-web-app-capable" content="yes"/>
      9     <meta name="apple-mobile-web-app-status-bar-style" content="black"/>
     10     <title>Turn.js 实现翻书效果</title>
     11     <link rel="stylesheet" type="text/css" href="css/basic.css"/>
     12     <script type="text/javascript" src="js/jquery.js"></script>
     13     <script type="text/javascript" src="js/modernizr.2.5.3.min.js"></script>
     14     <script type="text/javascript" src="js/main.js"></script>
     15 </head>
     16 <body>
     17 <div class="shade">
     18     <div class="sk-fading-circle">
     19         <div class="sk-circle1 sk-circle"></div>
     20         <div class="sk-circle2 sk-circle"></div>
     21         <div class="sk-circle3 sk-circle"></div>
     22         <div class="sk-circle4 sk-circle"></div>
     23         <div class="sk-circle5 sk-circle"></div>
     24         <div class="sk-circle6 sk-circle"></div>
     25         <div class="sk-circle7 sk-circle"></div>
     26         <div class="sk-circle8 sk-circle"></div>
     27         <div class="sk-circle9 sk-circle"></div>
     28         <div class="sk-circle10 sk-circle"></div>
     29         <div class="sk-circle11 sk-circle"></div>
     30         <div class="sk-circle12 sk-circle"></div>
     31     </div>
     32     <div class="number"></div>
     33 </div>
     34 <div class="flipbook-viewport" style="display:none;">
     35     <div class="previousPage"></div>
     36     <div class="nextPage"></div>
     37     <div class="return"></div>
     38     <img class="btnImg" src="./image/btn.gif" style="display: none"/>
     39     <div class="container">
     40         <div class="flipbook">
     41         </div>
     42     </div>
     43 </div>
     44 <script>
     45     //自定义仿iphone弹出层
     46     (function ($) {
     47         //ios confirm box
     48         jQuery.fn.confirm = function (title, option, okCall, cancelCall) {
     49             var defaults = {
     50                 title: null, //what text
     51                 cancelText: '取消', //the cancel btn text
     52                 okText: '确定' //the ok btn text
     53             };
     54 
     55             if (undefined === option) {
     56                 option = {};
     57             }
     58             if ('function' != typeof okCall) {
     59                 okCall = $.noop;
     60             }
     61             if ('function' != typeof cancelCall) {
     62                 cancelCall = $.noop;
     63             }
     64 
     65             var o = $.extend(defaults, option, {title: title, okCall: okCall, cancelCall: cancelCall});
     66 
     67             var $dom = $(this);
     68 
     69             var dom = $('<div class="g-plugin-confirm">');
     70             var dom1 = $('<div>').appendTo(dom);
     71             var dom_content = $('<div>').html(o.title).appendTo(dom1);
     72             var dom_btn = $('<div>').appendTo(dom1);
     73             var btn_cancel = $('<a href="#"></a>').html(o.cancelText).appendTo(dom_btn);
     74             var btn_ok = $('<a href="#"></a>').html(o.okText).appendTo(dom_btn);
     75             btn_cancel.on('click', function (e) {
     76                 o.cancelCall();
     77                 dom.remove();
     78                 e.preventDefault();
     79             });
     80             btn_ok.on('click', function (e) {
     81                 o.okCall();
     82                 dom.remove();
     83                 e.preventDefault();
     84             });
     85 
     86             dom.appendTo($('body'));
     87             return $dom;
     88         };
     89     })(jQuery);
     90 
     91     //上一页
     92     $(".previousPage").bind("touchend", function () {
     93         var pageCount = $(".flipbook").turn("pages");//总页数
     94         var currentPage = $(".flipbook").turn("page");//当前页
     95         if (currentPage >= 2) {
     96             $(".flipbook").turn('page', currentPage - 1);
     97         } else {
     98         }
     99     });
    100     // 下一页
    101     $(".nextPage").bind("touchend", function () {
    102         var pageCount = $(".flipbook").turn("pages");//总页数
    103         var currentPage = $(".flipbook").turn("page");//当前页
    104         if (currentPage <= pageCount) {
    105             $(".flipbook").turn('page', currentPage + 1);
    106         } else {
    107         }
    108     });
    109     //返回到目录页
    110     $(".return").bind("touchend", function () {
    111         $(document).confirm('您确定要返回首页吗?', {}, function () {
    112             $(".flipbook").turn('page', 1); //跳转页数
    113         }, function () {
    114         });
    115     });
    116 </script>
    117 </body>
    118 </html>
    View Code

         3、主要js实现部分

      1 /**
      2  * Created by ChengYa on 2016/6/18.
      3  */
      4 
      5 //判断手机类型
      6 window.onload = function () {
      7     //alert($(window).height());
      8     var u = navigator.userAgent;
      9     if (u.indexOf('Android') > -1 || u.indexOf('Linux') > -1) {//安卓手机
     10     } else if (u.indexOf('iPhone') > -1) {//苹果手机
     11         //屏蔽ios下上下弹性
     12         $(window).on('scroll.elasticity', function (e) {
     13             e.preventDefault();
     14         }).on('touchmove.elasticity', function (e) {
     15             e.preventDefault();
     16         });
     17     } else if (u.indexOf('Windows Phone') > -1) {//winphone手机
     18     }
     19     //预加载
     20     loading();
     21 }
     22 
     23 var date_start;
     24 var date_end;
     25 date_start = getNowFormatDate();
     26 //加载图片
     27 var loading_img_url = [
     28     "./image/0001.jpg",
     29     "./image/0002.jpg",
     30     "./image/0003.jpg",
     31     "./image/0004.jpg",
     32     "./image/0005.jpg",
     33     "./image/0006.jpg",
     34     "./image/0007.jpg",
     35     "./image/0008.jpg",
     36     "./image/0009.jpg",
     37     "./image/0010.jpg",
     38     "./image/0011.jpg",
     39     "./image/0012.jpg",
     40     "./image/0013.jpg",
     41     "./image/0014.jpg",
     42     "./image/0015.jpg",
     43     "./image/0016.jpg",
     44     "./image/0017.jpg",
     45     "./image/0018.jpg",
     46     "./image/0019.jpg",
     47     "./image/0020.jpg",
     48     "./image/0021.jpg",
     49     "./image/0022.jpg",
     50     "./image/0023.jpg",
     51     "./image/0024.jpg",
     52     "./image/0025.jpg",
     53     "./image/0026.jpg",
     54     "./image/0027.jpg",
     55     "./image/0028.jpg",
     56     "./image/0029.jpg",
     57     "./image/0030.jpg",
     58     "./image/0031.jpg",
     59     "./image/0032.jpg",
     60     "./image/0033.jpg",
     61     "./image/0034.jpg",
     62     "./image/0035.jpg",
     63     "./image/0036.jpg",
     64     "./image/0037.jpg",
     65     "./image/0038.jpg",
     66     "./image/0039.jpg",
     67     "./image/0040.jpg",
     68     "./image/0041.jpg",
     69 ];
     70 
     71 //加载页面
     72 function loading() {
     73     var numbers = 0;
     74     var length = loading_img_url.length;
     75 
     76     for (var i = 0; i < length; i++) {
     77         var img = new Image();
     78         img.src = loading_img_url[i];
     79         img.onerror = function () {
     80             numbers += (1 / length) * 100;
     81         }
     82         img.onload = function () {
     83             numbers += (1 / length) * 100;
     84             $('.number').html(parseInt(numbers) + "%");
     85             console.log(numbers);
     86             if (Math.round(numbers) == 100) {
     87                 //$('.number').hide();
     88                 date_end = getNowFormatDate();
     89                 var loading_time = date_end - date_start;
     90                 //预加载图片
     91                 $(function progressbar() {
     92                     //拼接图片
     93                     $('.shade').hide();
     94                     var tagHtml = "";
     95                     for (var i = 1; i <= 41; i++) {
     96                         if (i == 1) {
     97                             tagHtml += ' <div id="first" style="background:url(image/00' + (i < 10 ? '0' + i : i) + '.jpg) center top no-repeat;background-size:100%"></div>';
     98                         } else if (i == 41) {
     99                             tagHtml += ' <div id="end" style="background:url(image/00' + (i < 10 ? '0' + i : i) + '.jpg) center top no-repeat;background-size:100%"></div>';
    100                         } else {
    101                             tagHtml += ' <div style="background:url(image/00' + (i < 10 ? '0' + i : i) + '.jpg) center top no-repeat;background-size:100%"></div>';
    102                         }
    103                     }
    104                     $(".flipbook").append(tagHtml);
    105                     var w = $(".graph").width();
    106                     $(".flipbook-viewport").show();
    107                 });
    108                 //配置turn.js
    109                 function loadApp() {
    110                     var w = $(window).width();
    111                     var h = $(window).height();
    112                     $('.flipboox').width(w).height(h);
    113                     $(window).resize(function () {
    114                         w = $(window).width();
    115                         h = $(window).height();
    116                         $('.flipboox').width(w).height(h);
    117                     });
    118                     $('.flipbook').turn({
    119                         // Width
    120                          w,
    121                         // Height
    122                         height: h,
    123                         // Elevation
    124                         elevation: 50,
    125                         display: 'single',
    126                         // Enable gradients
    127                         gradients: true,
    128                         // Auto center this flipbook
    129                         autoCenter: true,
    130                         when: {
    131                             turning: function (e, page, view) {
    132                                 if (page == 1) {
    133                                     $(".btnImg").css("display", "none");
    134                                     $(".mark").css("display", "block");
    135                                 } else {
    136                                     $(".btnImg").css("display", "block");
    137                                     $(".mark").css("display", "none");
    138                                 }
    139                                 if (page == 41) {
    140                                     $(".nextPage").css("display", "none");
    141                                 } else {
    142                                     $(".nextPage").css("display", "block");
    143                                 }
    144                             },
    145                             turned: function (e, page, view) {
    146                                 console.log(page);
    147                                 var total = $(".flipbook").turn("pages");//总页数
    148                                 if (page == 1) {
    149                                     $(".return").css("display", "none");
    150                                     $(".btnImg").css("display", "none");
    151                                 } else {
    152                                     $(".return").css("display", "block");
    153                                     $(".btnImg").css("display", "block");
    154                                 }
    155                                 if (page == 2) {
    156                                     $(".catalog").css("display", "block");
    157                                 } else {
    158                                     $(".catalog").css("display", "none");
    159                                 }
    160                             }
    161                         }
    162                     })
    163                 }
    164                 yepnope({
    165                     test: Modernizr.csstransforms,
    166                     yep: ['js/turn.js'],
    167                     complete: loadApp
    168                 });
    169             }
    170             ;
    171         }
    172     }
    173 }
    174 
    175 function getNowFormatDate() {
    176     var date = new Date();
    177     var seperator1 = "";
    178     var seperator2 = "";
    179     var month = date.getMonth() + 1;
    180     var strDate = date.getDate();
    181     if (month >= 1 && month <= 9) {
    182         month = "0" + month;
    183     }
    184     if (strDate >= 0 && strDate <= 9) {
    185         strDate = "0" + strDate;
    186     }
    187     var currentdate = date.getFullYear() + seperator1 + month + seperator1 + strDate
    188         + "" + date.getHours() + seperator2 + date.getMinutes()
    189         + seperator2 + date.getSeconds();
    190     return currentdate;
    191 }
    View Code

         4、最终实现结果

     

    注:图片是从网上随便下载的,所以图片的尺寸不规范,导致在手机上浏览时图片不是很完整【不是因为代码写的有问题哦】 !!! 代码打包中没有加入真实项目中的图片,如需看到最佳的效果,建议图片尺寸设计为:750*1217,由于个人的时间和精力有限,我写的这个Demo使用的图片就没有将图片一一修改为750*1217的尺寸。

           5、代码打包 下载

    链接: http://pan.baidu.com/s/1o7T1qjw 密码: chpx
  • 相关阅读:
    获取Spring容器中的Bean
    Log4j 配置 的webAppRootKey参数问题
    关于Eclipse项目中加入jquery.js文件报错(missing semicolon)问题
    SSO(单点登录)
    MySQL拷贝表的几种方式
    Maven的简介
    Maven 的41种骨架功能介绍
    Intellij IDEA 快捷键大全
    nginx基本配置与参数说明
    MYSQL和ORACLE的一些区别
  • 原文地址:https://www.cnblogs.com/chenyablog/p/5596119.html
Copyright © 2020-2023  润新知