用简单的css解决复杂的table布局

470 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情

image.png 【前言】不二小菜鸡很少写这个,大神勿喷啊!!!就是记录一下
大家有没有见过长这样的表格,当初看了原型真想好好表扬下产品。既然上有产品,下就有代码
看起来很简单啊,首先分析一下,这里有三层的嵌套关系,第一层的部门名称,第二层是工作模块,第三层就是指标名称和指标权重了,不难看出啊,就是一个简单的行合并。(说明一下,可以用element-ui里table的行合并去解决,但是不二觉得里面的计算可能复杂一些,所有就用了css去处理了)

          {id: '2',name: '王小虎1',amount1: '2342',amount2: '3.2'},
          {id: '3',name: '王小虎1',amount1: '2343',amount2: '3.2'},
          {id: '4',name: '王小虎2',amount1: '2344',amount2: '3.2'},
          {id: '5',name: '王小虎2',amount1: '2345',amount2: '3.2'},
          {id: '6',name: '王小虎3',amount1: '2346',amount2: '3.2'},
          {id: '7',name: '王小虎3',amount1: '2347',amount2: '3.2'},

使用table就是后台正常返回的数据,像上面这样

image.png 这是使用css布局所需要的数据(不好看啊,可以对照上面的图看),数据结构是这样的,但是后端小朋友会费心一些,哈哈~ 下面是我实现的代码(vue),html部分如下:

                   <div class="tabHead flex alCen">
                       <p class="name name1">部门名称</p>
                       <p class="name name2">工作模块</p>
                       <p class="name name3">指标名称</p>
                       <p class="name name4">指标权重</p>
                   </div>
                   <div class="tabBody" v-if="tableallView.length!=0">
                     <div class="tabBodyItem flex alCen" v-for="(pItem,pIndex) in tableallView" :key="pIndex">
                       <div class="name name1 ellipsis-1" :title="pItem.deptName" @click="toDepDetail(pItem)">{{pItem.deptName}}</div>
                       <div class="classs">
                         <div class="classItem flex alCen" v-for="(item,index) in pItem.workList" :key="index">
                           <p class="title2 name ellipsis-1" :title="item.workModule+'('+item.titlescore+')'">{{item.workModule}}({{item.titlescore}})</p>
                           <div class="list">
                             <div class="item flex alCen" v-for="(zItem,zIndex) in item.titleList" :key="zIndex">
                               <p class="title3 ellipsis-1" :title="zItem.title">{{zItem.title}}</p>
                               <p class="desc">{{zItem.targetWeight}}</p>
                             </div>

                           </div>
                         </div>

                       </div>
                     </div>

                   </div>
                   <div class="nullData flex alCen js-center" v-else>
                     <p>暂无数据</p>
                   </div>

                 </div>

css代码如下:

   .customtable{
     min-width: 858px;
      border-left: 1px solid rgba(51, 51, 51, 0.23);
      border-top: 1px solid rgba(51, 51, 51, 0.23);
      .tabHead{
        border-bottom: 1px solid rgba(51, 51, 51, 0.23);
        background-color: rgba(45, 140, 240, 0.04);
        .name{
          line-height: 40px;
          text-align: center;
          font-size: 14px;
          border-right: 1px solid rgba(51, 51, 51, 0.23);
        }
        .name1{
          width: 200px;
        }
        .name2{
          width: 300px;
        }
        .name3{
          width: 299px;
        }
        .name4{
          flex:1;
        }
      }
      .tabBody{
        border-right: 1px solid rgba(51, 51, 51, 0.23);
        .tabBodyItem{
          font-size: 14px;
          border-bottom: 1px solid rgba(51, 51, 51, 0.23);
          .name1{
            width: 199px;
            cursor: pointer;
          }
          .name{
            text-align: center;
            font-size: 14px;

          }
          .classs{
            flex:1;
            border-left: 1px solid rgba(51, 51, 51, 0.23);
            .classItem{
               border-bottom: 1px solid rgba(51, 51, 51, 0.23);
              .title2{
                width: 299px;
                text-align: center;
                padding: 0 10px;
                box-sizing: border-box;
              }
              .list{
                border-left: 1px solid rgba(51, 51, 51, 0.23);
                flex: 1;
                .item{

                  .title3{
                    width: 299px;
                    text-align: center;
                    line-height: 40px;
                    border-bottom: 1px solid rgba(51, 51, 51, 0.23);
                    border-right: 1px solid rgba(51, 51, 51, 0.23);
                    padding: 0 10px;
                    box-sizing: border-box;
                  }
                  .desc{
                    flex:1;
                    text-align: center;
                    line-height: 40px;

                    border-bottom: 1px solid rgba(51, 51, 51, 0.23);
                  }
                }
                .item:last-child .title3, .item:last-child .desc{
                  border-bottom: none;
                }
              }
            }
            .classItem:last-child{
              border-bottom: none;
            }
          }

        }
      }
      .nullData{
        border-right: 1px solid rgba(51, 51, 51, 0.23);
        border-bottom: 1px solid rgba(51, 51, 51, 0.23);
        line-height: 40px;
        color: #666666;
      }
   }

个人认为这种这种方法也值得记录一下哈,当然,使用element-ui的table也实现了,是:span-method这个方法,有兴趣的同学可以去文档看看。以上是我的分享了,不妨去造一个json数据试试看喽~