vue表格實現(xiàn)固定表頭首列

前言

最近在做vue移動端項目蹂匹,需要做一個可以固定表頭首列的表格柄错,而且由于一些原因不能使用任何UI插件开仰,網(wǎng)上找了很久也沒什么好方法渺绒,所以在解決了問題之后幻妓,寫下了這篇文章供后來人參考埠啃,文章有什么錯漏的問題歡迎評論交流坐求。

效果

思路

要實現(xiàn)固定首行首列
除了使用各種UI框架插件外讼载,那就是自己用原生寫啦
首先我們理一下思路
如何固定首行首列呢趴荸?
可能每個人有不同的想法
我這里當(dāng)然介紹的是我自己的想法
那就是把首列表頭和表格主內(nèi)容分割開來儒溉,如下圖
不過這樣雖然固定了表頭首列
但還是不能實現(xiàn)我們想要的效果
因為你會發(fā)現(xiàn)當(dāng)你滑動tbody的時候
表頭和首列并不會移動
相信聰明的你已經(jīng)有了解決的辦法了
那就是給tbody添加一個滑動監(jiān)聽
滑動的時候會觸發(fā)事件
引起表頭和首列的移動
這就是本文固定表頭首列的思路


代碼實現(xiàn)

template:

<template>
    <div class="pages" ref="pages">
        <div class = "content" ref="table">
            <!--首列固定-->           
            <div class = "left-content">                 
                 <div class = "table-head"> 
                      <table class= "full-table">
                            <thead>
                                <tr v-for = "header in tableHeader">
                                    <th class = "firstCol" 
                                        v-for = "(b,index) in header" 
                                        v-if="index==0">
                                        <p>{}</p>
                                  </th>
                                </tr>
                            </thead> 
                      </table>
                  </div>
                  <div class="table-left">
                      <div class = "table"
                           ref="firstColLayer"
                           data-_ref="firstColLayer"
                           >
                         <table class= "full-table"> 
                            <tbody>
                                <tr v-for="row in dataSheet">
                                    <td v-for="(c,index) in row" v-if="index==0">
                                        <p>{{c}}</p>
                                    </td>
                                </tr>
                            </tbody>
                         </table>
                      </div>
                  </div> 
            </div>
            <div class = "right-content" ref="right">
                <!--首行固定-->
                <div class = "table-head"
                     ref="firstRowLayer"
                     data-_ref="firstRowLayer">
                     <table class= "full-table">
                        <thead>
                            <tr v-for = "header in tableHeader">
                                <th
                                    v-for = "(b,index) in header" 
                                    v-if="index!=0 && index!=1"
                                    style="width:101px"
                                    >
                                    <p>{发钝}</p>
                              </th>
                            </tr>
                        </thead>
                     </table>
                </div>
                <!--正常表格內(nèi)容(只有表格內(nèi)容顿涣,沒有表頭和首列)-->
                <div class="table"
                     style="overflow:scroll"
                     ref="tableContainer"
                     @scroll="tableDivScroll($event)"
                     >
                    <table class="content-table">
                        <tbody ref="tbody">
                            <tr v-for="row in dataSheet">
                                <td v-for="(c,index) in row"
                                    v-if="index!=0 && index!=1"
                                    >
                                  <p>{{c}}</p>
                                </td>
                            </tr>
                        </tbody>
                    </table>
                </div>
            </div>
        </div> 
    </div>
</template>

JavaScript:

<script>
    module.exports = (function(that) {
        return {
            data: function(that) {
                const tableHeader = that.dataSheet;
                const dataSheet = that.dataSheet;
                return {
                    dataSheet: dataSheet,
                    tableHeader: tableHeader,
                };
            },
            methods: {
                tableDivScroll (event) {
                    const $target = this.$refs.tableContainer
                    // 首行固定
                    this.$refs.firstRowLayer.scrollLeft = $target.scrollLeft
                    // 首列固定
                    this.$refs.firstColLayer.scrollTop = $target.scrollTop
                },
            //定一個生命周期鉤子監(jiān)聽變動
            mounted:function () {
                let maxHeight = window.screen.height
                document.body.style.overflow='hidden';
                this.$refs.right.style.width=""+this.$refs.table.offsetWidth-107+"px";//這里的減107是減去左側(cè)div寬度
                console.log(this.placeholderTop)
            }
        }
    })(this);
</script>

CSS:

<style scoped>
    body{
        overflow:hidden
    }
    .pages{
        height:100%;
        overflow:hidden;
    }
    .content{
        margin-top:73px;
        margin-left:17px;
        width:100%;
    }
    .left-content{
        width:101px;
        float:left;
    }
    .right-content{
        float:left
    }
    .table-body{
        width:100%;
        overflow:auto;
    }
    .table-head{
        width:100%;
        overflow:hidden;
    }
    .left-content .table-body{
        overflow:hidden;
    }
    .table-left .table{
        height:400px;
        background-color:#FFFFFF;
        overflow:hidden;
        margin-right:0;
        padding-right:0;
    }
    table::-webkit-scrollbar{display:none}
    .content-table th, .full-table th{
        font-size:14px;
        font-family:PingFangSC-Regular;
        background:#EAEFF3;
        font-weight:400;
        color:#176BED;
        height:40px;
        line-height:40px;
        text-align:center;
    }
    .content-table td, .full-table td {
        line-height: 35px;
        text-align: center;
        word-wrap: break-word;
        word-wrap: normal\0;
        overflow: hidden; 
        -o-text-overflow: ellipsis;
        text-overflow: ellipsis;
    }
    th,td p{
      width:101px;
      display: inline-block;
      line-height:14px;
      padding:auto 0;
      margin:auto 0;
      vertical-align: middle;
    }
    .content-table {
        display:block;
        background-color:#FFFFFF;
    }
    thead,tbody{
        background-color:#FFFFFF;
    }
</style>

Ps:有什么問題可以在評論區(qū)一起探討

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市酝豪,隨后出現(xiàn)的幾起案子涛碑,更是在濱河造成了極大的恐慌,老刑警劉巖孵淘,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蒲障,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機揉阎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門庄撮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人余黎,你說我怎么就攤上這事重窟。” “怎么了惧财?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長扭仁。 經(jīng)常有香客問我垮衷,道長,這世上最難降的妖魔是什么乖坠? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任搀突,我火速辦了婚禮,結(jié)果婚禮上熊泵,老公的妹妹穿的比我還像新娘仰迁。我一直安慰自己,他們只是感情好顽分,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布徐许。 她就那樣靜靜地躺著,像睡著了一般卒蘸。 火紅的嫁衣襯著肌膚如雪雌隅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天缸沃,我揣著相機與錄音恰起,去河邊找鬼。 笑死趾牧,一個胖子當(dāng)著我的面吹牛检盼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播翘单,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼吨枉,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了县恕?” 一聲冷哼從身側(cè)響起东羹,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎忠烛,沒想到半個月后属提,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年冤议,在試婚紗的時候發(fā)現(xiàn)自己被綠了斟薇。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡恕酸,死狀恐怖堪滨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情蕊温,我是刑警寧澤袱箱,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站义矛,受9級特大地震影響发笔,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜凉翻,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一了讨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧制轰,春花似錦前计、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至缩滨,卻和暖如春势就,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背脉漏。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工苞冯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人侧巨。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓舅锄,卻偏偏與公主長得像,于是被迫代替她去往敵國和親司忱。 傳聞我的和親對象是個殘疾皇子皇忿,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345