element-ui 表格第一列随滚动自动吸顶

博客记录项目中表格第一列随页面滚动的实现过程。基于Element - UI表格,先解决表格头部合并问题,通过重组数据和平级展示,并添加钩子函数实现。后处理吸顶需求,利用CSS的position: sticky属性,几行代码便达成效果,为类似问题提供思路。

最近项目需求:表格中的第一列在滚动的时候,要随着页面的滚动儿滚动。纠结了半天,解决了。记录下来,看能否给碰到类似问题的朋友,提供一些思路。

效果图

![在这里插入图片描述](https://img-blog.csdnimg.cn/20190712110724580.gif)

问题

  1. 表格头部的合并
  2. 标题随滚动而滚动

解决

  1. 表格基于element-ui,所以先查看的文档,数据结构刚开始是一级对象中存放着第一列的数据,其中有个树形list,对应后几列的数据,如下:
			tableData: [{
                    id: '1',
                    room_number: '12345',
                    room_name: '大会议室',
                    list: [{
                            equmentName: '投影仪',
                            id: '1',
                            type: '2',
                        },
                        {
                            equmentName: '音箱',
                            id: '2',
                            type: '3',
                        },
                    ]
                }]

可是对照api发现,列之间是平级,要合并的话,就要在第一列渲染的时候,加钩子函数,然后将要合并多少行传给方法,于是重组了下数据,将数据平级展示,同时将子元素的数量,添加到第一列的属性中:

	this.dataList.map(v => {
        if (v.list && v.list.length) {
          const list = v.list.map((val, idx) => {
            if (idx == 0) val['rowspan'] = v.list.length
            val['room_number'] = v['room_number'] + v['room_name']
            val['room_id'] = v['id']
            return val
          })
          arr = arr.concat(list)
        }
      })
      //此时数据
      				data:[{
                            equmentName: '投影仪',
                            id: '1',
                            room_id: '1',
                            room_number: '12345_大会议室',
                            rowspan:2,
                            type: '2',
                        },
                        {
                            equmentName: '音箱',
                            id: '2',
                            room_id: '1',
                            room_number: '12345_大会议室',
                            type: '3',
                        },
                    ]

然后给table,添加钩子函数:

<el-table 
	class="testList" 
	:data="tableData" 
	:span-method="objectSpanMethod"
	 border height='500' 
	 style="width: 100%; margin-top: 20px">
 <el-table>
 methods:{
	objectSpanMethod({ row, column, rowIndex, columnIndex }) {
        if (columnIndex === 0) {
             if (row['rowspan']) {
                 return {
                     rowspan: row['rowspan'],
                     colspan: 1
                 };
             } else {
                 return {
                     rowspan: 0,
                     colspan: 0
                 };
             }
         }
     }
}

此时第一列合并成功
2. 吸顶
第一列虽然合并成功,但是在项目中是垂直居中的,如果数据较多,不滚动到中间部分是看不到后边的数据属于哪里的。于是就有了吸顶的需求。吸顶基本属性张鑫旭:position: sticky张大佬已经讲解的非常详细了,我们就直说怎么在表格中实现:

//先给对应的列 增加一个控制css
<el-table-column prop="id" label="ID" width="180" class-name='sticky'>
     <template slot-scope="scope">
         <p>{{ scope.row.id }}</p>
     </template>
 </el-table-column>
.sticky {
    vertical-align: top !important;//为了解决刚开始会定位在中间的问题
 }

 .sticky .cell {
     position: sticky; 
     top: 0;
 }

我也没想到困扰半天的需求,最后会是简单的几行css就实现了。css还是强啊。
demo代码

<el-dialog :title="title" :visible.sync="open" width="1000px" :modal="false" append-to-body> <el-form ref="form" :model="form" :rules="rules" label-width="120px" > <!-- 第一行字段 --> <el-row :gutter="50"> <el-col :span="8"> <el-form-item label="工厂代号" prop="plantNo"> <el-input v-model="form.plantNo" placeholder="请输入工厂代号" @blur="fetchCenterInfo"/> </el-form-item> <el-form-item label="工厂名称" prop="plantName"> <el-input v-model="form.plantName" placeholder="请输入工厂名称" /> </el-form-item> <el-form-item label="产品描述" prop="description"> <el-input v-model="form.description" placeholder="请输入产品描述" /> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label="router版本" prop="routerVersion"> <el-select v-model="form.routerVersion" placeholder="请输入router版本" > <el-option v-for="dict in dict.type.router_version" :key="dict.value" :label="dict.label" :value="dict.value" /> </el-select> </el-form-item> <el-form-item label="产品料号" prop="partNo"> <el-input v-model="form.partNo" placeholder="请输入产品料号" /> </el-form-item> </el-col> <el-col :span="8"> <el-form-item label="旧型号" prop="oldType"> <el-input v-model="form.oldType" placeholder="请输入工厂名称" /> </el-form-item> <el-form-item label="新型号" prop="newType"> <el-input v-model="form.newType" placeholder="请输入工厂名称" /> </el-form-item> </el-col> </el-row> <!-- 第二行字段 --> <!-- 工序列表动态生成 --> <!-- 表格区域优化 --> <div class="process-table"> <!-- 表头列宽优化 --> <div class="table-header"> <div class="col">工序名称</div> <div class="col">英语名称</div> <div class="col">流程卡内容</div> <div class="col">工艺等待时间(h)</div> <div class="col">机器运行时间(H)</div> <div class="col">set_up时间</div> <div class="col">人工时间</div> <div class="col">单位</div> <div class="col">数量</div> <div class="col">router状况</div> <div class="col">工序代码</div> <div class="col">操作</div> </div> <!-- 数据行 - 与表头相同的列宽设置 --> <div v-for="(item, index) in formList" :key="index" class="table-row"> <!-- 名称 --> <div class="col"> <el-form-item> <el-input v-model="item.routerName" placeholder="工序名称" /> </el-form-item> </div> <!-- 英语名称 --> <div class="col"> <el-form-item > <el-input v-model="item.englishName" placeholder="English Name" /> </el-form-item> </div> <!-- 流程卡内容 --> <div class="col"> <el-form-item > <el-input v-model="item.routercont" type="textarea" :autosize="{ minRows: 1, maxRows: 3}" class="scrollable-textarea" /> </el-form-item> </div> <!-- 时间参数组 --> <div class="col"> <el-form-item> <el-input v-model="item.processWatitime" /> </el-form-item> </div> <!-- 运行(H) --> <div class="col"> <el-form-item> <el-input v-model="item.machineRuntime" /> </el-form-item> </div> <!-- set_up --> <div class="col"> <el-form-item> <el-input v-model="item.setuptime" placeholder="min/pcs" /> </el-form-item> </div> <!-- 人工 --> <div class="col"> <el-form-item> <el-input v-model="item.labortime" placeholder="min/pcs" /> </el-form-item> </div> <!-- 单位 --> <div class="col"> <el-form-item> <el-input v-model="item.routerUnit" /> </el-form-item> </div> <!-- 数量 --> <div class="col"> <el-form-item> <el-input v-model="item.quantity" /> </el-form-item> </div> <!-- 状况 --> <div class="col"> <el-form-item> <el-select v-model="item.routerStatus" placeholder="状态"> <el-option v-for="dict in dict.type.router_status" :key="dict.value" :label="dict.label" :value="dict.value" /> </el-select> </el-form-item> </div> <!-- 代码 --> <div class="col"> <el-form-item> <el-input v-model="item.processCode" /> </el-form-item> </div> <!-- 操作 --> <div class="col"> <el-button type="danger" icon="el-icon-delete" circle @click="removeProcess(index)" /> </div> </div> </div> </el-form> <div slot="footer" class="dialog-footer"> <el-button type="primary" @click="submitForm">确 定</el-button> <el-button @click="cancel">取 消</el-button> </div> </el-dialog>添加超出滚动
09-28
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值