javascript移动端 电子书 翻页效果实现代码


Posted in Javascript onSeptember 07, 2019

这篇文章主要介绍了javascript移动端 电子书 翻页效果实现代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

效果

javascript移动端 电子书 翻页效果实现代码

1、后端给一长串的纯文本

2、前端根据屏幕的高度,将文本切割为 n 页

3、使用插件 turn.js 将切割好的每页,加上翻书效果

代码

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no">
    <title>手机端书本翻页效果</title>
    <style type="text/css">
      * {
        padding: 0;
        margin: 0;
      }
 
      html,
      body {
        height: 100%;
        width: 100%;
      }
 
      #magazine {
        width: 100%;
        height: 100%;
        position: relative;
        overflow: hidden;
         
      }
 
      #pages {
        width: 100%;
        height: 100%;
        position: relative;
        z-index: 1;
      }
      #pages div.turn-page{
        background: #fff;
      }
      #content{
        height: 0;
        overflow: hidden;
        width: 100%;
      }
      #contentText{
        width: 100%;
      }
       
      /* 这里是内容的样式,修改时候,一起修改 */
      div.turn-page,#contentText{
        white-space: pre-wrap;
        box-sizing: border-box;
        padding: 0 10px;
      }
       
       
      #alert{
        position: absolute;
        bottom: 40px;
        left: 50%;
        transform: translateX(-50%);
        background: rgba(0,0,0,0.6);
        border-radius: 4px;
        color: #fff;
        z-index: 10;
        font-size: 12px;
        padding: 6px 10px;
        display: none;
      }
    </style>
  </head>
  <body>
 
    <div id="magazine">
      <div id="pages"></div>
      <div id="content">
        <div id="contentText"></div>
      </div>
    </div>
    <div id="alert"></div>
    <script type="text/javascript" src="js/jquery-3.3.1.min.js"></script>
    <script type="text/javascript" src="js/turn.js"></script>
     
    <script type="text/javascript">
      var writeStr = ""
       
      //模拟请求文本数据
      $.get("./js/data.txt",function(data){
        initPage(data);
      })
       
 
      function initPage(writeStr){
        if(!writeStr){
          return ;
        }
       
        var $wrap = $("#magazine");
        var $page = $("#pages");
        var w =$page.width(); //窗口的宽度
        var h = $page.height(); //窗口的高度
        console.log(h)
        var $content = $("#contentText");
         
        $content.html(writeStr);
        var len = writeStr.length; //总长度
        var cH = $content.height(); //总高度
        var pageStrNum; //每页大概有多少个字符
        if(cH > h){
          pageStrNum = (h / cH )*len; //每页大概有多少个字符
          var obj = overflowhiddenTow($content,writeStr,h);
          $page.append('<div>'+obj.curr+'</div>');
          while(obj.next && obj.next.length > 0){
            obj = overflowhiddenTow($content, obj.next,h);
            $page.append('<div>'+obj.curr+'</div>');
          }
        }else{
          return ;
        }
         
        //文字切割算法
        function overflowhiddenTow($texts, str , at) {
          var throat = pageStrNum;
          var tempstr = str.substring(0, throat);
          var len = str.length;
          $texts.html(tempstr);
          //取的字节较少,应该增加
          while ($texts.height() < at && throat < len) {
            throat = throat + 2;
            tempstr = str.substring(0, throat);
            $texts.html(tempstr);
          }
          //取的字节较多,应该减少
          while ($texts.height() > at && throat > 0) {
            throat = throat - 2;
            tempstr = str.substring(0, throat);
            $texts.html(tempstr);
          }
           
          return {
            curr:str.substring(0,throat),
            next:str.substring(throat)
          }
         
        }
         
        $page.turn({
          width: w,
          height: h,
          elevation: 50,
          display: 'single',
          gradients: true,
          autoCenter: true,
          when: {
            start: function() {},
            turning: function(e, page, view) {},
            turned: function(e, page, view) {
               
            }
          }
        });
         
         
         
        var moveObj = null;
        var endObj = null;
         
        function getPoint(e) {
          var obj = e;
          if (e.targetTouches && e.targetTouches.length > 0) {
            obj = e.targetTouches[0];
          }
          return obj;
        }
         
         
        $wrap.on("touchstart mousedown", function(e) {
          var obj = getPoint(e);
          moveObj = {
            x: obj.clientX
          };
        });
        $wrap.on("touchmove mousemove", function(e) {
          var obj = getPoint(e);
          endObj = {
            x: obj.clientX
          };
        });
         
         
        $wrap.on("touchend mouseup", function(e) {
          if (moveObj && endObj) {
            var mis = endObj.x - moveObj.x;
            if (Math.abs(mis) > 30) {
              var pageCount = $page.turn("pages"); //总页数
              var currentPage = $page.turn("page"); //当前页
              if (mis > 0) {
                if (currentPage > 1) {
                  $page.turn('page', currentPage - 1);
                } else {
                  console.log("已经是第一页")
                  showAlert('已经是第一页');
                }
              } else {
                if (currentPage < pageCount) {
                  $page.turn('page', currentPage + 1);
                } else {
                  console.log("最后一页");
                  showAlert('已经是最后一页');
                }
              }
         
            }
         
          }
          moveObj = null;
          endObj = null;
        });
         
        var $alert = $("#alert");
        var timer = null;
        function showAlert(msg){
          clearTimeout(timer);
          $alert.text(msg);
          $alert.fadeIn();
          timer = setTimeout(function(){
            $alert.fadeOut();
          },1000)
        }
      }
    </script>
  </body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
让焦点自动跳转
Jul 01 Javascript
JavaScript 模拟类机制及私有变量的方法及思路
Jul 10 Javascript
jquery获取div距离窗口和父级dv的距离示例
Oct 10 Javascript
jsPDF导出pdf示例
May 02 Javascript
Node.js插件的正确编写方式
Aug 03 Javascript
DEDECMS如何为文章添加HOT NEW标志图片
Aug 14 Javascript
快速掌握Node.js模块封装及使用
Mar 21 Javascript
用JS中split方法实现彩色文字背景效果实例
Aug 24 Javascript
js 将线性数据转为树形的示例代码
May 28 Javascript
详解解决小程序中webview页面多层history返回问题
Aug 20 Javascript
基于redis的小程序登录实现方法流程分析
May 25 Javascript
Angular进行简单单元测试的实现方法实例
Aug 16 Javascript
使用 js 简单的实现 bind、call 、aplly代码实例
Sep 07 #Javascript
vue 使用高德地图vue-amap组件过程解析
Sep 07 #Javascript
vue 的 solt 子组件过滤过程解析
Sep 07 #Javascript
javascript的惯性运动实现代码实例
Sep 07 #Javascript
vue的滚动条插件实现代码
Sep 07 #Javascript
微信小程序页面滚动到指定位置代码实例
Sep 07 #Javascript
通过vue写一个瀑布流插件代码实例
Sep 07 #Javascript
You might like
Php Mssql操作简单封装支持存储过程
2009/12/11 PHP
PHP pathinfo()获得文件的路径、名称等信息说明
2011/09/13 PHP
使用PHP备份MySQL和网站发送到邮箱实例代码
2013/11/28 PHP
PHP实现利用MySQL保存session的方法
2014/08/23 PHP
10个实用的脚本代码工具
2010/05/04 Javascript
JS正则表达式大全(整理详细且实用)
2013/11/14 Javascript
javascript获取URL参数与参数值的示例代码
2013/12/20 Javascript
JavaScript判断变量是对象还是数组的方法
2014/08/28 Javascript
javascript实现日期按月份加减
2015/05/15 Javascript
快速掌握Node.js之Window下配置NodeJs环境
2016/03/21 NodeJs
Js删除数组中某一项或几项的几种方法(推荐)
2016/07/27 Javascript
微信小程序 数组中的push与concat的区别
2017/01/05 Javascript
vue组件中点击按钮后修改输入框的状态实例代码
2017/04/14 Javascript
浅谈vue的props,data,computed变化对组件更新的影响
2018/01/16 Javascript
koa+jwt实现token验证与刷新功能
2019/05/30 Javascript
详解node和ES6的模块导出与导入
2020/02/19 Javascript
token 机制和实现方式
2020/12/15 Javascript
在Mac OS系统上安装Python的Pillow库的教程
2015/11/20 Python
Django项目实战之用户头像上传与访问的示例
2018/04/21 Python
python使用PyQt5的简单方法
2019/02/27 Python
Django 表单模型选择框如何使用分组
2019/05/16 Python
python实现植物大战僵尸游戏实例代码
2019/06/10 Python
Pandas操作CSV文件的读写实现方法
2019/11/13 Python
python 并发下载器实现方法示例
2019/11/22 Python
MATLAB数学建模之画图汇总
2020/07/16 Python
英国内衣连锁店:Boux Avenue
2018/01/24 全球购物
Giglio美国站:意大利奢侈品购物网
2018/02/10 全球购物
大二自我鉴定
2014/01/31 职场文书
合作意向书范本
2014/03/31 职场文书
小学教师个人先进事迹材料
2014/05/17 职场文书
市场营销专业应届生自荐信
2014/06/19 职场文书
供用电专业求职信
2014/07/07 职场文书
英文演讲稿开场白
2014/08/25 职场文书
重温入党誓词主持词
2015/06/29 职场文书
科普 | 业余无线电知识-波段篇
2022/02/18 无线电
sql注入报错之注入原理实例解析
2022/06/10 MySQL