当前位置:   article > 正文

uniapp app端运用renderjs使用turnjs,打造电子书仿真翻书效果_uniapp翻页效果

uniapp翻页效果

1、首先:

renderjs是一个运行在视图层的js。它比​​​WXS更加强大。它只支持app-vue和web。

turn.js官网在这里:  Turn.js: The page flip effect in HTML5

如果只是单纯的H5端引入turnjs,是不需要用renderjs的,但是我的项目因为是在app端,就得用到renderjs

我们可以这样理解,uniapp是一个大圆,renderjs就是大圆中的小圆,那么turnjs就住在这个小圆里,我们把这个小圆叫做视图层,大圆叫做逻辑层

2、基本实现思路:

2.1、第一步先确定renderjs和uniapp的数据通信方式,完成了数据通信,才可以针对turnjs的配置项,做些uniapp自己的逻辑层的操作。

renderjs使用方式可以查阅官网,直接介绍如何通信,

2.1.1、逻辑层向视图层传递数据:

  1. <view class="flipbook-viewport"
  2. :rect="rect"
  3. :change:rect="updateRenderData"
  4. >
  5. <view class="container" >
  6. <view class="flipbook" id="flipbook" >
  7. ------------
  8. </view>
  9. </view>
  10. </view>

 rect是逻辑层对应的属性或者方法,当值改变时,就会触发视图层对应的逻辑操作。rect可以改成自己任意名字,逻辑操作的名字也可以改成自己任意的,可成对添加多个。

2.1.2视图层向逻辑层的通信:

这部分操作必须在dom上绑定相应的主动触发事件,比如,touchend、click才可以触发,例如:

  1. <view class="flipbook-viewport"
  2. :rect="rect"
  3. :change:rect="updateRenderData"
  4. @touchend="turnjs.onClick"
  5. >
  6. <view class="container" >
  7. <view class="flipbook" id="flipbook" >
  8. <div class='hard'></div>
  9. </view>
  10. </view>
  11. </view>
  1. <script> // 逻辑层的js
  2. import '@/utils/jquery.min.1.7.js';
  3. import turn from '@/utils/turn.js';
  4. export default {
  5. computed: {
  6. rect() {
  7. return {
  8. width: this.width,
  9. height: this.height
  10. }
  11. }
  12. },
  13. methods:{
  14. // 接收renderjs发回的数据
  15. onViewClick(options) {
  16. console.log('renderjsCall回调');
  17. console.log(options);
  18. },
  19. }
  20. }
  21. </script>
  22. <script lang="renderjs" module="turnjs">
  23. // 视图层的js
  24. import '@/utils/jquery.min.1.7.js';
  25. import turn from '@/utils/turn.js';
  26. export default {
  27. data() {
  28. return {
  29. width: '',
  30. height: ''
  31. }
  32. },
  33. mounted() {
  34. this.onTurn();
  35. },
  36. methods: {
  37. onClick(event, ownerInstance) {
  38. // 操作内容
  39. ownerInstance.callMethod('onViewClick', {
  40. curpage: 0
  41. })
  42. },
  43. onTurn() {
  44. $("#flipbook").turn({
  45. autoCenter: true,
  46. display: 'single',
  47. height: this.height,
  48. width: this.width,
  49. elevation: 50,
  50. duration:500,
  51. gradients: true,
  52. when: {
  53. turning: function(event, page, pageObject) {
  54. // 翻页时
  55. }, }
  56. });
  57. }
  58. }
  59. }
  60. </script>

通过@touchend="turnjs.onClick 来主动发起视图层的逻辑,然后逻辑内部通过ownerInstance.callMethod传递数据到逻辑层,“onViewClick”,就是逻辑层内接收数据的函数,然后进行一系列的操作就好了。

3、说一下turnjs的注意事项,官方的css样式贴出来,我的项目中,引入情况不生效,所以就写到文件里了。

  1. .flipbook-viewport{overflow:hidden;width:100%;height:100%;.container{display: flex;justify-content: center;align-items: center;margin: 0 auto;}.flipbook ::v-deep .page{background-color: white;background-repeat: no-repeat;background-size: 100% 100%;-webkit-box-shadow:0 0 20px rgba(0,0,0,0.2);-moz-box-shadow:0 0 20px rgba(0,0,0,0.2);-ms-box-shadow:0 0 20px rgba(0,0,0,0.2);-o-box-shadow:0 0 20px rgba(0,0,0,0.2);box-shadow:0 0 20px rgba(0,0,0,0.2);img {-webkit-touch-callout: none;-webkit-user-select: none;-khtml-user-select: none;-moz-user-select: none;-ms-user-select: none;user-select: none;margin:0;}}.shadow{-webkit-transition: -webkit-box-shadow 0.5s;-moz-transition: -moz-box-shadow 0.5s;-o-transition: -webkit-box-shadow 0.5s;-ms-transition: -ms-box-shadow 0.5s;-webkit-box-shadow:0 0 20px #ccc;-moz-box-shadow:0 0 20px #ccc;-o-box-shadow:0 0 20px #ccc;-ms-box-shadow:0 0 20px #ccc;box-shadow:0 0 20px #ccc;}
  2. }

同时我发现了一个现象,如果的page内容可以写死,那就简单太多,直接在常规的data里面定义数组,在dom中去渲染就好。page中的内容如果是动态的,会因为初始化的问题无法启动turn,所以我在最开始就添加了第一页的内容,保证能启动turnjs,应该是还有更好的办法,我没有想到。

  1. <view class="flipbook" id="flipbook" >
  2. <div class='hard'></div>
  3. </view>

然后通过renderjs里面添加内容的监听,如果内容有改变,就添加页面

  1. updateSimulationText(newVal, oldVal) { //renderjs里面的操作
  2. $("#flipbook").turn('pages',1) // 内容变化时,保留1页
  3. $("#flipbook").turn('pages',newVal.arr.length) // 添加数组长度的页数
  4. for (var i=0; i<newVal.arr.length;i++) {
  5. var tagHtml = "";
  6. tagHtml = "<div></div>"; // 一个page的内容
  7. if (!$("#flipbook").turn('hasPage', i+2)) {
  8. // Create an element for this page
  9. var element = $('<div />').html('');
  10. // Add the page
  11. $("#flipbook").turn('addPage', element, i+2);
  12. element.html(tagHtml);
  13. }
  14. }
  15. },

项目中的实际逻辑是,当turnjs翻页是,要通知逻辑层page+1,turnjs换章节时,要通知逻辑层获取指定章节的内容,但是通信的思路跟上面的提到的相同,就不再赘述了。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/117242
推荐阅读
相关标签
  

闽ICP备14008679号