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 相关文章推荐
JavaScript中的onerror事件概述及使用
Apr 01 Javascript
JS中eval函数的使用示例
Jul 21 Javascript
JavaScript动态创建link标签到head里的方法
Dec 22 Javascript
JavaScript实现的类字典插入或更新方法实例
Jul 10 Javascript
jquery用ajax方式从后台获取json数据后如何将内容填充到下拉列表
Aug 26 Javascript
Atitit.js的键盘按键事件捆绑and事件调度
Apr 01 Javascript
基于jQuery的Web上传插件Uploadify使用示例
May 19 Javascript
超实用的javascript时间处理总结
Aug 16 Javascript
微信小程序 摇一摇抽奖简单实例实现代码
Jan 09 Javascript
微信{"errcode":48001,"errmsg":"api unauthorized, hints: [ req_id: 1QoCla0699ns81 ]"}
Oct 12 Javascript
vue.js的简单自动求和计算实例
Nov 08 Javascript
vue+elementui 实现新增和修改共用一个弹框的完整代码
Jun 08 Vue.js
使用 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
DISCUZ 论坛管理员密码忘记的解决方法
2009/05/14 PHP
二进制交叉权限微型php类分享
2014/02/07 PHP
PHP快速排序quicksort实例详解
2016/09/28 PHP
JavaScript 给汉字排序实例代码
2008/06/28 Javascript
JavaScript this 深入理解
2009/07/30 Javascript
JS修改css样式style浅谈
2013/05/06 Javascript
一个JavaScript防止表单重复提交的实例
2014/10/21 Javascript
vue实现tab切换外加样式切换方法
2018/03/16 Javascript
vue中axios的封装问题(简易版拦截,get,post)
2018/06/15 Javascript
使用js实现将后台传入的json数据放在前台显示
2018/08/06 Javascript
webpack4 CSS Tree Shaking的使用
2018/09/03 Javascript
angular 用Observable实现异步调用的方法
2018/12/27 Javascript
Vue使用v-viewer实现图片预览
2020/10/21 Javascript
[04:19]DOTA2完美大师赛第四天精彩集锦
2017/11/26 DOTA
python3.5使用tkinter制作记事本
2016/06/20 Python
python获取list下标及其值的简单方法
2016/09/12 Python
Python中extend和append的区别讲解
2019/01/24 Python
python3 pathlib库Path类方法总结
2019/12/26 Python
使用Tensorboard工具查看Loss损失率
2020/02/15 Python
浅谈Python爬虫原理与数据抓取
2020/07/21 Python
新加坡时尚网上购物:Zalora新加坡
2016/07/26 全球购物
英国著名的茶叶品牌:Whittard of Chelsea
2016/09/22 全球购物
Agoda西班牙:全球特价酒店预订
2017/06/03 全球购物
Petmate品牌官方网站:宠物用品
2018/11/25 全球购物
美国电子产品主要品牌的授权在线零售商:DataVision
2019/03/23 全球购物
澳大利亚家庭花园和DIY工具网店:VidaXL
2019/05/03 全球购物
会计电算化专业毕业生推荐信
2013/12/24 职场文书
期末学生评语大全
2014/04/24 职场文书
教师节演讲稿
2014/05/06 职场文书
奶茶店创业计划书
2014/08/14 职场文书
导游词之镇江焦山
2019/11/21 职场文书
Nginx开启Brotli压缩算法实现过程详解
2021/03/31 Servers
canvas多重阴影发光效果实现
2021/04/20 Javascript
web前端之css水平居中代码解析
2021/05/20 HTML / CSS
Pytorch DataLoader shuffle验证方式
2021/06/02 Python
JS封装cavans多种滤镜组件
2022/02/15 Javascript