Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Bug Report] 当有一列是fixed时,table显示错位 #4976

Closed
ivan403704409 opened this issue May 20, 2017 · 61 comments
Closed

[Bug Report] 当有一列是fixed时,table显示错位 #4976

ivan403704409 opened this issue May 20, 2017 · 61 comments

Comments

@ivan403704409
Copy link

Element UI version

1.3.3

OS/Browsers version

mac os sierra/chrome 58.0.3029.110 (64-bit)

Vue version

2.3.3

Reproduction Link

https://jsfiddle.net/dqjsk1y2/

Steps to reproduce

https://jsfiddle.net/dqjsk1y2/

往下拉滚动条,到后面的数据,表格上下会有错位

What is Expected?

表格每行都对齐

What is actually happening?

往下拉滚动条,到后面的数据,表格上下会有错位

@SimGenius
Copy link

而且有时候列神奇的就第一列到最后去了

@lifanlingjue
Copy link

我也遇到这个问题了。。。 在线等 挺急的。

@weihongming
Copy link

我也遇到了,很急!!

@Leopoldthecoder
Copy link
Contributor

@liril-net Any thoughts? (To reproduce this, remember to switch show scroll bar to always in system configuration)

@mcdongWang
Copy link

同一样遇到了问题 需要提供什么信息么?

@mcdongWang
Copy link

没人来处理这个问题么? @Leopoldthecoder

@liril-net
Copy link
Contributor

@mcdongWang 在找一个不会影响到其它功能的解决方案

@mcdongWang
Copy link

mcdongWang commented Jun 10, 2017

@liril-net 在 横向 和 纵向滚动条都存在的时候 是否使用鼠标 会 影响 fixed的列头 对滚动高度的判断.

我们大量使用了table组价 而且内容都比较多 所以同时使用了 行 列 固定表头 错位的大小就是滚动条的高度

还有一个问题就是 table 的 height max-height 值 无法使用string 去指向某个css

我看你们的代码 是直接读的数字 然后加上了 'px'

@liril-net
Copy link
Contributor

你是想指定什么样的值?inherit

@mcdongWang
Copy link

@liril-net 指定一个class 让组件通过clss去读啊 我想用calc()

@wooodchen
Copy link

遇到相同的问题。

测试了下,当表格宽度刚好大于父容器一个竖向滚动条的宽度(好像都是17px)内时,会出现这个问题。

目前自己的解决方法:自定义了一个指令,来判断二者的宽度,当小于这个值时,强制将表格宽度减少一个值,可以暂时解决这个问题。

@yangehappy
Copy link

@wooodchen 你好 方便公布下代码吗 现在遇到了同样的问题 十分感谢 祝工作愉快

@geraldlrh
Copy link

没人解决?

@phcloud
Copy link

phcloud commented Sep 5, 2017

ivan403704409 的demo代码现在看已经是正常了的
然而加上show-summary之后,最后几行显示就错位了 https://jsfiddle.net/pointhalo/gkky2vy4/

@furybean
Copy link
Contributor

furybean commented Feb 5, 2018

重现的例子更新到 2.1.0 版本版本后已经无法重现: https://jsfiddle.net/dqjsk1y2/3/

@furybean
Copy link
Contributor

furybean commented Feb 8, 2018

先做关闭处理,如果还会重现,请留言,我会在确认后重开此 issue。

@furybean furybean closed this as completed Feb 8, 2018
@liulukang
Copy link

现在2.7.2版本依然哟这个问题呢,有解决方案了吗?

@baimifan2017
Copy link

各位老哥,有没有解决方案啊!为这事脑袋都弄疼了

@yy0608
Copy link

yy0608 commented Jul 29, 2019

当有fixed属性时,渲染了2个table,设置第二个table水平滚动条就好了(v2.8.2)
.el-table__body-wrapper.is-scrolling-left + .el-table__fixed-right .el-table__fixed-body-wrapper {
overflow-x: scroll;
}

@kaimzhou
Copy link

kaimzhou commented Aug 6, 2019

watch: {
    data() {
      // 对 Table 进行重新布局
      // https://element.eleme.cn/#/zh-CN/component/table#table-methods
      this.$refs.table.doLayout();
    }
  }

@lq9958
Copy link

lq9958 commented Sep 4, 2019

2.10.1版本依然有这个问题,使用this.$refs.table.doLayout()依然不能解决问题

@TY-LIU
Copy link

TY-LIU commented Sep 29, 2019

2.10.1版本依然有这个问题,使用this.$refs.table.doLayout()依然不能解决问题

只需要给你的列设定至少一个或一个以上的min-width就解决了,全部都是设置的width并且超出了列表的宽度,就会出现这个问题。看这个:https://jsfiddle.net/6nobuLqv/10/

@zhengmiaohua
Copy link

而且有时候列神奇的就第一列到最后去了

今天我遇到了这个问题

@anrgct
Copy link

anrgct commented Nov 9, 2020

我在keep-alive组件activated时调用了一下就好了
activated(){ this.$refs.table.doLayout() }

@gezeyou
Copy link

gezeyou commented Jun 8, 2021

测试了以上的,this.$refs.table.doLayout()和settimeout,依旧没用。element版本为2.13.2

@elvis-fxw
Copy link

还没人解决吗?我也找不到有用的办法

@gezeyou
Copy link

gezeyou commented Jun 10, 2021

还没人解决吗?我也找不到有用的办法

我目前用最笨的方案就是动态渲染就不采用固定列,采用固定列就不用动态渲染,而是每个列设置宽度

@whelamc
Copy link

whelamc commented Nov 2, 2021

::v-deep .el-table__body-wrapper.is-scrolling-none + .el-table__fixed-right .el-table__fixed-body-wrapper .el-table__row td .cell span { white-space: nowrap; }

@0x3ff
Copy link

0x3ff commented Nov 10, 2021

目前看到的问题是因为el-table__fixed-right-patch这里默认给了48px的高度,但是浮动列的默认高度为53px,就导致错位了,解决办法是给浮动列设置class-name属性让他统一patch成53px

@whelamc
Copy link

whelamc commented Nov 11, 2021

目前看到的问题是因为el-table__fixed-right-patch这里默认给了48px的高度,但是浮动列的默认高度为53px,就导致错位了,解决办法是给浮动列设置class-name属性让他统一patch成53px

不得行,应该设置不让内容换行

@0x3ff
Copy link

0x3ff commented Dec 14, 2021 via email

@yy0608
Copy link

yy0608 commented Dec 14, 2021 via email

@jzyds
Copy link

jzyds commented Dec 30, 2021

mark

@yy0608
Copy link

yy0608 commented Dec 30, 2021 via email

@Supposer
Copy link

Supposer commented Jan 7, 2022

版本 2.15.7 问题还没解决,
表格设置右侧固定列,当页面足够宽时,此时没有触发固定列;
当切换菜单,再重新切换该页面时,固定列错位。

@xgChange
Copy link

2.15.1版本。
我这边的需求是要动态设置表格高度,并且是固定表头和固定列。
最初显示的时候发现列没有对齐。所以就通过css,分别设置 fixed column那个表格的td, 和非固定table的td。如下面

// 非固定列的table
    ::v-deep .el-table__body-wrapper {
      overflow-x: auto;
      overflow-y: auto;
      table {
        td {
          padding-top: 4px !important;
          padding-bottom: 4px !important;
          height: 48px !important;
          padding-left: 10px !important;
          padding-right: 10px !important;
        }
      }
    }
// 固定列的 table
    ::v-deep .el-table__fixed {
      bottom: 8px !important;
      &::before {
        height: 0;
      }
      table {
        td {
          padding-top: 4px !important;
          padding-bottom: 4px !important;
          height: 48px !important;
          padding-left: 10px !important;
        }
      }
    }

然后当滚动条滚到底部的时候,也发现两边的表格错位。

因为我改了滚动条的样式,滚动条的高度我给了 scrollHeight -> 8
主要是在 重新render的时候,设置 ".el-table__body-wrapper的高度" 等于 ".el-table__fixed-body-wrapper" 的高度

 // 基于element table 封装了一层 fixedTable组件
{
    methods: {
        resetTableHeight() {
            const TableDom = elTableDom?.querySelector('.el-table')
            if (TableDom) {
                this.$nextTick(() => {
                  if (this.isFixedColumn) {
                    setTimeout(() => {
                      const wrapperDomHeight =
                        elTableDom.querySelector('.el-table__body-wrapper')?.getBoundingClientRect()
                          .height || 0
                      const fixedColumnDom = elTableDom.querySelector('.el-table__fixed-body-wrapper')
                      fixedColumnDom.style.height = `${wrapperDomHeight - this.scrollHeight}px` // scrollHeight 是滚动条高度,看情况设置
                    })
                  }
                })
            }
        }
    },
    // 分别在created、 watch -> data 、resizeEvent的时候调用就好了
    watch: {
      data: {
        handler(v) {
          this.$nextTick(() => {
            this.resetTableHeight()
          })
        },
        deep: true,
      },
    },
    created() {
      this.$nextTick(() => {
        this.resetTableHeight()
      })
    }
}

@yy0608
Copy link

yy0608 commented Feb 23, 2022 via email

@Lin3943
Copy link

Lin3943 commented Nov 29, 2022

fixed以后,fixed部分的字段固定了,不会跟随下拉滚动,导致错位,这个问题目前只能动态重新计算fixed的列高跟随滚动,否则只用doLayout()和固定样式也是没法实现的吧

@yy0608
Copy link

yy0608 commented Nov 29, 2022 via email

@smh000809
Copy link

smh000809 commented Dec 12, 2022

我这个可以吗?我的项目面解决了,可以把不需要的代码改了,

解释:如果加了fixed="right" el-table 上会新增一个 class el-table--scrollable-y, 自己项目里面为了美观,可能会重写默认滚动条,拿到默认滚动条的高度 .el-table .el-table__fixed-body-wrapper .el-table__body 新增一个 padding-bottom: 5px; 来解决错位问题。

我遇到了这个问题,发现错位的高度恰巧是默认滚动条的高度呢!

望采纳!

  ::v-deep .el-table {
    border: none;

    &.el-table--scrollable-y .el-table__body-wrapper::-webkit-scrollbar {
      width: 0;
    }

    .el-table__body-wrapper {
      &::-webkit-scrollbar {
        height: 5px; // 重写滚动条高度
      }

      &::-webkit-scrollbar-thumb {
        &:hover {
          background: #409eff;
        }
      }
    }

    .el-table__fixed-body-wrapper .el-table__body {
      padding-bottom: 5px;// 与滚动条高度一致
    }
  }

解决问题前:
image

解决问题后:
image

@smh000809
Copy link

元素界面版

1.3.3

操作系统/浏览器版本

mac os sierra/chrome 58.0.3029.110(64位)

版本

2.3.3

转载链接

https://jsfiddle.net/dqjsk1y2/

重新发现步骤

https://jsfiddle.net/dqjsk1y2/

往下拉滚动条,到后面的数据,表格上下面会有错位

什么是预期?

表格每行都对齐

到底发生了什么?

往下拉滚动条,到后面的数据,表格上下面会有错位

Element UI version

1.3.3

OS/Browsers version

mac os sierra/chrome 58.0.3029.110 (64-bit)

Vue version

2.3.3

Reproduction Link

https://jsfiddle.net/dqjsk1y2/

Steps to reproduce

https://jsfiddle.net/dqjsk1y2/

往下拉滚动条,到后面的数据,表格上下会有错位

What is Expected?

表格每行都对齐

What is actually happening?

往下拉滚动条,到后面的数据,表格上下会有错位

#4976 (comment)

@WangNingning1994
Copy link

Any update?

@yy0608
Copy link

yy0608 commented Apr 24, 2023 via email

@Gaays
Copy link

Gaays commented Apr 27, 2023

@FTZANKE 给了我一些灵感,实现了一个相对通用一些的解决方法

原因:FTZANKE方法的问题是只有数据数量未超出表格高度,没有出现scroll-y时有效,在出现scroll-y时el-table__body的高度是大于外层el-table__body-wrapper的,设置el-table__body的padding-bottom是没有用的,不会撑起两侧的fix table高度。

解决方法:
我们可以给 el-table__fixedel-table__fixed-right 设置padding-bottom,大小与滚动条大小一致,然后再修改内部的 el-table__fixed-body-wrapper 将其高度设置为与 el-table__body-wrapper 高度一致即可。

解决了: 1.横向滚动条被fixed列遮挡。2.修改过滚动条高度导致fix列高度计算异常,表格滑动到底部,fixed列与普通列错位问题。

详细代码内容如下,我的滚动条设置宽高为9px:
style:

.el-table__fixed,
  .el-table__fixed-right {
    height: calc(100% - 9px) !important;  
  }

  // 此处修改右侧fix列样式,防止遮挡y轴滚动条
  &.el-table--scrollable-y {
    .el-table__fixed-right {
      &::before {
        background-color: transparent !important;
      }
      right: 9px !important;
    }
    .el-table__fixed-right-patch {
      width: 9px !important;
    }
  }
}

js部分,通过获取表格表头高度,与el-table__fixed 高度相减即为 el-table__fixed-body-wrapper 高度,这里使用ref因为我的表格组件化了,每个页面可能存在多个表格,通过ref单独修改每个表格内的样式:

setFixedBodyHeight() {
  // 获取当前表头高度
  const tableHeaderDom = this.$refs.tableRef.$el.getElementsByClassName(
    'el-table__header-wrapper'
  );
  let tableHeaderHeight = 0;
  if (tableHeaderDom.length > 0) {
    tableHeaderHeight = tableHeaderDom[0].offsetHeight;
    const style = document.createElement('style');
    style.innerHTML = `#${this.tableId}{.el-table__fixed-body-wrapper{height: calc(100% - ${tableHeaderHeight}px) !important;}}`;
    const script = document.querySelector('script');
    script.parentNode.insertBefore(style, script);
  }
},

image

如果有更好、更优雅的方法,希望可以可以@ 我,如果有什么问题,也希望大家指正

@yy0608
Copy link

yy0608 commented Aug 23, 2023 via email

@cyan0714
Copy link

使用 this.$refs.table.doLayout() 确实可以了. 但是同样两个页面, 每个页面有一列是 fixed, 为什么有些页面会错位而有些页面不会

@yy0608
Copy link

yy0608 commented Dec 28, 2023 via email

@renjie35
Copy link

居然是个历史遗留问题,用this.$refs.table.doLayout()虽然可以,但是页面会刷一下

@yy0608
Copy link

yy0608 commented Jun 17, 2024 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests