offcanvas-drag-left-plus-main.html 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293
  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-right"></a>
  29. <a class="mui-action-back mui-icon mui-icon-back mui-pull-left"></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. <script src="../js/mui.min.js"></script>
  67. <script>
  68. var main,menu, mask = mui.createMask(_closeMenu);
  69. var showMenu = false,
  70. mode = 'main-move';
  71. //整体滑动暂不支持android手机,因为两个页面的移动动画,无法保证同步性;
  72. if (!mui.os.android) {
  73. //整体滑动暂不支持android手机,因为两个页面的移动动画,无法保证同步性;
  74. document.getElementById("move-togger").classList.remove('mui-hidden');
  75. var spans = document.querySelectorAll('.android-only');
  76. for (var i=0,len=spans.length;i<len;i++) {
  77. spans[i].style.display = "none";
  78. }
  79. }
  80. mui.init({
  81. swipeBack: false,
  82. beforeback: back
  83. });
  84. function back() {
  85. if (showMenu) {
  86. //菜单处于显示状态,返回键应该先关闭菜单,阻止主窗口执行mui.back逻辑;
  87. closeMenu();
  88. return false;
  89. } else {
  90. //菜单处于隐藏状态,执行返回时,要先close菜单页面,然后继续执行mui.back逻辑关闭主窗口;
  91. menu.close('none');
  92. return true;
  93. }
  94. }
  95. //plusReady事件后,自动创建menu窗口;
  96. mui.plusReady(function() {
  97. main = plus.webview.currentWebview();
  98. //setTimeout的目的是等待窗体动画结束后,再执行create webview操作,避免资源竞争,导致窗口动画不流畅;
  99. setTimeout(function () {
  100. menu = mui.preload({
  101. id: 'offcanvas-drag-left-plus-menu',
  102. url: 'offcanvas-drag-left-plus-menu.html',
  103. styles: {
  104. left: "30%",
  105. width: '70%',
  106. zindex: 9997
  107. }
  108. });
  109. },300);
  110. });
  111. /*
  112. * 显示菜单菜单
  113. */
  114. function openMenu() {
  115. if (!showMenu) {
  116. //解决android 4.4以下版本webview移动时,导致fixed定位元素错乱的bug;
  117. if (mui.os.android && parseFloat(mui.os.version) < 4.4) {
  118. document.querySelector("header.mui-bar").style.position = "static";
  119. //同时需要修改以下.mui-contnt的padding-top,否则会多出空白;
  120. document.querySelector(".mui-bar-nav~.mui-content").style.paddingTop = "0px";
  121. }
  122. //侧滑菜单处于隐藏状态,则立即显示出来;
  123. //显示完毕后,根据不同动画效果移动窗体;
  124. menu.show('none', 0, function() {
  125. switch (mode){
  126. case 'main-move':
  127. //主窗体开始侧滑;
  128. main.setStyle({
  129. left: '-70%',
  130. transition: {
  131. duration: 150
  132. }
  133. });
  134. break;
  135. case 'menu-move':
  136. menu.setStyle({
  137. left: '30%',
  138. transition: {
  139. duration: 150
  140. }
  141. });
  142. break;
  143. case 'all-move':
  144. main.setStyle({
  145. left: '-70%',
  146. transition: {
  147. duration: 150
  148. }
  149. });
  150. menu.setStyle({
  151. left: '30%',
  152. transition: {
  153. duration: 150
  154. }
  155. });
  156. break;
  157. }
  158. });
  159. //显示主窗体遮罩
  160. mask.show();
  161. showMenu = true;
  162. }
  163. }
  164. function closeMenu () {
  165. //窗体移动
  166. _closeMenu();
  167. //关闭遮罩
  168. mask.close();
  169. }
  170. /**
  171. * 关闭侧滑菜单(业务部分)
  172. */
  173. function _closeMenu() {
  174. if (showMenu) {
  175. //解决android 4.4以下版本webview移动时,导致fixed定位元素错乱的bug;
  176. if (mui.os.android && parseFloat(mui.os.version) < 4.4) {
  177. document.querySelector("header.mui-bar").style.position = "fixed";
  178. //同时需要修改以下.mui-contnt的padding-top,否则会多出空白;
  179. document.querySelector(".mui-bar-nav~.mui-content").style.paddingTop = "44px";
  180. }
  181. switch (mode){
  182. case 'main-move':
  183. //主窗体开始侧滑;
  184. main.setStyle({
  185. left: '0',
  186. transition: {
  187. duration: 150
  188. }
  189. });
  190. break;
  191. case 'menu-move':
  192. //主窗体开始侧滑;
  193. menu.setStyle({
  194. left: '100%',
  195. transition: {
  196. duration: 150
  197. }
  198. });
  199. break;
  200. case 'all-move':
  201. //主窗体开始侧滑;
  202. main.setStyle({
  203. left: '0',
  204. transition: {
  205. duration: 150
  206. }
  207. });
  208. //menu页面同时移动
  209. menu.setStyle({
  210. left: '100%',
  211. transition: {
  212. duration: 150
  213. }
  214. });
  215. break;
  216. }
  217. //等窗体动画结束后,隐藏菜单webview,节省资源;
  218. setTimeout(function() {
  219. menu.hide();
  220. }, 300);
  221. showMenu = false;
  222. }
  223. }
  224. //变换侧滑动画移动效果;
  225. mui('.mui-input-group').on('change', 'input', function() {
  226. if (this.checked) {
  227. switch (this.value) {
  228. case 'main-move':
  229. //仅主窗口移动的时候,menu页面的zindex值要低一点;
  230. menu.setStyle({left:'30%',zindex:9997});
  231. // menu.hide();
  232. mode = 'main-move';
  233. break;
  234. case 'menu-move':
  235. menu.setStyle({left:'100%',zindex:9999});
  236. mode = 'menu-move';
  237. break;
  238. case 'all-move':
  239. //切换为整体移动
  240. //变换menu界面初始化位置,整体移动时,Menu界面left需要在-70%的地方;
  241. menu.setStyle({
  242. left: '100%'
  243. });
  244. mode = 'all-move';
  245. break;
  246. }
  247. }
  248. });
  249. document.getElementById("show-btn").addEventListener('tap',openMenu);
  250. //点击侧滑图标,打开侧滑菜单;
  251. document.querySelector('.mui-action-menu').addEventListener('tap', openMenu);
  252. //在android4.4中的swipe事件,需要preventDefault一下,否则触发不正常
  253. //故,在dragleft,dragright中preventDefault
  254. window.addEventListener('dragright', function(e) {
  255. e.detail.gesture.preventDefault();
  256. });
  257. window.addEventListener('dragleft', function(e) {
  258. e.detail.gesture.preventDefault();
  259. });
  260. //主界面向左滑动,若菜单未显示,则显示菜单;否则不做任何操作;
  261. window.addEventListener("swipeleft", openMenu);
  262. //主界面向右滑动,若菜单已显示,则关闭菜单;否则,不做任何操作;
  263. window.addEventListener("swiperight", closeMenu);
  264. //menu页面向右滑动,关闭菜单;
  265. window.addEventListener("menu:swiperight", closeMenu);
  266. //重写mui.menu方法,Android版本menu按键按下可自动打开、关闭侧滑菜单;
  267. mui.menu = function() {
  268. if (showMenu) {
  269. closeMenu();
  270. } else {
  271. openMenu();
  272. }
  273. }
  274. </script>
  275. </body>
  276. </html>