offcanvas-drag-right-plus-main.html 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>Hello MUI</title>
  6. <meta name="viewport" content="width=device-width, initial-scale=1,maximum-scale=1,user-scalable=no">
  7. <meta name="apple-mobile-web-app-capable" content="yes">
  8. <meta name="apple-mobile-web-app-status-bar-style" content="black">
  9. <link rel="stylesheet" href="../css/mui.min.css">
  10. <style>
  11. html,
  12. body {
  13. background-color: #efeff4;
  14. }
  15. p {
  16. text-indent: 22px;
  17. }
  18. span.mui-icon {
  19. font-size: 14px;
  20. color: #007aff;
  21. margin-left: -15px;
  22. padding-right: 10px;
  23. }
  24. </style>
  25. </head>
  26. <body>
  27. <header class="mui-bar mui-bar-nav">
  28. <a class="mui-action-menu mui-icon mui-icon-bars mui-pull-left"></a>
  29. <a class="mui-action-back mui-btn mui-btn-link mui-pull-right">关闭</a>
  30. <h1 class="mui-title">off canvas(侧滑导航)</h1>
  31. </header>
  32. <div class="mui-content">
  33. <div class="mui-content-padded">
  34. <p>这是webview模式右滑导航示例,主页面和菜单在不同的webview中,
  35. 优点是支持菜单内容在多页面的复用,缺点是不支持拖动手势(跟手);
  36. 当前页面为主界面,你可以在主界面放置任何内容;
  37. 打开侧滑菜单有多种方式:
  38. 1、在当前页面快速向右滑动(swipe);
  39. 2、点击页面左上角的
  40. <span class="mui-icon mui-icon-bars"></span> 图标;
  41. 3、通过JS API触发(例如点击如下蓝色按钮体验);
  42. <span class="android-only">4、Android手机按menu键;</span>
  43. </p>
  44. <p style="padding: 5px 20px;margin-bottom: 5px;">
  45. <button id="show-btn" type="button" class="mui-btn mui-btn-primary mui-btn-block" style="padding: 10px;">
  46. 显示侧滑菜单
  47. </button>
  48. </p>
  49. <p >侧滑菜单的移动动画,支持多种效果,切换如下选项体验不同动画效果:</p>
  50. </div>
  51. <form class="mui-input-group" style="margin-bottom: 15px;">
  52. <div class="mui-input-row mui-radio">
  53. <label>主界面移动、菜单不动</label>
  54. <input name="style" type="radio" checked="" value="main-move">
  55. </div>
  56. <div class="mui-input-row mui-radio">
  57. <label>主界面不动、菜单移动</label>
  58. <input name="style" type="radio" value="menu-move">
  59. </div>
  60. <div class="mui-input-row mui-radio mui-hidden" id="move-togger">
  61. <label>整体移动</label>
  62. <input name="style" type="radio" value="all-move">
  63. </div>
  64. </form>
  65. </div>
  66. </body>
  67. <script src="../js/mui.min.js"></script>
  68. <script>
  69. var main,menu, mask = mui.createMask(_closeMenu);
  70. var showMenu = false,mode = 'main-move';
  71. if (!mui.os.android) {
  72. //整体滑动暂不支持android手机,因为两个页面的移动动画,无法保证同步性;
  73. document.getElementById("move-togger").classList.remove('mui-hidden');
  74. var spans = document.querySelectorAll('.android-only');
  75. for (var i=0,len=spans.length;i<len;i++) {
  76. spans[i].style.display = "none";
  77. }
  78. }
  79. mui.init({
  80. swipeBack: false,
  81. beforeback: back
  82. });
  83. function back() {
  84. if (showMenu) {
  85. //菜单处于显示状态,返回键应该先关闭菜单,阻止主窗口执行mui.back逻辑;
  86. closeMenu();
  87. return false;
  88. } else {
  89. //菜单处于隐藏状态,执行返回时,要先close菜单页面,然后继续执行mui.back逻辑关闭主窗口;
  90. menu.close('none');
  91. return true;
  92. }
  93. }
  94. //plusReady事件后,自动创建menu窗口;
  95. mui.plusReady(function() {
  96. main = plus.webview.currentWebview();
  97. //setTimeout的目的是等待窗体动画结束后,再执行create webview操作,避免资源竞争,导致窗口动画不流畅;
  98. setTimeout(function () {
  99. //侧滑菜单默认隐藏,这样可以节省内存;
  100. menu = mui.preload({
  101. id: 'offcanvas-drag-right-plus-menu',
  102. url: 'offcanvas-drag-right-plus-menu.html',
  103. styles: {
  104. left: 0,
  105. width: '70%',
  106. zindex: 9997
  107. }
  108. });
  109. },300);
  110. });
  111. /**
  112. * 显示菜单菜单
  113. */
  114. function openMenu() {
  115. if (!showMenu) {
  116. //侧滑菜单处于隐藏状态,则立即显示出来;
  117. //显示完毕后,根据不同动画效果移动窗体;
  118. menu.show('none', 0, function() {
  119. switch (mode){
  120. case 'main-move':
  121. //主窗体开始侧滑;
  122. main.setStyle({
  123. left: '70%',
  124. transition: {
  125. duration: 150
  126. }
  127. });
  128. break;
  129. case 'menu-move':
  130. menu.setStyle({
  131. left: '0%',
  132. transition: {
  133. duration: 150
  134. }
  135. });
  136. break;
  137. case 'all-move':
  138. main.setStyle({
  139. left: '70%',
  140. transition: {
  141. duration: 150
  142. }
  143. });
  144. menu.setStyle({
  145. left: '0%',
  146. transition: {
  147. duration: 150
  148. }
  149. });
  150. break;
  151. }
  152. });
  153. //显示遮罩
  154. mask.show();
  155. showMenu = true;
  156. }
  157. }
  158. /**
  159. * 关闭侧滑菜单
  160. */
  161. function closeMenu () {
  162. _closeMenu();
  163. //关闭遮罩
  164. mask.close();
  165. }
  166. /**
  167. * 关闭侧滑菜单(业务部分)
  168. */
  169. function _closeMenu() {
  170. if (showMenu) {
  171. //关闭遮罩;
  172. switch (mode){
  173. case 'main-move':
  174. //主窗体开始侧滑;
  175. main.setStyle({
  176. left: '0',
  177. transition: {
  178. duration: 150
  179. }
  180. });
  181. break;
  182. case 'menu-move':
  183. //主窗体开始侧滑;
  184. menu.setStyle({
  185. left: '-70%',
  186. transition: {
  187. duration: 150
  188. }
  189. });
  190. break;
  191. case 'all-move':
  192. //主窗体开始侧滑;
  193. main.setStyle({
  194. left: '0',
  195. transition: {
  196. duration: 150
  197. }
  198. });
  199. //menu页面同时移动
  200. menu.setStyle({
  201. left: '-70%',
  202. transition: {
  203. duration: 150
  204. }
  205. });
  206. break;
  207. }
  208. //等窗体动画结束后,隐藏菜单webview,节省资源;
  209. setTimeout(function() {
  210. menu.hide();
  211. }, 200);
  212. //改变标志位
  213. showMenu = false;
  214. }
  215. }
  216. //变换侧滑动画移动效果;
  217. mui('.mui-input-group').on('change', 'input', function() {
  218. if (this.checked) {
  219. switch (this.value) {
  220. case 'main-move':
  221. //仅主窗口移动的时候,menu页面的zindex值要低一点;
  222. menu.setStyle({left:'0',zindex:9997});
  223. if(mode=='all-move'){
  224. menu.setStyle({
  225. left: '0%'
  226. });
  227. }
  228. mode = 'main-move';
  229. break;
  230. case 'menu-move':
  231. menu.setStyle({left:'-70%',zindex:9999});
  232. if(mode=='all-move'){
  233. menu.setStyle({
  234. left: '0%'
  235. });
  236. }
  237. mode = 'menu-move';
  238. break;
  239. case 'all-move':
  240. //切换为整体移动
  241. //首先改变移动标志
  242. slideTogether = true;
  243. //变换menu界面初始化位置,整体移动时,Menu界面left需要在-70%的地方;
  244. menu.setStyle({
  245. left: '-70%'
  246. });
  247. mode = 'all-move';
  248. break;
  249. }
  250. }
  251. });
  252. //点击左上角图标,打开侧滑菜单;
  253. document.querySelector('.mui-icon-bars').addEventListener('tap', openMenu);
  254. document.getElementById("show-btn").addEventListener('tap',openMenu);
  255. //在android4.4中的swipe事件,需要preventDefault一下,否则触发不正常
  256. //故,在dragleft,dragright中preventDefault
  257. window.addEventListener('dragright', function(e) {
  258. e.detail.gesture.preventDefault();
  259. });
  260. window.addEventListener('dragleft', function(e) {
  261. e.detail.gesture.preventDefault();
  262. });
  263. //主界面向右滑动,若菜单未显示,则显示菜单;否则不做任何操作;
  264. window.addEventListener("swiperight", openMenu);
  265. //主界面向左滑动,若菜单已显示,则关闭菜单;否则,不做任何操作;
  266. window.addEventListener("swipeleft", closeMenu);
  267. //menu页面向左滑动,关闭菜单;
  268. window.addEventListener("menu:swipeleft", closeMenu);
  269. //重写mui.menu方法,Android版本menu按键按下可自动打开、关闭侧滑菜单;
  270. mui.menu = function() {
  271. if (showMenu) {
  272. closeMenu();
  273. } else {
  274. openMenu();
  275. }
  276. }
  277. </script>
  278. </html>