移动端网页纯原生js选项卡tab切换

太过爱你忘了你带给我的痛 2022-06-09 08:42 287阅读 0赞
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="maximum-scale=1.0,minimum-scale=1.0,user-scalable=0,width=device-width,initial-scale=1.0"/>
  6. <title>适合移动网页纯原生js选项卡tab切换</title>
  7. <style>
  8. *{ margin: 0; padding: 0}
  9. ul,li{ list-style: none}
  10. .tabClick{ background: #f3f3f3; overflow: hidden}
  11. .tabClick li{ height:40px; line-height: 40px; width: 25%; float: left; text-align: center}
  12. .tabClick li.active{ color: #099; transition: 0.1s; font-weight: bold}
  13. .tabCon{ overflow: hidden}
  14. .tabBox{ position: relative}
  15. .tabList{word-break: break-all; width:100%;float:left; line-height:100px; text-align:center; color:#D3D3D3; font-size:36px; font-family: "Arial Black"}
  16. .lineBorder{ height: 2px; overflow: hidden; border-bottom:1px solid #099; background: #f3f3f3}
  17. .lineDiv{ background: #099; height: 2px; width: 25%;}
  18. </style>
  19. <body>
  20. <!-- 代码部分begin -->
  21. <div class="wrap" id="wrap">
  22. <ul class="tabClick">
  23. <li class="active">Tab1</li>
  24. <li>Tab2</li>
  25. <li>Tab3</li>
  26. <li>Tab4</li>
  27. </ul>
  28. <div class="lineBorder">
  29. <div class="lineDiv"><!--移动的div--></div>
  30. </div>
  31. <div class="tabCon">
  32. <div class="tabBox">
  33. <div class="tabList">
  34. 1</div>
  35. <div class="tabList">
  36. 2</div>
  37. <div class="tabList">
  38. 3</div>
  39. <div class="tabList">
  40. 4</div>
  41. </div>
  42. </div>
  43. </div>
  44. <script charset="utf-8">
  45. window.onload = function (){
  46. var windowWidth = document.body.clientWidth; //window 宽度;
  47. var wrap = document.getElementById('wrap');
  48. var tabClick = wrap.querySelectorAll('.tabClick')[0];
  49. var tabLi = tabClick.getElementsByTagName('li');
  50. var tabBox = wrap.querySelectorAll('.tabBox')[0];
  51. var tabList = tabBox.querySelectorAll('.tabList');
  52. var lineBorder = wrap.querySelectorAll('.lineBorder')[0];
  53. var lineDiv = lineBorder.querySelectorAll('.lineDiv')[0];
  54. var tar = 0;
  55. var endX = 0;
  56. var dist = 0;
  57. tabBox.style.overflow='hidden';
  58. tabBox.style.position='relative';
  59. tabBox.style.width=windowWidth*tabList.length+"px";
  60. for(var i = 0 ;i<tabLi.length; i++ ){
  61. tabList[i].style.width=windowWidth+"px";
  62. tabList[i].style.float='left';
  63. tabList[i].style.float='left';
  64. tabList[i].style.padding='0';
  65. tabList[i].style.margin='0';
  66. tabList[i].style.verticalAlign='top';
  67. tabList[i].style.display='table-cell';
  68. }
  69. for(var i = 0 ;i<tabLi.length; i++ ){
  70. tabLi[i].start = i;
  71. tabLi[i].onclick = function(){
  72. var star = this.start;
  73. for(var i = 0 ;i<tabLi.length; i++ ){
  74. tabLi[i].className='';
  75. };
  76. tabLi[star].className='active';
  77. init.lineAnme(lineDiv,windowWidth/tabLi.length*star)
  78. init.translate(tabBox,windowWidth,star);
  79. endX= -star*windowWidth;
  80. }
  81. }
  82. function OnTab(star){
  83. if(star<0){
  84. star=0;
  85. }else if(star>=tabLi.length){
  86. star=tabLi.length-1
  87. }
  88. for(var i = 0 ;i<tabLi.length; i++ ){
  89. tabLi[i].className='';
  90. };
  91. tabLi[star].className='active';
  92. init.translate(tabBox,windowWidth,star);
  93. endX= -star*windowWidth;
  94. };
  95. tabBox.addEventListener('touchstart',chstart,false);
  96. tabBox.addEventListener('touchmove',chmove,false);
  97. tabBox.addEventListener('touchend',chend,false);
  98. //按下
  99. function chstart(ev){
  100. ev.preventDefault;
  101. var touch = ev.touches[0];
  102. tar=touch.pageX;
  103. tabBox.style.webkitTransition='all 0s ease-in-out';
  104. tabBox.style.transition='all 0s ease-in-out';
  105. };
  106. //滑动
  107. function chmove(ev){
  108. var stars = wrap.querySelector('.active').start;
  109. ev.preventDefault;
  110. var touch = ev.touches[0];
  111. var distance = touch.pageX-tar;
  112. dist = distance;
  113. init.touchs(tabBox,windowWidth,tar,distance,endX);
  114. init.lineAnme(lineDiv,-dist/tabLi.length-endX/4);
  115. };
  116. //离开
  117. function chend(ev){
  118. var str= tabBox.style.transform;
  119. var strs = JSON.stringify(str.split(",",1));
  120. endX = Number(strs.substr(14,strs.length-18));
  121. if(endX>0){
  122. init.back(tabBox,windowWidth,tar,0,0,0.3);
  123. endX=0
  124. }else if(endX<-windowWidth*tabList.length+windowWidth){
  125. endX=-windowWidth*tabList.length+windowWidth
  126. init.back(tabBox,windowWidth,tar,0,endX,0.3);
  127. }else if(dist<-windowWidth/3){
  128. OnTab(tabClick.querySelector('.active').start+1);
  129. init.back(tabBox,windowWidth,tar,0,endX,0.3);
  130. }else if(dist>windowWidth/3){
  131. OnTab(tabClick.querySelector('.active').start-1);
  132. }else{
  133. OnTab(tabClick.querySelector('.active').start);
  134. }
  135. var stars = wrap.querySelector('.active').start;
  136. init.lineAnme(lineDiv,stars*windowWidth/4);
  137. };
  138. };
  139. var init={
  140. translate:function(obj,windowWidth,star){
  141. obj.style.webkitTransform='translate3d('+-star*windowWidth+'px,0,0)';
  142. obj.style.transform='translate3d('+-star*windowWidth+',0,0)px';
  143. obj.style.webkitTransition='all 0.3s ease-in-out';
  144. obj.style.transition='all 0.3s ease-in-out';
  145. },
  146. touchs:function(obj,windowWidth,tar,distance,endX){
  147. obj.style.webkitTransform='translate3d('+(distance+endX)+'px,0,0)';
  148. obj.style.transform='translate3d('+(distance+endX)+',0,0)px';
  149. },
  150. lineAnme:function(obj,stance){
  151. obj.style.webkitTransform='translate3d('+stance+'px,0,0)';
  152. obj.style.transform='translate3d('+stance+'px,0,0)';
  153. obj.style.webkitTransition='all 0.1s ease-in-out';
  154. obj.style.transition='all 0.1s ease-in-out';
  155. },
  156. back:function(obj,windowWidth,tar,distance,endX,time){
  157. obj.style.webkitTransform='translate3d('+(distance+endX)+'px,0,0)';
  158. obj.style.transform='translate3d('+(distance+endX)+',0,0)px';
  159. obj.style.webkitTransition='all '+time+'s ease-in-out';
  160. obj.style.transition='all '+time+'s ease-in-out';
  161. },
  162. }
  163. </script>
  164. <!-- 代码部分end -->
  165. </body>
  166. </html>

发表评论

表情:
评论列表 (有 0 条评论,287人围观)

还没有评论,来说两句吧...

相关阅读

    相关 js 选项切换

    通过按钮来切换div 先将div隐藏,只显示第一个按钮为高亮,将div隐藏显示第一个div 通过js给按钮设置事件,通过点击的是哪一个按钮来设置其可见和高亮 <!