tab-vertical-scroll.html 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  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. <!--标准mui.css-->
  10. <link rel="stylesheet" href="../css/mui.min.css">
  11. <!--App自定义的css-->
  12. <link rel="stylesheet" type="text/css" href="../css/app.css" />
  13. <style>
  14. .mui-row.mui-fullscreen>[class*="mui-col-"] {
  15. height: 100%;
  16. }
  17. .mui-col-xs-3,
  18. .mui-col-xs-9 {
  19. overflow-y: auto;
  20. height: 100%;
  21. }
  22. .mui-segmented-control .mui-control-item {
  23. line-height: 50px;
  24. width: 100%;
  25. }
  26. .mui-control-content {
  27. display: block;
  28. }
  29. .mui-segmented-control.mui-segmented-control-inverted .mui-control-item.mui-active {
  30. background-color: #fff;
  31. }
  32. </style>
  33. </head>
  34. <body>
  35. <header class="mui-bar mui-bar-nav">
  36. <a class="mui-action-back mui-icon mui-icon-left-nav mui-pull-left"></a>
  37. <h1 class="mui-title">侧面选项卡-div模式</h1>
  38. </header>
  39. <div class="mui-content mui-row mui-fullscreen">
  40. <div class="mui-col-xs-3">
  41. <div id="segmentedControls" class="mui-segmented-control mui-segmented-control-inverted mui-segmented-control-vertical">
  42. </div>
  43. </div>
  44. <div id="segmentedControlContents" class="mui-col-xs-9" style="border-left: 1px solid #c8c7cc;">
  45. </div>
  46. </div>
  47. <script src="../js/mui.min.js"></script>
  48. <script>
  49. mui.init({
  50. swipeBack: true //启用右滑关闭功能
  51. });
  52. var controls = document.getElementById("segmentedControls");
  53. var contents = document.getElementById("segmentedControlContents");
  54. var html = [];
  55. var i = 1,
  56. j = 1,
  57. m = 16, //左侧选项卡数量+1
  58. n = 21; //每个选项卡列表数量+1
  59. for (; i < m; i++) {
  60. html.push('<a class="mui-control-item" data-index="' + (i - 1) + '" href="#content' + i + '">选项' + i + '</a>');
  61. }
  62. controls.innerHTML = html.join('');
  63. html = [];
  64. for (i = 1; i < m; i++) {
  65. html.push('<div id="content' + i + '" class="mui-control-content"><ul class="mui-table-view">');
  66. for (j = 1; j < n; j++) {
  67. html.push('<li class="mui-table-view-cell">第' + i + '个选项卡子项-' + j + '</li>');
  68. }
  69. html.push('</ul></div>');
  70. }
  71. contents.innerHTML = html.join('');
  72. //默认选中第一个
  73. controls.querySelector('.mui-control-item').classList.add('mui-active');
  74. // contents.querySelector('.mui-control-content').classList.add('mui-active');
  75. (function() {
  76. var controlsElem = document.getElementById("segmentedControls");
  77. var contentsElem = document.getElementById("segmentedControlContents");
  78. var controlListElem = controlsElem.querySelectorAll('.mui-control-item');
  79. var contentListElem = contentsElem.querySelectorAll('.mui-control-content');
  80. var controlWrapperElem = controlsElem.parentNode;
  81. var controlWrapperHeight = controlWrapperElem.offsetHeight;
  82. var controlMaxScroll = controlWrapperElem.scrollHeight - controlWrapperHeight;//左侧类别最大可滚动高度
  83. var maxScroll = contentsElem.scrollHeight - contentsElem.offsetHeight;//右侧内容最大可滚动高度
  84. var controlHeight = controlListElem[0].offsetHeight;//左侧类别每一项的高度
  85. var controlTops = []; //存储control的scrollTop值
  86. var contentTops = [0]; //存储content的scrollTop值
  87. var length = contentListElem.length;
  88. for (var i = 0; i < length; i++) {
  89. controlTops.push(controlListElem[i].offsetTop + controlHeight);
  90. }
  91. for (var i = 1; i < length; i++) {
  92. var offsetTop = contentListElem[i].offsetTop;
  93. if (offsetTop + 100 >= maxScroll) {
  94. var height = Math.max(offsetTop + 100 - maxScroll, 100);
  95. var totalHeight = 0;
  96. var heights = [];
  97. for (var j = i; j < length; j++) {
  98. var offsetHeight = contentListElem[j].offsetHeight;
  99. totalHeight += offsetHeight;
  100. heights.push(totalHeight);
  101. }
  102. for (var m = 0, len = heights.length; m < len; m++) {
  103. contentTops.push(parseInt(maxScroll - (height - heights[m] / totalHeight * height)));
  104. }
  105. break;
  106. } else {
  107. contentTops.push(parseInt(offsetTop));
  108. }
  109. }
  110. contentsElem.addEventListener('scroll', function() {
  111. var scrollTop = contentsElem.scrollTop;
  112. for (var i = 0; i < length; i++) {
  113. var offsetTop = contentTops[i];
  114. var offset = Math.abs(offsetTop - scrollTop);
  115. // console.log("i:"+i+",scrollTop:"+scrollTop+",offsetTop:"+offsetTop+",offset:"+offset);
  116. if (scrollTop < offsetTop) {
  117. if (scrollTop >= maxScroll) {
  118. onScroll(length - 1);
  119. } else {
  120. onScroll(i - 1);
  121. }
  122. break;
  123. } else if (offset < 20) {
  124. onScroll(i);
  125. break;
  126. }else if(scrollTop >= maxScroll){
  127. onScroll(length - 1);
  128. break;
  129. }
  130. }
  131. });
  132. var lastIndex = 0;
  133. //监听content滚动
  134. var onScroll = function(index) {
  135. if (lastIndex !== index) {
  136. lastIndex = index;
  137. var lastActiveElem = controlsElem.querySelector('.mui-active');
  138. lastActiveElem && (lastActiveElem.classList.remove('mui-active'));
  139. var currentElem = controlsElem.querySelector('.mui-control-item:nth-child(' + (index + 1) + ')');
  140. currentElem.classList.add('mui-active');
  141. //简单处理左侧分类滚动,要么滚动到底,要么滚动到顶
  142. var controlScrollTop = controlWrapperElem.scrollTop;
  143. if (controlScrollTop + controlWrapperHeight < controlTops[index]) {
  144. controlWrapperElem.scrollTop = controlMaxScroll;
  145. } else if (controlScrollTop > controlTops[index] - controlHeight) {
  146. controlWrapperElem.scrollTop = 0;
  147. }
  148. }
  149. };
  150. //滚动到指定content
  151. var scrollTo = function(index) {
  152. contentsElem.scrollTop = contentTops[index];
  153. };
  154. mui(controlsElem).on('tap', '.mui-control-item', function(e) {
  155. scrollTo(this.getAttribute('data-index'));
  156. return false;
  157. });
  158. })();
  159. </script>
  160. </body>
  161. </html>