国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 語言 > JavaScript > 正文

HTML+CSS+JS實現完美兼容各大瀏覽器的TABLE固定列

2024-05-06 16:18:44
字體:
來源:轉載
供稿:網友

本文給大家分享的是使用HTML+CSS+JS實現完美兼容各大瀏覽器的TABLE固定列的方法和示例,非常的實用,特別是在BS架構的企業級應用,有需要的小伙伴可以參考下。

BS架構的企業級應用中,當一個表格列數較多時,用戶一個常見的需求就是把前面幾個重要的列固定住,這樣拖動滾動條時固定的列會方便用戶查看數據,用戶體驗很好。一些重量級的JS組件庫也都有這個功能,那么有沒有更簡單的方法實現這個功能呢?

這個需求常見的解決方案是使用表格拼接的方法,這個方案如果要制作靜態的網頁,或者功能簡單的動態頁面,邏輯比較簡單,技術上也不復雜,很容易實現,但是如果要做成組件,動態功能較多的話,就需要寫大量的冗余代碼,難以維護,甚至于一個簡單的功能,都需要寫很多的代碼,比如事件處理等,這個方法就顯得比較笨拙,靈活性很差,不是一個好的方案。

經過長時間的分析研究,各種場景的試驗,我們找到了一個兼容性非常好的解決方案,總體上來講采用的是定位計算的方法,下面貼出代碼,然后做個解讀。

 

 
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
  2. <html xmlns="http://www.w3.org/1999/xhtml"> 
  3. <head> 
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
  5. <title>無標題文檔</title> 
  6. <script type="text/javascript"> 
  7. function divScroll(scrollDiv){ 
  8. var scrollLeft = scrollDiv.scrollLeft; 
  9. document.getElementById("tableDiv_title").scrollLeft = scrollLeft; 
  10. document.getElementById("tableDiv_body").scrollLeft = scrollLeft;  
  11. function divYScroll(scrollYDiv){ 
  12. var scrollTop = scrollYDiv.scrollTop; 
  13. document.getElementById("tableDiv_y").scrollTop = scrollTop;  
  14. function onwheel(event){ 
  15. var evt = event||window.event; 
  16. var bodyDivY = document.getElementById("tableDiv_y"); 
  17. var scrollDivY = document.getElementById("scrollDiv_y"); 
  18. if (bodyDivY.scrollHeight>bodyDivY.offsetHeight){ 
  19. if (evt.deltaY){ 
  20. bodyDivYbodyDivY.scrollTop = bodyDivY.scrollTop + evt.deltaY*7; 
  21. scrollDivYscrollDivY.scrollTop = scrollDivY.scrollTop + evt.deltaY*7; 
  22. }else{ 
  23. bodyDivYbodyDivY.scrollTop = bodyDivY.scrollTop - evt.wheelDelta/5; 
  24. scrollDivYscrollDivY.scrollTop = scrollDivY.scrollTop - evt.wheelDelta/5; 
  25. </script> 
  26. <style type="text/css"> 
  27. body { 
  28. margin:0; 
  29. padding:0; 
  30. table { 
  31. border-collapse:collapse; 
  32. border:0; 
  33. border:none; 
  34.  
  35. table td { 
  36. border:1px solid #000; 
  37. overflow:hidden; 
  38. padding:0 2px; 
  39. </style> 
  40. </head> 
  41. <body> 
  42. <div style="width:500px; position:relative; padding-right:18px;"> 
  43. <div style="position:relative;height:368px;overflow:hidden;width:100%"> 
  44. <div style="padding-left:108px; width:auto; overflow:hidden; background:#f00;" id="tableDiv_title" > 
  45. <table border="0" cellspacing="0" cellpadding="0" > 
  46. <tr> 
  47. <td style="min-width:30px; max-width:30px; left:0; top:0; width:30px; overflow:hidden; background-color:#f00;position:absolute;z-index:1;">000</td> 
  48. <td style="min-width:74px; max-width:74px; left:30px; top:0; width:74px; overflow:hidden; background-color:#f00;position:absolute;z-index:1;">自動表格</td> 
  49. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  50. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  51. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  52. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  53. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  54. <td style="min-width: 100px; max-width: 100px; width: 100px;" >最后一列</td> 
  55. </tr> 
  56. </table> 
  57. </div>  
  58. <div style="overflow:hidden; position:absolute;height:128px; width:100%;" id="tableDiv_y" onmousewheel="onwheel(event);" onwheel="onwheel(event);"> 
  59. <div style="padding-left:108px; width:auto;overflow:hidden;" id="tableDiv_body"> 
  60. <table border="0" cellspacing="0" cellpadding="0" > 
  61. <tr> 
  62. <td style="min-width:30px; max-width:30px; left:0; width:30px; overflow:hidden; background-color:#fff;position:absolute;z-index:1;">001</td> 
  63. <td style="min-width:74px; max-width:74px; left: 30px; width: 74px; overflow:hidden; background-color:#fff;position:absolute;z-index:1;">自動表格</td> 
  64. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  65. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  66. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  67. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  68. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  69. <td style="min-width: 100px; max-width: 100px; width: 100px;" >最后一列</td> 
  70. </tr> 
  71. <tr> 
  72. <td style="min-width:30px; max-width:30px; left:0; width:30px; overflow:hidden; background-color:#fff; position:absolute; z-index:1;">002</td> 
  73. <td style="min-width:74px; max-width:74px; left:30px; width:74px; overflow:hidden;background-color:#fff; position:absolute; z-index:1;">自動表格</td> 
  74. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  75. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  76. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  77. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  78. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  79. <td style="min-width: 100px; max-width: 100px; width: 100px;" >最后一列</td> 
  80. </tr> 
  81. <tr> 
  82. <td style="min-width:30px; max-width:30px; left:0; width:30px; overflow:hidden; background-color:#fff;position:absolute;z-index:1;">003</td> 
  83. <td style="min-width:74px; max-width:74px;left: 30px; width: 74px; overflow:hidden;background-color:#fff;position:absolute;z-index:1;">自動表格</td> 
  84. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  85. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  86. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  87. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  88. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  89. <td style="min-width: 100px; max-width: 100px; width: 100px;" >最后一列</td> 
  90. </tr> 
  91. <tr> 
  92. <td style="min-width:30px; max-width:30px; left:0; width:30px; overflow:hidden; background-color:#fff;position:absolute;z-index:1;">004</td> 
  93. <td style="min-width:74px; max-width:74px; left: 30px; width: 74px; overflow:hidden;background-color:#fff;position:absolute;z-index:1;">自動表格</td> 
  94. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  95. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  96. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  97. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  98. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  99. <td style="min-width: 100px; max-width: 100px; width: 100px;" >最后一列</td> 
  100. </tr> 
  101. <tr> 
  102. <td style="min-width:30px; max-width:30px; left:0; width:30px; overflow:hidden; background-color:#fff;position:absolute;z-index:1;">005</td> 
  103. <td style="min-width:74px; max-width:74px; left: 30px; width: 74px; overflow:hidden;background-color:#fff;position:absolute;z-index:1;">自動表格</td> 
  104. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  105. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  106. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  107. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  108. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  109. <td style="min-width: 100px; max-width: 100px; width: 100px;" >最后一列</td> 
  110. </tr> 
  111. <tr> 
  112. <td style="min-width:30px; max-width:30px; left:0; width:30px; overflow:hidden; background-color:#fff;position:absolute;z-index:1;">006</td> 
  113. <td style="min-width:74px; max-width:74px; left: 30px; width: 74px; overflow:hidden;background-color:#fff;position:absolute;z-index:1;">自動表格</td> 
  114. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  115. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  116. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  117. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  118. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  119. <td style="min-width: 100px; max-width: 100px; width: 100px;" >最后一列</td> 
  120. </tr>  
  121. <tr> 
  122. <td style="min-width:30px; max-width:30px; left:0; width:30px; overflow:hidden; background-color:#fff;position:absolute;z-index:1;">007</td> 
  123. <td style="min-width:74px; max-width:74px; left: 30px; width: 74px; overflow:hidden;background-color:#fff;position:absolute;z-index:1;">自動表格</td> 
  124. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  125. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  126. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  127. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  128. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  129. <td style="min-width: 100px; max-width: 100px; width: 100px;" >最后一列</td> 
  130. </tr> 
  131. <tr> 
  132. <td style="min-width:30px; max-width:30px; left:0; width:30px; overflow:hidden; background-color:#fff;position:absolute;z-index:1;">008</td> 
  133. <td style="min-width:74px; max-width:74px; left: 30px; width: 74px; overflow:hidden;background-color:#fff;position:absolute;z-index:1;">自動表格</td> 
  134. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  135. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  136. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  137. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  138. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  139. <td style="min-width: 100px; max-width: 100px; width: 100px;" >最后一列</td> 
  140. </tr> 
  141. <tr> 
  142. <td style="min-width:30px; max-width:30px; left:0; width:30px; overflow:hidden; background-color:#fff;position:absolute;z-index:1;">009</td> 
  143. <td style="min-width:74px; max-width:74px; left: 30px; width: 74px; overflow:hidden;background-color:#fff;position:absolute;z-index:1;">自動表格</td> 
  144. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  145. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  146. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  147. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  148. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  149. <td style="min-width: 100px; max-width: 100px; width: 100px;" >最后一列</td> 
  150. </tr> 
  151. <tr> 
  152. <td style="min-width:30px; max-width:30px; left:0; width:30px; overflow:hidden; background-color:#fff;position:absolute;z-index:1;">010</td> 
  153. <td style="min-width:74px; max-width:74px; left: 30px; width: 74px; overflow:hidden;background-color:#fff;position:absolute;z-index:1;">自動表格</td> 
  154. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  155. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  156. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  157. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  158. <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td> 
  159. <td style="min-width: 100px; max-width: 100px; width: 100px;" >最后一列</td> 
  160. </tr>  
  161. </table> 
  162. </div>  
  163. </div>  
  164. <div style="background-color:#eee;overflow:hidden;top:150px; width:100%; z-index:2;position:absolute;"> 
  165. <div style="margin-left:108px; width:auto;overflow-x:scroll;overflow-y:hidden;" onscroll='divScroll(this);'> 
  166. <div style="width:630px; height:1px;"></div> 
  167. </div> 
  168. </div> 
  169. </div> 
  170. <div id="scrollDiv_y" style="display:block; overflow-x:hidden; overflow-y:scroll; position:absolute; top:22px; right:0px; height:118px; padding-bottom:10px;" onscroll='divYScroll(this);'> 
  171. <div style="width:1px; height:194px;"></div> 
  172. </div> 
  173. </div> 
  174. </div> 
  175. </body> 
  176. </html> 

一、總體結構:

頁面基本元素為DIV+TABLE,固定的列采用絕對定位的方式固定,每一列都要指定固定寬度,為了解決橫豎滾動條的問題,表頭和表體的外面分別包裹兩層DIV,滾動條采用虛擬的方式,固定在固定位置通過JS控制模擬正常DIV滾動條的效果。

二、定位:

固定的列要絕對定位,通過left屬性控制左側位移,為了保證固定列浮動在上方,設置z-index為1,。為了保證有豎滾動條時的正常顯示,表體的外層DIV為絕對定位,由此導致滾動條也都要絕對定位。還有,表頭和表體以及滾動條的內層DIV通過margin-left屬性控制左側外邊距,把固定列的偏移量空余出來。

二、寬度計算:

每一列的寬度都要指定固定的值,并且要注意一個關鍵點,就是還要加上min-width和max-width屬性,這兩個屬性和width值相等,表頭表體的內層DIV,寬度為auto,自適應表格寬度,外層DIV寬度為100%,最外層的DIV通過padding-right屬性控制右側內邊距,將豎滾動條的位置空余出來。

三、高度計算:

因為絕對定位的存在,整個表格組件的高度要指定,可以通過計算得出,豎滾動條的top值也需要進行計算。

四、滾動條:

本方案一個突出特點,就是虛擬的滾動條,就是通過一個和表格一樣寬、高度為一個像素的DIV模擬出表體DIV的橫向滾動條,豎滾動條同理。之所以采用這個形式,一個是橫向滾動條這樣處理比較美觀,豎滾動條這樣處理之后,表頭和表體的外層DIV寬度不用計算了,都為100%,否則存在滾動條時,表頭和橫向滾動條要空出豎滾動條寬度的位移,否則無法對齊,這個計算倒不復雜,但是某些情況下存在問題,在此不展開了。

五、滾動事件:

因為表體的滾動條都隱藏了,導致鼠標滾輪不起作用了,這樣就需要用JS處理鼠標滾輪事件,本文的樣例代碼兼容常見瀏覽器。這里的重點是同時寫了onmousewheel和onwheel事件,onmousewheel兼容IE,在計算滾動距離時,注意deltaY和wheelDelta屬性的差異即可。

六、優缺點分析:

本文的解決方案已經經過精簡,重點是講清楚原理,在我們的實際中,非常的復雜。這個設計考慮了非常多的兼容性,包括了瀏覽器的兼容性和各種場景的兼容性,如果需求簡單,還有簡化的空間。

這個方案的優點是,如果要做組件的話,因為HTML結構簡單,表頭和表體都是一個TABLE,JS控制代碼非常干凈,維護容易。缺點就是計算過多。我們認為該方案比較適用于開發組件的情況,靜態頁面就有點小題大作了。

以上所述就是本文的全部內容了,希望大家能夠喜歡。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 原阳县| 仪陇县| 廊坊市| 桐乡市| 阿克陶县| 田林县| 琼结县| 贵溪市| 开封县| 贡觉县| 瑞丽市| 武强县| 二连浩特市| 鹿邑县| 泗阳县| 克什克腾旗| 岑溪市| 德兴市| 安多县| 大余县| 弋阳县| 伊春市| 洞头县| 迭部县| 桓台县| 九台市| 北海市| 太白县| 来宾市| 大兴区| 手游| 西乡县| 临泽县| 当涂县| 上林县| 新泰市| 页游| 西盟| 女性| 宜川县| 潮州市|