亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

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

2019-11-20 12:36:21
字體:
來源:轉載
供稿:網友

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

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

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

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>無標題文檔</title><script type="text/javascript">function divScroll(scrollDiv){  var scrollLeft = scrollDiv.scrollLeft;  document.getElementById("tableDiv_title").scrollLeft = scrollLeft;  document.getElementById("tableDiv_body").scrollLeft = scrollLeft;    }function divYScroll(scrollYDiv){  var scrollTop = scrollYDiv.scrollTop;  document.getElementById("tableDiv_y").scrollTop = scrollTop;  }function onwheel(event){  var evt = event||window.event;  var bodyDivY = document.getElementById("tableDiv_y");  var scrollDivY = document.getElementById("scrollDiv_y");  if (bodyDivY.scrollHeight>bodyDivY.offsetHeight){    if (evt.deltaY){      bodyDivY.scrollTop = bodyDivY.scrollTop + evt.deltaY*7;      scrollDivY.scrollTop = scrollDivY.scrollTop + evt.deltaY*7;    }else{      bodyDivY.scrollTop = bodyDivY.scrollTop - evt.wheelDelta/5;      scrollDivY.scrollTop = scrollDivY.scrollTop - evt.wheelDelta/5;    }  }}</script><style type="text/css">body {margin:0;padding:0;}table {border-collapse:collapse;border:0;border:none;} table td {border:1px solid #000;overflow:hidden;padding:0 2px;}</style></head><body><div style="width:500px; position:relative; padding-right:18px;">  <div style="position:relative;height:368px;overflow:hidden;width:100%">  <div style="padding-left:108px; width:auto; overflow:hidden; background:#f00;" id="tableDiv_title" >  <table border="0" cellspacing="0" cellpadding="0" >   <tr>    <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>    <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>    <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>    <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>    <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>    <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>    <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>    <td style="min-width: 100px; max-width: 100px; width: 100px;" >最后一列</td>   </tr>   </table>   </div>   <div style="overflow:hidden; position:absolute;height:128px; width:100%;" id="tableDiv_y" onmousewheel="onwheel(event);" onwheel="onwheel(event);">    <div style="padding-left:108px; width:auto;overflow:hidden;" id="tableDiv_body">    <table border="0" cellspacing="0" cellpadding="0" >     <tr>      <td style="min-width:30px; max-width:30px; left:0; width:30px; overflow:hidden; background-color:#fff;position:absolute;z-index:1;">001</td>      <td style="min-width:74px; max-width:74px; left: 30px; width: 74px; overflow:hidden; background-color:#fff;position:absolute;z-index:1;">自動表格</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >最后一列</td>     </tr>      <tr>      <td style="min-width:30px; max-width:30px; left:0; width:30px; overflow:hidden; background-color:#fff; position:absolute; z-index:1;">002</td>      <td style="min-width:74px; max-width:74px; left:30px; width:74px; overflow:hidden;background-color:#fff; position:absolute; z-index:1;">自動表格</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >最后一列</td>     </tr>     <tr>      <td style="min-width:30px; max-width:30px; left:0; width:30px; overflow:hidden; background-color:#fff;position:absolute;z-index:1;">003</td>      <td style="min-width:74px; max-width:74px;left: 30px; width: 74px; overflow:hidden;background-color:#fff;position:absolute;z-index:1;">自動表格</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >最后一列</td>     </tr>     <tr>      <td style="min-width:30px; max-width:30px; left:0; width:30px; overflow:hidden; background-color:#fff;position:absolute;z-index:1;">004</td>      <td style="min-width:74px; max-width:74px; left: 30px; width: 74px; overflow:hidden;background-color:#fff;position:absolute;z-index:1;">自動表格</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >最后一列</td>     </tr>      <tr>      <td style="min-width:30px; max-width:30px; left:0; width:30px; overflow:hidden; background-color:#fff;position:absolute;z-index:1;">005</td>      <td style="min-width:74px; max-width:74px; left: 30px; width: 74px; overflow:hidden;background-color:#fff;position:absolute;z-index:1;">自動表格</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >最后一列</td>     </tr>      <tr>      <td style="min-width:30px; max-width:30px; left:0; width:30px; overflow:hidden; background-color:#fff;position:absolute;z-index:1;">006</td>      <td style="min-width:74px; max-width:74px; left: 30px; width: 74px; overflow:hidden;background-color:#fff;position:absolute;z-index:1;">自動表格</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >最后一列</td>     </tr>        <tr>      <td style="min-width:30px; max-width:30px; left:0; width:30px; overflow:hidden; background-color:#fff;position:absolute;z-index:1;">007</td>      <td style="min-width:74px; max-width:74px; left: 30px; width: 74px; overflow:hidden;background-color:#fff;position:absolute;z-index:1;">自動表格</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >最后一列</td>     </tr>      <tr>      <td style="min-width:30px; max-width:30px; left:0; width:30px; overflow:hidden; background-color:#fff;position:absolute;z-index:1;">008</td>      <td style="min-width:74px; max-width:74px; left: 30px; width: 74px; overflow:hidden;background-color:#fff;position:absolute;z-index:1;">自動表格</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >最后一列</td>     </tr>      <tr>      <td style="min-width:30px; max-width:30px; left:0; width:30px; overflow:hidden; background-color:#fff;position:absolute;z-index:1;">009</td>      <td style="min-width:74px; max-width:74px; left: 30px; width: 74px; overflow:hidden;background-color:#fff;position:absolute;z-index:1;">自動表格</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >最后一列</td>     </tr>      <tr>      <td style="min-width:30px; max-width:30px; left:0; width:30px; overflow:hidden; background-color:#fff;position:absolute;z-index:1;">010</td>      <td style="min-width:74px; max-width:74px; left: 30px; width: 74px; overflow:hidden;background-color:#fff;position:absolute;z-index:1;">自動表格</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >56454自動</td>      <td style="min-width: 100px; max-width: 100px; width: 100px;" >最后一列</td>     </tr>          </table>  </div>       </div>    <div style="background-color:#eee;overflow:hidden;top:150px; width:100%; z-index:2;position:absolute;">    <div style="margin-left:108px; width:auto;overflow-x:scroll;overflow-y:hidden;" onscroll='divScroll(this);'>      <div style="width:630px; height:1px;"></div>    </div>  </div>  </div>    <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);'>      <div style="width:1px; height:194px;"></div>     </div>  </div>  </div></body></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控制代碼非常干凈,維護容易。缺點就是計算過多。我們認為該方案比較適用于開發組件的情況,靜態頁面就有點小題大作了。

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久女人电视剧免费播放下载| 亚洲黄色www| 国产大片精品免费永久看nba| 亚洲乱码一区av黑人高潮| 久久精品中文字幕一区| 久久久久久久久亚洲| 波霸ol色综合久久| 亚洲精品视频在线播放| 宅男66日本亚洲欧美视频| 欧美日韩高清区| 欧美影院久久久| 国产午夜精品一区理论片飘花| 国产亚洲激情视频在线| 欧美精品18videos性欧美| 日韩视频亚洲视频| 国产自摸综合网| 亚洲精品国产欧美| 色狠狠久久aa北条麻妃| 另类专区欧美制服同性| 日本久久久久亚洲中字幕| 国产精品户外野外| 国产精品美女主播| 色先锋资源久久综合5566| 欧美激情精品久久久久久| 日韩欧美中文字幕在线播放| 日韩精品中文在线观看| 亚洲色图美腿丝袜| 亚洲va欧美va国产综合剧情| 欧美黑人国产人伦爽爽爽| 亚洲二区中文字幕| 国产成人精品综合| 国产亚洲一级高清| 日韩电影免费在线观看| 国产精品久久不能| 亚洲第一中文字幕在线观看| 黄网站色欧美视频| 国产一区二区av| 国产91在线视频| 欧美成人一区在线| 亚洲aⅴ男人的天堂在线观看| 国产成人福利网站| 91美女高潮出水| 欧美在线www| 国产精品老牛影院在线观看| 欧美亚洲国产日韩2020| 日韩精品久久久久久久玫瑰园| 成人精品久久久| 国模私拍一区二区三区| 国产精品视频内| 国产精品视频永久免费播放| 精品国产31久久久久久| 国产午夜精品视频| 欧美亚洲国产日本| 亚洲区bt下载| 国产91在线视频| 精品日韩美女的视频高清| 国产91热爆ts人妖在线| 欧美成人精品激情在线观看| 亚洲欧美国产日韩天堂区| 日韩精品极品视频免费观看| 亚洲成人久久久久| 亚洲精品国产精品国自产观看浪潮| 菠萝蜜影院一区二区免费| 97国产在线观看| 亚洲国产成人精品久久久国产成人一区| 91精品视频大全| 国产视频亚洲精品| 91社影院在线观看| 国产精品福利无圣光在线一区| 成人午夜黄色影院| 欧美精品成人91久久久久久久| 日本中文字幕不卡免费| 欧美性色19p| 欧美中文字幕精品| 国产精品天天狠天天看| 精品久久久久久久久久ntr影视| 91精品国产91久久久久久不卡| 久久激情五月丁香伊人| 国产精品2018| 2020国产精品视频| 久久精品亚洲热| 久久国产精品免费视频| 91精品国产电影| 欧美日韩亚洲系列| 亚洲va欧美va国产综合剧情| 久久久女女女女999久久| 成人www视频在线观看| 久久精品国产一区二区三区| 国产精品成人观看视频国产奇米| 成人在线中文字幕| 欧美日韩一二三四五区| 久久成人精品电影| 日韩欧美精品免费在线| 成人精品久久一区二区三区| 欧美黄色小视频| 亚洲国产精品成人一区二区| 91精品国产精品| 国产主播在线一区| 国产在线视频91| 成人免费看吃奶视频网站| 91九色在线视频| 精品国产一区二区三区久久狼黑人| 日韩在线播放av| 91精品国产网站| 国产精品久久久久久久久免费看| 高潮白浆女日韩av免费看| 久久大大胆人体| 国产在线观看精品| 97视频在线观看亚洲| 中文字幕亚洲一区二区三区| 操人视频在线观看欧美| 国产精品电影在线观看| 国产一区二区欧美日韩| 国产精品99久久久久久www| 日韩美女在线观看一区| 好吊成人免视频| 亚洲变态欧美另类捆绑| 国产精自产拍久久久久久| 久久av红桃一区二区小说| 日韩专区中文字幕| 奇米一区二区三区四区久久| 国产ts一区二区| 最新国产成人av网站网址麻豆| 国产精品无av码在线观看| 久久综合国产精品台湾中文娱乐网| 9.1国产丝袜在线观看| 伊人久久五月天| 亚洲91精品在线观看| 日韩av电影在线免费播放| 欧美激情精品久久久久久黑人| 久久精品精品电影网| 青青草精品毛片| 夜色77av精品影院| 不卡中文字幕av| 日韩在线视频线视频免费网站| 综合136福利视频在线| 国产欧美日韩91| 久久久精品一区二区| 亚洲精选在线观看| 国产亚洲精品久久久久久777| 国外成人在线播放| 欧美夫妻性视频| 欧美亚洲视频一区二区| 亚洲精品www久久久| 欧美精品一区三区| 久久精品国产69国产精品亚洲| 深夜福利一区二区| 亚洲黄色免费三级| 川上优av一区二区线观看| 久久久999精品视频| 久久久精品久久| 69av成年福利视频| 欧美专区福利在线| 亚洲第一色中文字幕| 亚洲性无码av在线| 国产日韩中文在线| 精品国产一区二区三区久久| 欧美性生交xxxxxdddd| 亚洲色图狂野欧美| 中文字幕亚洲专区| 国产精品日韩在线观看| 亚洲欧美日韩天堂| 日韩久久精品成人| 久久久久中文字幕2018|