基于Turn.js 實(shí)現(xiàn)翻書效果實(shí)例解析
最近項(xiàng)目經(jīng)理我個(gè)項(xiàng)目練練手,其項(xiàng)目需求是要實(shí)現(xiàn)翻書效果,看到這個(gè)需求后,我真是懵了,這咋整,我可是java出身的啊,這個(gè)問題真是難住我了,后來有同事的指導(dǎo),之前他曾經(jīng)做過PC版的翻書效果,當(dāng)時(shí)使用的是Turn.js ,查過其相關(guān)API后,整個(gè)人突然豁然開朗呀,使用Turn.js 完全可以解決當(dāng)前我接手這個(gè)項(xiàng)目的所有需求呀。下面小編把我的學(xué)習(xí)心得分享給大家,大家可以參考下
Turn.js的官方網(wǎng)址: http://www.turnjs.com/
下面是我這個(gè)項(xiàng)目上線后的效果:
看過實(shí)際項(xiàng)目后,各位看官是不是已經(jīng)迫不及待的想知道這個(gè)項(xiàng)目是如何實(shí)現(xiàn),看官莫急,接下來我就詳細(xì)的介紹下我的開發(fā)過程:
1、需要引入的腳本文件
<link rel="stylesheet" type="text/css" href="css/basic.css"/> <script type="text/javascript" src="js/jquery.js"></script> <script type="text/javascript" src="js/modernizr.2.5.3.min.js"></script> <script type="text/javascript" src="js/main.js"></script>
2、html部分代碼
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome="/> <meta name="viewport" content="width=device-width, initial-scale=., user-scalable=no"/> <meta name="format-detection" content="telephone=no"> <meta name="apple-mobile-web-app-capable" content="yes"/> <meta name="apple-mobile-web-app-status-bar-style" content="black"/> <title>Turn.js 實(shí)現(xiàn)翻書效果</title> <link rel="stylesheet" type="text/css" href="css/basic.css"/> <script type="text/javascript" src="js/jquery.js"></script> <script type="text/javascript" src="js/modernizr.2.5.3.min.js"></script> <script type="text/javascript" src="js/main.js"></script> </head> <body> <div class="shade"> <div class="sk-fading-circle"> <div class="sk-circle1 sk-circle"></div> <div class="sk-circle2 sk-circle"></div> <div class="sk-circle3 sk-circle"></div> <div class="sk-circle4 sk-circle"></div> <div class="sk-circle5 sk-circle"></div> <div class="sk-circle6 sk-circle"></div> <div class="sk-circle7 sk-circle"></div> <div class="sk-circle8 sk-circle"></div> <div class="sk-circle9 sk-circle"></div> <div class="sk-circle10 sk-circle"></div> <div class="sk-circle11 sk-circle"></div> <div class="sk-circle12 sk-circle"></div> </div> <div class="number"></div> </div> <div class="flipbook-viewport" style="display:none;"> <div class="previousPage"></div> <div class="nextPage"></div> <div class="return"></div> <img class="btnImg" src="./image/btn.gif" style="display: none"/> <div class="container"> <div class="flipbook"> </div> </div> </div> <script> //自定義仿iphone彈出層 (function ($) { //ios confirm box jQuery.fn.confirm = function (title, option, okCall, cancelCall) { var defaults = { title: null, //what text cancelText: '取消', //the cancel btn text okText: '確定' //the ok btn text }; if (undefined === option) { option = {}; } if ('function' != typeof okCall) { okCall = $.noop; } if ('function' != typeof cancelCall) { cancelCall = $.noop; } var o = $.extend(defaults, option, {title: title, okCall: okCall, cancelCall: cancelCall}); var $dom = $(this); var dom = $('<div class="g-plugin-confirm">'); var dom = $('<div>').appendTo(dom); var dom_content = $('<div>').html(o.title).appendTo(dom); var dom_btn = $('<div>').appendTo(dom); var btn_cancel = $('<a href="#"></a>').html(o.cancelText).appendTo(dom_btn); var btn_ok = $('<a href="#"></a>').html(o.okText).appendTo(dom_btn); btn_cancel.on('click', function (e) { o.cancelCall(); dom.remove(); e.preventDefault(); }); btn_ok.on('click', function (e) { o.okCall(); dom.remove(); e.preventDefault(); }); dom.appendTo($('body')); return $dom; }; })(jQuery); //上一頁 $(".previousPage").bind("touchend", function () { var pageCount = $(".flipbook").turn("pages");//總頁數(shù) var currentPage = $(".flipbook").turn("page");//當(dāng)前頁 if (currentPage >= 2) { $(".flipbook").turn('page', currentPage - 1); } else { } }); // 下一頁 $(".nextPage").bind("touchend", function () { var pageCount = $(".flipbook").turn("pages");//總頁數(shù) var currentPage = $(".flipbook").turn("page");//當(dāng)前頁 if (currentPage <= pageCount) { $(".flipbook").turn('page', currentPage + 1); } else { } }); //返回到目錄頁 $(".return").bind("touchend", function () { $(document).confirm('您確定要返回首頁嗎?', {}, function () { $(".flipbook").turn('page', ); //跳轉(zhuǎn)頁數(shù) }, function () { }); }); </script> </body> </html>
3、主要js實(shí)現(xiàn)部分
//判斷手機(jī)類型 window.onload = function () { //alert($(window).height()); var u = navigator.userAgent; if (u.indexOf('Android') > -1 || u.indexOf('Linux') > -1) {//安卓手機(jī) } else if (u.indexOf('iPhone') > -1) {//蘋果手機(jī) //屏蔽ios下上下彈性 $(window).on('scroll.elasticity', function (e) { e.preventDefault(); }).on('touchmove.elasticity', function (e) { e.preventDefault(); }); } else if (u.indexOf('Windows Phone') > -1) {//winphone手機(jī) } //預(yù)加載 loading(); } var date_start; var date_end; date_start = getNowFormatDate(); //加載圖片 var loading_img_url = [ "./image/0001.jpg", "./image/0002.jpg", "./image/0003.jpg", "./image/0004.jpg", "./image/0005.jpg", "./image/0006.jpg", "./image/0007.jpg", "./image/0008.jpg", "./image/0009.jpg", "./image/0010.jpg", "./image/0011.jpg", "./image/0012.jpg", "./image/0013.jpg", "./image/0014.jpg", "./image/0015.jpg", "./image/0016.jpg", "./image/0017.jpg", "./image/0018.jpg", "./image/0019.jpg", "./image/0020.jpg", "./image/0021.jpg", "./image/0022.jpg", "./image/0023.jpg", "./image/0024.jpg", "./image/0025.jpg", "./image/0026.jpg", "./image/0027.jpg", "./image/0028.jpg", "./image/0029.jpg", "./image/0030.jpg", "./image/0031.jpg", "./image/0032.jpg", "./image/0033.jpg", "./image/0034.jpg", "./image/0035.jpg", "./image/0036.jpg", "./image/0037.jpg", "./image/0038.jpg", "./image/0039.jpg", "./image/0040.jpg", "./image/0041.jpg", ]; //加載頁面 function loading() { var numbers = 0; var length = loading_img_url.length for (var i = 0; i < length; i++) { var img = new Image(); img.src = loading_img_url[i]; img.onerror = function () { numbers += (1 / length) * 100; } img.onload = function () { numbers += (1 / length) * 100; $('.number').html(parseInt(numbers) + "%"); console.log(numbers); if (Math.round(numbers) == 100) { //$('.number').hide(); date_end = getNowFormatDate(); var loading_time = date_end - date_start; //預(yù)加載圖片 $(function progressbar() { //拼接圖片 $('.shade').hide(); var tagHtml = ""; for (var i = 1; i <= 41; i++) { if (i == 1) { tagHtml += ' <div id="first" style="background:url(image/00' + (i < 10 ? '0' + i : i) + '.jpg) center top no-repeat;background-size:100%"></div>'; } else if (i == 41) { tagHtml += ' <div id="end" style="background:url(image/00' + (i < 10 ? '0' + i : i) + '.jpg) center top no-repeat;background-size:100%"></div>'; } else { tagHtml += ' <div style="background:url(image/00' + (i < 10 ? '0' + i : i) + '.jpg) center top no-repeat;background-size:100%"></div>'; } } $(".flipbook").append(tagHtml); var w = $(".graph").width(); $(".flipbook-viewport").show(); }); //配置turn.js function loadApp() { var w = $(window).width(); var h = $(window).height(); $('.flipboox').width(w).height(h); $(window).resize(function () { w = $(window).width(); h = $(window).height(); $('.flipboox').width(w).height(h); }); $('.flipbook').turn({ // Width width: w, // Height height: h, // Elevation elevation: , display: 'single', // Enable gradients gradients: true, // Auto center this flipbook autoCenter: true, when: { turning: function (e, page, view) { if (page == ) { $(".btnImg").css("display", "none"); $(".mark").css("display", "block"); } else { $(".btnImg").css("display", "block"); $(".mark").css("display", "none"); } if (page == 41) { $(".nextPage").css("display", "none"); } else { $(".nextPage").css("display", "block"); } }, turned: function (e, page, view) { console.log(page); var total = $(".flipbook").turn("pages");//總頁數(shù) if (page == 1) { $(".return").css("display", "none"); $(".btnImg").css("display", "none"); } else { $(".return").css("display", "block"); $(".btnImg").css("display", "block"); } if (page == 2) { $(".catalog").css("display", "block"); } else { $(".catalog").css("display", "none"); } } } }) } yepnope({ test: Modernizr.csstransforms, yep: ['js/turn.js'], complete: loadApp }); } ; } } } function getNowFormatDate() { var date = new Date(); var seperator1 = ""; var seperator2 = ""; var month = date.getMonth() + ; var strDate = date.getDate(); if (month >= 1 && month <= 9) { month = "0" + month; } if (strDate >= 0 && strDate <= 9) { strDate = "0" + strDate; } var currentdate = date.getFullYear() + seperator + month + seperator + strDate + "" + date.getHours() + seperator2 + date.getMinutes() + seperator2 + date.getSeconds(); return currentdate; }
4、最終實(shí)現(xiàn)結(jié)果
腳本之家友情提醒大家需要注意事項(xiàng):圖片是從網(wǎng)上隨便下載的,所以圖片的尺寸不規(guī)范,導(dǎo)致在手機(jī)上瀏覽時(shí)圖片不是很完整【不是因?yàn)榇a寫的有問題哦】 !!! 代碼打包中沒有加入真實(shí)項(xiàng)目中的圖片,如需看到最佳的效果,建議圖片尺寸設(shè)計(jì)為:750*1217,由于個(gè)人的時(shí)間和精力有限,我寫的這個(gè)Demo使用的圖片就沒有將圖片一一修改為750*1217的尺寸。
5、代碼打包 下載
http://xiazai.jb51.net/201605/yuanma/Turn.js 實(shí)現(xiàn)翻書效果(jb51.net).rar
相關(guān)文章
javascript讓setInteval里的函數(shù)參數(shù)中的this指向特定的對(duì)象
話說阿里巴巴今年的校園招聘有一道題目考了一個(gè)知識(shí)點(diǎn),那就是setInterval的參數(shù)函數(shù)里的this指向.2010-01-01Textarea輸入字?jǐn)?shù)限制實(shí)例(兼容iOS&安卓)
下面小編就為大家?guī)硪黄猅extarea輸入字?jǐn)?shù)限制實(shí)例(兼容iOS&安卓)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07前端點(diǎn)擊預(yù)覽圖片Viewer.js使用方法(簡(jiǎn)單的操作)
這篇文章主要介紹了前端點(diǎn)擊預(yù)覽圖片Viewer.js使用的相關(guān)資料,Viewer.js是一款強(qiáng)大的圖片查看器,支持移動(dòng)設(shè)備觸摸事件、響應(yīng)式、放大/縮小、旋轉(zhuǎn)、翻轉(zhuǎn)、移動(dòng)、鍵盤操作、全屏幻燈片模式、縮略圖和標(biāo)題顯示等功能,需要的朋友可以參考下2025-01-01bootstrap table.js動(dòng)態(tài)填充單元格數(shù)據(jù)的多種方法
這篇文章主要為大家詳細(xì)介紹了bootstrap table.js填充單元格數(shù)據(jù)的多種方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07JS實(shí)現(xiàn)微信彈出搜索框 多條件查詢功能
這篇文章主要介紹了JS實(shí)現(xiàn)微信彈出搜索框 多條件查詢功能的實(shí)例代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-12-12JS實(shí)現(xiàn)“全選”和"全不選"功能代碼實(shí)例
這篇文章主要介紹了JS實(shí)現(xiàn)“全選”和"全不選"功能代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02JS倒計(jì)時(shí)實(shí)例_天時(shí)分秒
下面小編就為大家?guī)硪黄狫S倒計(jì)時(shí)實(shí)例_天時(shí)分秒。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08Immutable 在 JavaScript 中的應(yīng)用
在 JavaScript 中,對(duì)象是引用類型的數(shù)據(jù),其優(yōu)點(diǎn)在于頻繁的修改對(duì)象時(shí)都是在原對(duì)象的基礎(chǔ)上修改,并不需要重新創(chuàng)建,這樣可以有效的利用內(nèi)存,不會(huì)造成內(nèi)存空間的浪費(fèi),對(duì)象的這種特性可以稱之為 Mutable,中文的字面意思是「可變」2016-05-05