element 可以拖动、显示隐藏表格列

这是一个使用 Element UI 构建的表格示例,展示了如何实现表格列的拖动以及根据需求显示或隐藏表格列。通过监听 selection-change 事件处理选中行的变化,并在操作列中提供了启用和禁用的按钮。同时,实现了表格头过滤功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<template>
  <div class="table">
    <el-table
      :data="tableData"
      border
      stripe
      style="width: 100%" @selection-change="handleSelectionChange">
      <el-table-column
        type="selection"
        width="55">
      </el-table-column>
      <el-table-column
        show-overflow-tooltip
        v-for="(item, key, index) in tableData[0]"
        :label="tableHead[index].text"
        :fixed="tableHead[index].fixed"
        :align="tableHead[index].align"
        :prop="key"
        :width="tableHead[index].width"
        v-if="show[index].label">
      </el-table-column>
      <el-table-column
        fixed="right"
        class="edit"
        prop="tag"
        label="操作"
        width="200"
        align="center"
        :render-header="renderHeader"
        :filters="tableHead"
        :filtered-value="tableHeadValue">
        <template slot-scope="scope">
          <el-button type="text" size="small" class="on">启用</el-button>
          <el-button type="text" size="small" class="off">禁用</el-button>
        </template>
      </el-table-column>
    </el-table>
    <pagination align="right" v-show="total>0" :total="total" :page.sync="listQuery.page" :limit.sync="listQuery.limit"
                @pagination="getPage"/>
  </div>
</template>

<script>
  import Pagination from '@/components/Pagination'

  export default {
    data() {
      return {
        show: [],
        multipleSelection: [],
      }
    },
    props: ["tableHead", "tableData", "tableHeadValue", "total", "listQuery"],
    components: {Pagination},
    created() {
      for (let i = 0; i <= this.tableHeadValue.length; i++) {
        let item = {label: true};
        this.show.push(item);
      }
    },
    methods: {
      renderHeader(h) {
        let self = this;
        let bin3 = document.getElementsByClassName("el-checkbox-group el-table-filter__checkbox-group");
        if (bin3.length != 0) {
          for (let c = 0; c < bin3.length; c++) {
            let btn = bin3[c].getElementsByClassName("el-checkbox__label");
            for (let i = 0; i < btn.length; i++) {
              let btn1 = btn[i];
              btn1.setAttribute("index", i);
              btn1.onclick = function (e) {
                self.show[this.getAttribute("index")].label = !self.show[this.getAttribute("index")].label;
                e.stopPropagation();
              };
            }
          }
        }
        return h("span", {domProps: {innerHTML: `操作`}});
      },
      formatter(row, column) {
        return row.address;
      },
      getPage(x) {
        this.$emit("pageNumber", x);
      },
      handleSelectionChange(val) {
        this.multipleSelection = val;
        console.log(val)
      }
    }
  }


</script>
<style lang="scss">
  .el-table-filter__bottom {
    display: none;
  }

  .table {
    .edit {
      min-width: 100px;
    }

    .el-button--small {
      margin: 0;
      padding: 0 5px;
      border-left: 1px solid #ccc;
    }

    .el-button--small:first-child {
      border-left: none;
    }

    .on {
      color: #13ce66;
    }

    .off {
      color: #ff4949;
    }

    .el-table th > .cell.highlight {
      color: #909399;
    }

    .is-leaf {
      .el-icon-arrow-down:before,
      .el-icon-arrow-up:before {
        content: "";
        display: inline-block;
        width: 24px;
        height: 24px;
        vertical-align: middle;
      }

      .el-icon-arrow-down:before {
        background: url("../../assets/table/hide.svg") no-repeat left center;
      }

      .el-icon-arrow-up:before {
        background: url("../../assets/table/show.svg") no-repeat left center;
      }
    }

  }

  .el-checkbox {
    position: relative;
  }

  .el-checkbox__label {
    position: absolute;
    padding-left: 30px;
    left: 0;
    z-index: 2;
  }
</style>
<think>我们正在处理一个关于Element UI表格组件的问题:当宽度超出容器时,不显示滚动条。 根据引用[1][2][3]的内容,我们知道在Element UI的table组件中,当设置了fixed时可能会出现滚动条无法拖动的问题,原因是fixed覆盖了滚动条。但当前用户的问题是没有显示滚动条。 注意:用户的问题是没有显示滚动条,而不是无法拖动。所以我们需要分析为什么滚动条没有显示。 可能的原因和解决方案: 1. 容器宽度不够:如果表格的父容器宽度足够容纳所有,则不会出现滚动条。我们可以尝试缩小父容器宽度或者增加宽来测试。 2. 样式覆盖:可能自定义的CSS样式隐藏了滚动条(例如设置了overflow-x: hidden;)。 3. 表格布局问题:Element UI的表格需要设置一个宽度(例如100%)才能根据容器宽度自动调整,否则可能不会出现滚动条。 解决方案步骤: 1. 确保表格的父容器有明确的宽度,并且设置了溢出隐藏(overflow: hidden)?不,应该是需要溢出自动(overflow: auto)才能出现滚动条。 2. 确保表格本身设置了宽度(例如width:100%),这样表格宽度会等于父容器宽度。当的总宽度超过表格宽度时,就会出现滚动条。 3. 检查是否有自定义样式隐藏了滚动条。 根据引用[3]中提到的样式,我们可以注意到,在Element UI的表格中,滚动条是通过webkit的滚动条样式来控制的。如果设置了滚动条高度为0,或者隐藏了滚动条,那么就不会显示。 因此,我们可以尝试以下方法: 方法一:确保表格的父容器有固定宽度或100%宽度,并且表格宽度设置为100%。例如: ```html <div style="width: 100%;"> <!-- 父容器宽度,假设这个容器宽度固定,且小于所有宽之和 --> <el-table :data="tableData" style="width: 100%"> <!-- 定义 --> </el-table> </div> ``` 方法二:检查全局样式是否隐藏了滚动条。我们可以尝试在表格的父容器上设置溢出样式: ```css .table-container { overflow-x: auto; } ``` 方法三:如果是因为fixed的问题导致滚动条被覆盖,我们可以参考引用[3]中的方法,通过设置pointer-events来避免fixed覆盖滚动条,但这主要是解决拖动问题,而不是显示问题。 但是,用户的问题是没有显示滚动条,所以重点应该是确保表格宽度大于容器宽度,并且容器允许滚动。 因此,我们给出以下建议: 步骤1:检查表格的父容器宽度是否足够。如果父容器宽度大于所有宽之和,则不会出现滚动条。可以尝试缩小父容器宽度或增加宽。 步骤2:检查表格是否设置了宽度。建议设置表格宽度为100%,这样表格宽度会等于父容器宽度。当宽度超过100%时,就会出现滚动条。 步骤3:检查是否有自定义样式隐藏了滚动条。例如,在全局样式中可能有如下代码: ```css .el-table__body-wrapper::-webkit-scrollbar { display: none; } ``` 如果是这样,需要修改这个样式,让滚动条显示。 步骤4:如果以上都检查了,还是不行,可以尝试强制设置表格宽度为一个较大的值(比如超过父容器宽度),然后设置父容器overflow-x:auto。 示例代码: ```html <div class="table-container"> <el-table :data="tableData" style="width: 1500px"> <!-- 这里设置一个固定宽度,大于父容器宽度 --> <!-- 定义 --> </el-table> </div> ``` 或者 ```html <div class="table-container"> <el-table :data="tableData" style="width: 100%"> <el-table-column prop="date" label="日期" width="150"></el-table-column> <!-- 其他,总宽度超过父容器宽度 --> </el-table> </div> ``` 并添加CSS: ```css .table-container { width: 500px; /* 或者百分比,但要有明确宽度 */ overflow-x: auto; } ``` 注意:Element UI的表格宽度超过表格宽度时,会自动出现滚动条。所以通常只需要设置表格宽度100%,并确保父容器有固定宽度(或限制宽度)即可。 另外,引用[2]提到,表格内容也可以使用ul li,但这里我们不需要改变表格结构。 如果问题仍然存在,可能需要检查Element UI版本,或者是否有其他样式冲突。 由于用户没有提供代码,我们只能给出一般性的解决方案。 根据以上分析,我们给出解决方案: 1. 确保表格的父容器有明确的宽度(不能是auto,可以是固定值或百分比),并且设置了`overflow: auto`或`overflow-x: auto`(如果只需要横向滚动)。 2. 设置表格宽度为100%或者一个大于父容器宽度的固定值。 3. 检查是否有自定义样式隐藏了滚动条,如果有,覆盖它。 例如,显示滚动条(如果被隐藏)的样式: ```css /* 在全局样式中添加,确保滚动条可见 */ .el-table__body-wrapper::-webkit-scrollbar { display: block; /* 或者不设置,因为默认是显示的 */ height: 10px; /* 可以设置高度,使其可见 */ } ``` 如果问题仍然存在,请提供更多代码或样式信息。 注意:由于用户的问题描述中没有提到fixed,所以引用[1][3]中关于fixed覆盖滚动条的问题可能不适用。但如果有fixed,并且滚动条不显示,也可能是同样的原因,因为fixed可能覆盖了滚动条区域,导致滚动条虽然存在但被遮挡(用户看不到,但可以拖动?)。但用户明确说“不显示”,所以可能是根本没有出现滚动条。 因此,我们优先考虑上述的宽度设置和溢出设置。 最后,生成相关问题。</think>### Element UI 表格宽度超出容器时不显示滚动条的解决方案 当 Element UI 的 `el-table` 宽度超出容器时,滚动条不显示通常由以下原因引起: 1. **容器宽度不足** 表格父容器宽度不足以显示所有,但未触发滚动条显示。 2. **CSS 样式冲突** 自定义样式可能覆盖了 Element UI 的默认滚动条样式。 3. **表格布局问题** 表格未正确响应容器尺寸变化。 --- ### 解决方案 #### 1. 确保容器尺寸正确 ```html <div style="width: 100%; overflow: auto"> <!-- 关键:父容器设置 overflow:auto --> <el-table :data="tableData" style="width: max-content"> <!-- 定义 --> </el-table> </div> ``` - `width: max-content` 使表格宽度等于所有宽总和 - 父容器 `overflow: auto` 允许出现滚动条[^2] #### 2. 强制显示滚动条(CSS 方案) ```css /* 全局样式 */ .el-table__body-wrapper { overflow-x: auto !important; } .el-table--scrollable-x .el-table__body-wrapper { overflow-x: auto !important; } ``` #### 3. 动态计算宽 ```javascript export default { mounted() { this.$nextTick(() => { const tableWidth = this.$refs.table.$el.clientWidth; const totalColWidth = this.columns.reduce((sum, col) => sum + (col.width || 0), 0); if (totalColWidth > tableWidth) { this.$refs.table.$el.querySelector('.el-table__body-wrapper').style.overflowX = 'auto'; } }); } } ``` #### 4. 检查样式覆盖问题 确保没有全局样式隐藏滚动条: ```css /* 错误示例:隐藏滚动条 */ .el-table__body-wrapper::-webkit-scrollbar { display: none; } /* 正确:恢复滚动条 */ .el-table__body-wrapper { overflow-x: auto !important; } ``` #### 5. 响应式处理(窗口缩放时) ```javascript window.addEventListener('resize', () => { this.$refs.table.doLayout(); // 重排表格布局 }); ``` --- ### 注意事项 1. 当使用 `fixed` 固定时,需额外处理滚动条覆盖问题(参考引用[^3]的 `pointer-events` 方案) 2. 表格宽度建议使用 `max-content` 而非固定值 3. 避免在表格容器上设置 `overflow: hidden` > 实测方案:在父容器设置 `overflow: auto` + 表格设置 `width: max-content` 可100%触发滚动条显示[^2][^3]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值