当前位置: 首页 > Web前端 > HTML

用js和html制作一个固定表头的表格

时间:2023-04-02 16:58:47 HTML

公司有个新需求,就是一个固定表头的表格。查查查查很麻烦,就自己写一个,如第一张图所示,效果很好,因为浏览器窗口变化时,js会计算宽度,而css只设置零件的最小宽度,所以兼容性一定没有问题。首先要明确的是,既然需要固定head,那么head和body就必须分两张表。结构如下

那么问题来了,既然有两个表,它们的td的宽度是由各自的内容决定的,自然如果不人为操作,宽度是一样的是绝对不可能的。既然如此,如果通过同一个对象来管理两个表,那么宽度自然是一样的。先看ts代码内容tabHead:Array=[{title:'operation',property:'checkbox',type:'checkbox',width:''},{title:'序列号',property:'serial',type:'serial',width:''},{title:'InformationType',property:'infoType',type:'special',children:'infoTypeChildren',param:'infoTypeCode',宽度:'',fackItem:'a'},{title:'ServiceName',property:'serviceName',type:'special',children:'serviceChildren',param:'serviceId',width:'',fackItem:'b'},{title:"DataSource",property:'sourceName',type:'special',children:'sourceChildren',param:'dataSourceId',width:'',fackItem:'c'},{标题:"ServiceVersion",property:'serviceVersion',width:''},{title:"ServiceDescription",property:'description',width:''},{title:"注册单元",property:'register',width:''},{title:"注册时间",property:'registerDate',width:''},{title:"服务状态",property:'status',type:'state',width:''},]上面是两个表共享的对象,其他字段可以忽略,直接看title属性width这三个字段再看HTML代码内容{{item.title}}
这是头表的简化代码。使用angular的*ngFor属性,遍历tabHead循环出td,将td的样式宽度设置为tabHead中width的值
同样,这是body形式的简化代码,同样使用angular的*ngFor属性,遍历tabHead循环outtdand设置td的样式宽度为tabHead中width的值。但是在外层增加了一个tableData循环,其字段如下exportclassServiceContentListModel{dataSourceId?:string;sourceChildren?:Array;描述?:字符串;编号?:字符串;信息类型?:字符串;信息类型代码?:字符串;注册?:字符串;注册日期?:字符串;序列号?:数字;服务编号?:字符串;服务名称?:字符串;服务版本?:字符串;来源名称?:字符串;状态?:字符串;noneed?:boolean=false;}也就是说tabHead的属性会对应到tableData的字段,然后在页面上显示相应的。且不说这样的操作,可以想象,两个表中td的宽度是由同一个对象tableHead中的width属性决定的,那么只需要获取body表中每个td的宽度,以及然后将其分配给tabHead即可。//因为我用的是angular,下面的代码有angular的特点,当然道理是一样的,用vue甚至用nativejs稍微修改一下//也可以做到@ViewChild('element')navListElement:ElementRef;//获取tr的dom元素ngAfterViewInit(){//子元素加载完后执行this.setWidth()window.onresize=($event)=>{//子元素加载完后执行this.setWidthbrowserwindowsizechanges()}}setWidth(){setTimeout(()=>{//延迟一个生命周期后,否则页面渲染后表格仍处于未对齐状态if(this.navListElement){letchildren=this.navListElement.nativeElement.children;//获取tr中所有td的集合letwidthSum=0//存储一个tr中所有td的宽度,用于计算每个td的百分比for(leti=0;i